# -*- coding: utf-8 -*- """ (c) 2017 - Copyright Red Hat Inc Authors: Pierre-Yves Chibon """ from __future__ import unicode_literals, absolute_import import unittest import shutil import sys import tempfile import os from mock import patch, MagicMock sys.path.insert(0, os.path.join(os.path.dirname( os.path.abspath(__file__)), '..')) import pagure import pagure.lib.query import tests class PagureFlaskGiveRepotests(tests.SimplePagureTest): """ Tests for give a project on pagure """ def setUp(self): """ Set up the environnment, ran before every tests. """ super(PagureFlaskGiveRepotests, self).setUp() pagure.config.config['VIRUS_SCAN_ATTACHMENTS'] = False pagure.config.config['UPLOAD_FOLDER_URL'] = '/releases/' pagure.config.config['UPLOAD_FOLDER_PATH'] = os.path.join( self.path, 'releases') tests.create_projects(self.session) tests.create_projects_git(os.path.join(self.path, 'repos'), bare=True) self._check_user(user='pingou') def _check_user(self, user='pingou'): self.session.commit() project = pagure.lib.query.get_authorized_project( self.session, project_name='test') self.assertEqual(project.user.user, user) def test_give_project_no_project(self): """ Test the give_project endpoint. """ # No such project output = self.app.post('/test42/give') self.assertEqual(output.status_code, 404) def test_give_project_no_csrf(self): """ Test the give_project endpoint. """ user = tests.FakeUser() user.username = 'pingou' with tests.user_set(self.app.application, user): self._check_user() # Missing CSRF data = { 'user': 'foo', } output = self.app.post( '/test/give', data=data, follow_redirects=True) self.assertEqual(output.status_code, 200) self.assertIn( 'Overview - test - Pagure', output.get_data(as_text=True)) self._check_user() def test_give_project_invalid_user(self): """ Test the give_project endpoint. """ user = tests.FakeUser() user.username = 'pingou' with tests.user_set(self.app.application, user): csrf_token = self.get_csrf() self._check_user() # Invalid user data = { 'user': 'foobar', 'csrf_token': csrf_token, } output = self.app.post( '/test/give', data=data, follow_redirects=True) self.assertEqual(output.status_code, 404) self.assertIn( '

No such user foobar found

', output.get_data(as_text=True)) self._check_user() def test_give_project_no_user(self): """ Test the give_project endpoint. """ user = tests.FakeUser() user.username = 'pingou' with tests.user_set(self.app.application, user): csrf_token = self.get_csrf() self._check_user() # No user data = { 'csrf_token': csrf_token, } output = self.app.post( '/test/give', data=data, follow_redirects=True) self.assertEqual(output.status_code, 404) self.assertIn('

No user specified

', output.get_data(as_text=True)) self._check_user() def test_give_project_not_owner(self): """ Test the give_project endpoint. """ user = tests.FakeUser() user.username = 'foo' with tests.user_set(self.app.application, user): csrf_token = self.get_csrf() self._check_user() # User isn't the admin data = { 'user': 'foo', 'csrf_token': csrf_token, } output = self.app.post( '/test/give', data=data, follow_redirects=True) self.assertEqual(output.status_code, 403) self.assertIn( '

You are not allowed to change the settings for this ' 'project

', output.get_data(as_text=True)) self._check_user() def test_give_project_not_admin(self): """ Test the give_project endpoint. """ user = tests.FakeUser() user.username = 'foo' with tests.user_set(self.app.application, user): csrf_token = self.get_csrf() self._check_user() # User isn't the admin data = { 'user': 'foo', 'csrf_token': csrf_token, } output = self.app.post( '/test/give', data=data, follow_redirects=True) self.assertEqual(output.status_code, 403) self.assertIn( '

You are not allowed to change the settings for this ' 'project

', output.get_data(as_text=True)) self._check_user() def test_give_project_not_owner_but_is_admin(self): """ Test the give_project endpoint. """ project = pagure.lib.query.get_authorized_project( self.session, project_name='test') msg = pagure.lib.query.add_user_to_project( self.session, project=project, new_user='foo', user='pingou', access='admin') self.session.commit() self.assertEqual(msg, 'User added') user = tests.FakeUser() user.username = 'foo' with tests.user_set(self.app.application, user): csrf_token = self.get_csrf() self._check_user() # User isn't the owner data = { 'user': 'foo', 'csrf_token': csrf_token, } output = self.app.post( '/test/give', data=data, follow_redirects=True) self.assertEqual(output.status_code, 403) self.assertIn( '

You are not allowed to give this project

', output.get_data(as_text=True)) self._check_user() @patch.dict('pagure.config.config', {'PAGURE_ADMIN_USERS': 'foo'}) @patch('pagure.lib.git.generate_gitolite_acls', MagicMock()) def test_give_project_not_owner_but_admin(self): """ Test the give_project endpoint. Test giving a project when the person giving the project is a pagure admin (instance wide admin) but not a project admin. """ user = tests.FakeUser() user.username = 'foo' user.cla_done = True user.groups = ['foo'] with tests.user_set(self.app.application, user): csrf_token = self.get_csrf() self._check_user() # User isn't the owner but is an instance admin data = { 'user': 'foo', 'csrf_token': csrf_token, } output = self.app.post( '/test/give', data=data, follow_redirects=True) self.assertEqual(output.status_code, 200) self.assertIn( 'The project has been ' 'transferred to foo', output.get_data(as_text=True)) self._check_user('foo') @patch.dict('pagure.config.config', {'PAGURE_ADMIN_USERS': 'foo'}) @patch('pagure.lib.git.generate_gitolite_acls', MagicMock()) def test_give_project(self): """ Test the give_project endpoint. """ user = tests.FakeUser() user.username = 'pingou' with tests.user_set(self.app.application, user): csrf_token = self.get_csrf() self._check_user() # All good data = { 'user': 'foo', 'csrf_token': csrf_token, } output = self.app.post( '/test/give', data=data, follow_redirects=True) self.assertEqual(output.status_code, 200) self.assertIn( 'The project has been ' 'transferred to foo', output.get_data(as_text=True)) self._check_user('foo') # Make sure that the user giving the project is still an admin project = pagure.lib.query.get_authorized_project( self.session, project_name='test') self.assertEqual(len(project.users), 1) self.assertEqual(project.users[0].user, 'pingou') @patch.dict('pagure.config.config', {'PAGURE_ADMIN_USERS': 'foo'}) @patch('pagure.lib.git.generate_gitolite_acls', MagicMock()) def test_give_project_already_user(self): """ Test the give_project endpoint when the new main_admin is already a committer on the project. """ project = pagure.lib.query._get_project(self.session, 'test') pagure.lib.query.add_user_to_project( self.session, project, new_user='foo', user='pingou', access='commit' ) self.session.commit() user = tests.FakeUser() user.username = 'pingou' with tests.user_set(self.app.application, user): csrf_token = self.get_csrf() self._check_user() # All good data = { 'user': 'foo', 'csrf_token': csrf_token, } output = self.app.post( '/test/give', data=data, follow_redirects=True) self.assertEqual(output.status_code, 200) self.assertIn( 'The project has been ' 'transferred to foo', output.get_data(as_text=True)) self._check_user('foo') # Make sure that the user giving the project is still an admin project = pagure.lib.query.get_authorized_project( self.session, project_name='test') self.assertEqual(len(project.users), 1) self.assertEqual(project.users[0].user, 'pingou') @patch.dict('pagure.config.config', {'REQUIRED_GROUPS': {'*': ['packager']}}) @patch.dict('pagure.config.config', {'PAGURE_ADMIN_USERS': 'foo'}) @patch('pagure.lib.git.generate_gitolite_acls', MagicMock()) def test_give_project_not_in_required_group(self): """ Test the give_project endpoint. """ user = tests.FakeUser() user.username = 'pingou' with tests.user_set(self.app.application, user): csrf_token = self.get_csrf() self._check_user() # User not a packager data = { 'user': 'foo', 'csrf_token': csrf_token, } output = self.app.post( '/test/give', data=data, follow_redirects=True) self.assertEqual(output.status_code, 200) self.assertIn( ' This user must be in one of the following groups to ' 'be allowed to be added to this project: packager', output.get_data(as_text=True)) self._check_user(user='pingou') @patch.dict('pagure.config.config', {'REQUIRED_GROUPS': {'*': ['packager']}}) @patch.dict('pagure.config.config', {'PAGURE_ADMIN_USERS': 'foo'}) @patch('pagure.lib.git.generate_gitolite_acls', MagicMock()) def test_give_project_in_required_group(self): """ Test the give_project endpoint. """ # Create the packager group msg = pagure.lib.query.add_group( self.session, group_name='packager', display_name='packager group', description=None, group_type='user', user='pingou', is_admin=False, blacklist=[], ) self.session.commit() self.assertEqual(msg, 'User `pingou` added to the group `packager`.') # Add foo to the packager group group = pagure.lib.query.search_groups(self.session, group_name='packager') msg = pagure.lib.query.add_user_to_group( self.session, username='foo', group=group, user='pingou', is_admin=False, ) self.session.commit() self.assertEqual(msg, 'User `foo` added to the group `packager`.') # pingou transferts test to foo user = tests.FakeUser() user.username = 'pingou' with tests.user_set(self.app.application, user): csrf_token = self.get_csrf() self._check_user() # User not a packager data = { 'user': 'foo', 'csrf_token': csrf_token, } output = self.app.post( '/test/give', data=data, follow_redirects=True) self.assertEqual(output.status_code, 200) self.assertIn( ' The project has been transferred to foo', output.get_data(as_text=True)) self._check_user('foo') # Make sure that the user giving the project is still an admin project = pagure.lib.query.get_authorized_project( self.session, project_name='test') self.assertEqual(len(project.users), 1) self.assertEqual(project.users[0].user, 'pingou') if __name__ == '__main__': unittest.main(verbosity=2)