From f18bc4a6f98fe0e242f52e77151bf8b3e425b636 Mon Sep 17 00:00:00 2001 From: Clement Verna Date: Jul 03 2017 18:39:36 +0000 Subject: [PATCH 1/7] Move the unit test related to pagure.lib search_projects methods to their own module. Signed-off-by: Clement Verna --- diff --git a/tests/lib/__init__.py b/tests/lib/__init__.py new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/tests/lib/__init__.py diff --git a/tests/lib/test_pagure_lib_search_projects.py b/tests/lib/test_pagure_lib_search_projects.py new file mode 100644 index 0000000..338ae77 --- /dev/null +++ b/tests/lib/test_pagure_lib_search_projects.py @@ -0,0 +1,236 @@ +import unittest + +import tests +import pagure.lib + + +class PagureLibtests_search_projects(tests.Modeltests): + """ + Test the pagure.lib search_projects() method + """ + + def setUp(self): + super(PagureLibtests_search_projects, self).setUp() + tests.create_projects(self.session) + + def test_search_projects_all(self): + """ + Test the method returns all the projects for the given session + """ + + projects = pagure.lib.search_projects(self.session) + self.assertEqual(len(projects), 3) + self.assertEqual(projects[0].id, 1) + self.assertEqual(projects[1].id, 2) + + def test_search_projects_username(self): + """ + Test the method returns all the projects for the given username + """ + projects = pagure.lib.search_projects(self.session, username='foo') + self.assertEqual(len(projects), 0) + + projects = pagure.lib.search_projects(self.session, username='pingou') + self.assertEqual(len(projects), 3) + self.assertEqual(projects[0].id, 1) + self.assertEqual(projects[1].id, 2) + + def test_search_projects_start(self): + """ + Test the method returns all the projects for the given start + """ + projects = pagure.lib.search_projects(self.session, start=1) + self.assertEqual(len(projects), 2) + self.assertEqual(projects[0].id, 2) + + def test_search_projects_limit(self): + """ + Test the method returns all the projects for the given limit + """ + projects = pagure.lib.search_projects(self.session, limit=1) + self.assertEqual(len(projects), 1) + self.assertEqual(projects[0].id, 1) + + def test_search_projects_count(self): + """ + Test the method returns the count of the projects + """ + projects = pagure.lib.search_projects(self.session, count=True) + self.assertEqual(projects, 3) + + def test_search_projects_commit_access(self): + """ + Test the method returns the project of user with only commit access + """ + # Also check if the project shows up if a user doesn't + # have admin access in the project + # Check with commit access first + project = pagure.get_authorized_project(self.session, project_name='test') + msg = pagure.lib.add_user_to_project( + self.session, + project=project, + new_user='foo', + user='pingou', + access='commit' + ) + + self.assertEqual(msg, 'User added') + self.session.commit() + projects = pagure.lib.search_projects(self.session, username='foo') + self.assertEqual(len(projects), 1) + + def test_search_projects_ticket_access(self): + """ + Test the method does not returns the project of user with only ticket access + """ + # Now check with only ticket access + project = pagure.get_authorized_project(self.session, project_name='test') + msg = pagure.lib.add_user_to_project( + self.session, + project=project, + new_user='foo', + user='pingou', + access='ticket' + ) + self.assertEqual(msg, 'User added') + self.session.commit() + projects = pagure.lib.search_projects(self.session, username='foo') + self.assertEqual(len(projects), 0) + + def test_search_project_forked(self): + """ + Test the search_project for forked projects in pagure.lib. + """ + + # Create two forked repo + item = pagure.lib.model.Project( + user_id=2, # foo + name='test', + description='test project #1', + is_fork=True, + parent_id=1, + hook_token='aaabbbttt', + ) + self.session.add(item) + + item = pagure.lib.model.Project( + user_id=2, # foo + name='test2', + description='test project #2', + is_fork=True, + parent_id=2, + hook_token='aaabbbuuu', + ) + self.session.add(item) + + # Since we have two forks, let's search them + projects = pagure.lib.search_projects(self.session, fork=True) + self.assertEqual(len(projects), 2) + projects = pagure.lib.search_projects(self.session, fork=False) + self.assertEqual(len(projects), 3) + + def test_search_projects_private(self): + """ + Test the method for private projects + """ + + item = pagure.lib.model.Project( + user_id=1, # pingou + name='private_test', + description='Private test project #1', + hook_token='aaabbbcccpp', + ) + self.session.add(item) + self.session.commit() + + projects = pagure.lib.search_projects(self.session) + self.assertEqual(len(projects), 4) + self.assertEqual( + [p.path for p in projects], + ['private_test.git', 'test.git', 'test2.git', + 'somenamespace/test3.git'] + ) + + projects = pagure.lib.search_projects( + self.session, username='pingou') + self.assertEqual(len(projects), 4) + self.assertEqual( + [p.path for p in projects], + ['private_test.git', 'test.git', 'test2.git', + 'somenamespace/test3.git'] + ) + + projects = pagure.lib.search_projects( + self.session, username='pingou', private='pingou') + self.assertEqual(len(projects), 4) + self.assertEqual( + [p.path for p in projects], + ['private_test.git', 'test.git', 'test2.git', + 'somenamespace/test3.git'] + ) + + projects = pagure.lib.search_projects( + self.session, username='pingou', private='foo') + self.assertEqual(len(projects), 0) + + def test_search_projects_tags(self): + """ + Test the method returns all the projects for the given tags + """ + + # Add tags to the project + project = pagure.lib._get_project(self.session, 'test') + tag = pagure.lib.model.Tag( + tag='fedora' + ) + self.session.add(tag) + self.session.commit() + tp = pagure.lib.model.TagProject( + project_id=project.id, + tag='fedora' + ) + self.session.add(tp) + self.session.commit() + + projects = pagure.lib.search_projects( + self.session, tags='fedora') + self.assertEqual(len(projects), 1) + self.assertEqual(projects[0].path, 'test.git') + + def test_search_projects_pattern(self): + """ + Test the method returns all the projects for the given pattern + """ + + projects = pagure.lib.search_projects( + self.session, pattern='test*') + self.assertEqual(len(projects), 3) + self.assertEqual( + [p.path for p in projects], + ['test.git', 'test2.git', 'somenamespace/test3.git'] + ) + + def test_search_projects_sort(self): + """ + Test the method returns all the projects sorted by lastest and oldest + """ + + projects = pagure.lib.search_projects( + self.session, pattern='*', sort='latest') + self.assertEqual(len(projects), 3) + self.assertEqual( + [p.path for p in projects], + ['somenamespace/test3.git', 'test2.git', 'test.git'] + ) + + projects = pagure.lib.search_projects( + self.session, pattern='*', sort='oldest') + self.assertEqual(len(projects), 3) + self.assertEqual( + [p.path for p in projects], + ['test.git', 'test2.git', 'somenamespace/test3.git'] + ) + + +if __name__ == '__main__': + unittest.main(verbosity=2) From 7525b3c89a28b729e1bcd28deee3b162a4b95fa0 Mon Sep 17 00:00:00 2001 From: Clement Verna Date: Jul 03 2017 18:39:36 +0000 Subject: [PATCH 2/7] Move the unit test related to pagure.lib search_user methods to their own module. Signed-off-by: Clement Verna --- diff --git a/tests/lib/test_pagure_lib_search_user.py b/tests/lib/test_pagure_lib_search_user.py new file mode 100644 index 0000000..af0a8a0 --- /dev/null +++ b/tests/lib/test_pagure_lib_search_user.py @@ -0,0 +1,123 @@ +import unittest + +import tests +import pagure.lib + + +class PagureLibtests_search_user(tests.Modeltests): + """ + Test the pagure.lib search_user() method + """ + + def test_search_user_all(self): + """ + Test the method returns all the users for the given session + """ + + # Retrieve all users + items = pagure.lib.search_user(self.session) + self.assertEqual(2, len(items)) + self.assertEqual(2, items[0].id) + self.assertEqual('foo', items[0].user) + self.assertEqual('foo', items[0].username) + self.assertEqual([], items[1].groups) + self.assertEqual(1, items[1].id) + self.assertEqual('pingou', items[1].user) + self.assertEqual('pingou', items[1].username) + self.assertEqual([], items[1].groups) + + def test_search_user_username(self): + """ + Test the method returns the user for a given username + """ + + # Retrieve user by username + item = pagure.lib.search_user(self.session, username='foo') + self.assertEqual('foo', item.user) + self.assertEqual('foo', item.username) + self.assertEqual([], item.groups) + + item = pagure.lib.search_user(self.session, username='bar') + self.assertEqual(None, item) + + def test_search_user_email(self): + """ + Test the method returns a user for a given email address + """ + + # Retrieve user by email + item = pagure.lib.search_user(self.session, email='foo@foo.com') + self.assertEqual(None, item) + + item = pagure.lib.search_user(self.session, email='foo@bar.com') + self.assertEqual('foo', item.user) + self.assertEqual('foo', item.username) + self.assertEqual([], item.groups) + self.assertEqual( + ['foo@bar.com'], [email.email for email in item.emails]) + + item = pagure.lib.search_user(self.session, email='foo@pingou.com') + self.assertEqual('pingou', item.user) + self.assertEqual( + sorted(['bar@pingou.com', 'foo@pingou.com']), + sorted([email.email for email in item.emails])) + + def test_search_user_token(self): + """ + Test the method returns a user for a given token + """ + + # Retrieve user by token + item = pagure.lib.search_user(self.session, token='aaa') + self.assertEqual(None, item) + + item = pagure.lib.model.User( + user='pingou2', + fullname='PY C', + token='aaabbb', + default_email='bar@pingou.com', + ) + self.session.add(item) + self.session.commit() + + item = pagure.lib.search_user(self.session, token='aaabbb') + self.assertEqual('pingou2', item.user) + self.assertEqual('PY C', item.fullname) + + def test_search_user_pattern(self): + """ + Test the method returns a user for a given pattern + """ + + # Retrieve user by pattern + item = pagure.lib.search_user(self.session, pattern='a*') + self.assertEqual([], item) + + item = pagure.lib.model.User( + user='pingou2', + fullname='PY C', + token='aaabbb', + default_email='bar@pingou.com', + ) + self.session.add(item) + self.session.commit() + + items = pagure.lib.search_user(self.session, pattern='p*') + self.assertEqual(2, len(items)) + self.assertEqual(1, items[0].id) + self.assertEqual('pingou', items[0].user) + self.assertEqual('pingou', items[0].username) + self.assertEqual([], items[0].groups) + self.assertEqual( + sorted(['bar@pingou.com', 'foo@pingou.com']), + sorted([email.email for email in items[0].emails])) + self.assertEqual(3, items[1].id) + self.assertEqual('pingou2', items[1].user) + self.assertEqual('pingou2', items[1].username) + self.assertEqual([], items[1].groups) + self.assertEqual( + [], [email.email for email in items[1].emails]) + + +if __name__ == '__main__': + unittest.main(verbosity=2) From cd6f9b468128e519667255acc8e3e1fb24e8ce32 Mon Sep 17 00:00:00 2001 From: Clement Verna Date: Jul 03 2017 18:39:36 +0000 Subject: [PATCH 3/7] Move the unit tests related to new, edit, add and update issues methods to their own module. Signed-off-by: Clement Verna --- diff --git a/tests/lib/test_pagure_lib_issues.py b/tests/lib/test_pagure_lib_issues.py new file mode 100644 index 0000000..d7491e2 --- /dev/null +++ b/tests/lib/test_pagure_lib_issues.py @@ -0,0 +1,934 @@ +import unittest + +import tests +import pagure.lib + + +class PagureLibtests_new_issue(tests.Modeltests): + """ + Test the pagure.lib new_issue() method + """ + + def setUp(self): + super(PagureLibtests_new_issue, self).setUp() + + tests.create_projects(self.session) + self.repo = pagure.lib._get_project(self.session, 'test') + # Set some priorities to the project + self.repo.priorities = {'1': 'High', '2': 'Normal'} + self.session.add(self.repo) + self.session.commit() + + issues = pagure.lib.search_issues(self.session, self.repo) + self.assertEqual(len(issues), 0) + self.assertEqual(self.repo.open_tickets, 0) + self.assertEqual(self.repo.open_tickets_public, 0) + + def test_new_issue_wrong_user(self): + """ + Test the method fails for a wrong user. + """ + + # See where it fails + self.assertRaises( + pagure.exceptions.PagureException, + pagure.lib.new_issue, + session=self.session, + repo=self.repo, + title='Test issue', + content='We should work on this', + user='blah', + ticketfolder=None + ) + + def test_new_issue_wrong_priority(self): + """ + Test the method fails for a non existing priority. + """ + + self.assertRaises( + pagure.exceptions.PagureException, + pagure.lib.new_issue, + session=self.session, + repo=self.repo, + title='Test issue', + content='We should work on this', + user='pingou', + ticketfolder=None, + priority=0, + ) + + def test_new_issue_success(self): + """ + Test the method sucessfully creates 2 issues. + """ + # Add an extra user to project `foo` + repo = pagure.lib._get_project(self.session, 'test') + msg = pagure.lib.add_user_to_project( + session=self.session, + project=repo, + new_user='foo', + user='pingou' + ) + self.session.commit() + self.assertEqual(msg, 'User added') + + # Try adding again this extra user to project `foo` + self.assertRaises( + pagure.exceptions.PagureException, + pagure.lib.add_user_to_project, + session=self.session, + project=repo, + new_user='foo', + user='pingou' + ) + self.session.commit() + self.assertEqual(msg, 'User added') + + # Create issues to play with + msg = pagure.lib.new_issue( + session=self.session, + repo=repo, + title='Test issue', + content='We should work on this', + user='pingou', + ticketfolder=None + ) + self.session.commit() + self.assertEqual(msg.title, 'Test issue') + self.assertEqual(repo.open_tickets, 1) + self.assertEqual(repo.open_tickets_public, 1) + + msg = pagure.lib.new_issue( + session=self.session, + repo=repo, + title='Test issue #2', + content='We should work on this for the second time', + user='foo', + status='Open', + ticketfolder=None + ) + self.session.commit() + self.assertEqual(msg.title, 'Test issue #2') + self.assertEqual(repo.open_tickets, 2) + self.assertEqual(repo.open_tickets_public, 2) + + # After + issues = pagure.lib.search_issues(self.session, repo) + self.assertEqual(len(issues), 2) + + +class PagureLibtests_edit_issue(tests.Modeltests): + """ + Test the pagure.lib edit_issue() method + """ + + def setUp(self): + super(PagureLibtests_edit_issue, self).setUp() + + tests.create_projects(self.session) + + repo = pagure.lib._get_project(self.session, 'test') + pagure.lib.add_user_to_project( + session=self.session, + project=repo, + new_user='foo', + user='pingou' + ) + + # Create issues to play with + pagure.lib.new_issue( + session=self.session, + repo=repo, + title='Test issue', + content='We should work on this', + user='pingou', + ticketfolder=None + ) + + pagure.lib.new_issue( + session=self.session, + repo=repo, + title='Test issue #2', + content='We should work on this for the second time', + user='foo', + status='Open', + ticketfolder=None + ) + + pagure.lib.new_issue( + session=self.session, + repo=repo, + title='Test issue #3', + content='We should work on this for the second time', + user='foo', + status='Open', + ticketfolder=None + ) + + self.session.commit() + + def test_edit_issue(self): + """ + Test the edit_issue of pagure.lib. + """ + + repo = pagure.lib._get_project(self.session, 'test') + issue = pagure.lib.search_issues(self.session, repo, issueid=2) + + self.assertEqual(repo.open_tickets, 3) + self.assertEqual(repo.open_tickets_public, 3) + + # Edit the issue + msg = pagure.lib.edit_issue( + session=self.session, + issue=issue, + user='pingou', + ticketfolder=None) + self.session.commit() + self.assertEqual(msg, None) + + msg = pagure.lib.edit_issue( + session=self.session, + issue=issue, + user='pingou', + ticketfolder=None, + title='Test issue #2', + content='We should work on this for the second time', + status='Open', + ) + self.session.commit() + self.assertEqual(msg, None) + + msg = pagure.lib.edit_issue( + session=self.session, + issue=issue, + user='pingou', + ticketfolder=None, + title='Foo issue #2', + content='We should work on this period', + status='Closed', + close_status='Invalid', + private=True, + ) + self.session.commit() + self.assertEqual( + msg, + [ + 'Issue status updated to: Closed (was: Open)', + 'Issue close_status updated to: Invalid', + 'Issue private status set to: True' + ] + ) + + msg = pagure.lib.edit_issue( + session=self.session, + issue=issue, + user='pingou', + ticketfolder=None, + title='Foo issue #2', + content='Fixed!', + status='Closed', + close_status='Fixed', + private=False, + ) + self.session.commit() + self.assertEqual( + msg, + [ + 'Issue close_status updated to: Fixed (was: Invalid)', + 'Issue private status set to: False (was: True)' + ] + ) + + repo = pagure.lib._get_project(self.session, 'test') + self.assertEqual(repo.open_tickets, 2) + self.assertEqual(repo.open_tickets_public, 2) + self.assertEqual(repo.issues[1].status, 'Closed') + self.assertEqual(repo.issues[1].close_status, 'Fixed') + + # Edit the status: re-open the ticket + msg = pagure.lib.edit_issue( + session=self.session, + issue=issue, + user='pingou', + status='Open', + ticketfolder=None, + private=True, + ) + self.session.commit() + self.assertEqual( + msg, + [ + 'Issue status updated to: Open (was: Closed)', + 'Issue private status set to: True' + ] + ) + + repo = pagure.lib._get_project(self.session, 'test') + for issue in repo.issues: + self.assertEqual(issue.status, 'Open') + self.assertEqual(issue.close_status, None) + # 3 open but one of them is private + self.assertEqual(repo.open_tickets, 3) + self.assertEqual(repo.open_tickets_public, 2) + + # Edit the status: re-close the ticket + msg = pagure.lib.edit_issue( + session=self.session, + issue=issue, + user='pingou', + status='Closed', + close_status='Invalid', + ticketfolder=None, + private=True, + ) + self.session.commit() + self.assertEqual( + msg, + [ + 'Issue status updated to: Closed (was: Open)', + 'Issue close_status updated to: Invalid', + 'Issue private status set to: True' + ] + ) + + repo = pagure.lib._get_project(self.session, 'test') + self.assertEqual(repo.open_tickets, 2) + self.assertEqual(repo.open_tickets_public, 1) + self.assertEqual(repo.issues[2].status, 'Closed') + self.assertEqual(repo.issues[2].close_status, 'Invalid') + + def test_edit_issue_priority(self): + """ + Test the edit_issue of pagure.lib when changing the priority. + """ + + repo = pagure.get_authorized_project(self.session, 'test') + issue = pagure.lib.search_issues(self.session, repo, issueid=1) + + # Set some priorities to the repo + repo = pagure.get_authorized_project(self.session, 'test') + repo.priorities = {'1': 'High', '2': 'Normal'} + self.session.add(repo) + self.session.commit() + + self.assertEqual(repo.open_tickets, 3) + self.assertEqual(repo.open_tickets_public, 3) + + # Edit the issue -- Wrong priority value: No changes + msg = pagure.lib.edit_issue( + session=self.session, + issue=issue, + user='pingou', + ticketfolder=None, + priority=3, + ) + self.session.commit() + self.assertEqual(msg, None) + + # Edit the issue -- Good priority + msg = pagure.lib.edit_issue( + session=self.session, + issue=issue, + user='pingou', + ticketfolder=None, + priority=2, + ) + self.session.commit() + self.assertEqual( + msg, + [ + 'Issue priority set to: Normal' + ] + ) + + # Edit the issue -- Update priority + msg = pagure.lib.edit_issue( + session=self.session, + issue=issue, + user='pingou', + ticketfolder=None, + priority=1, + ) + self.session.commit() + self.assertEqual( + msg, + [ + 'Issue priority set to: High (was: Normal)' + ] + ) + + def test_edit_issue_depending(self): + """ + Test the edit_issue of pagure.lib when the issue depends on + another. + """ + + repo = pagure.get_authorized_project(self.session, 'test') + issue = pagure.lib.search_issues(self.session, repo, issueid=2) + + self.assertEqual(repo.open_tickets, 3) + self.assertEqual(repo.open_tickets_public, 3) + + # Make issue #2 blocking on issue #1 + msgs = pagure.lib.update_blocked_issue( + self.session, + repo, + issue, + blocks=['1'], + username='pingou', + ticketfolder=None, + ) + self.assertEqual(msgs, ['Issue marked as blocking: #1']) + + # Make issue #2 depend on issue #3 + msgs = pagure.lib.update_dependency_issue( + self.session, + repo, + issue, + depends=['3'], + username='pingou', + ticketfolder=None, + ) + self.assertEqual(msgs, ['Issue marked as depending on: #3']) + + # Edit the issue #3 + issue = pagure.lib.search_issues(self.session, repo, issueid=3) + msg = pagure.lib.edit_issue( + session=self.session, + issue=issue, + user='pingou', + ticketfolder=None) + self.session.commit() + self.assertEqual(msg, None) + + msg = pagure.lib.edit_issue( + session=self.session, + issue=issue, + user='pingou', + ticketfolder=None, + title='Foo issue #2', + content='We should work on this period', + status='Closed', + close_status='Invalid', + private=True, + ) + self.session.commit() + self.assertEqual( + msg, + [ + 'Issue status updated to: Closed (was: Open)', + 'Issue close_status updated to: Invalid', + 'Issue private status set to: True' + ] + ) + + self.assertEqual(repo.open_tickets, 2) + self.assertEqual(repo.open_tickets_public, 2) + + +class PagureLibtests_add_issues(tests.Modeltests): + """ + Test the pagure.lib add_issue_dependency, + add_issue_assignee, add_issue_comment and + add_issue_comment_private methods + """ + + def setUp(self): + super(PagureLibtests_add_issues, self).setUp() + + tests.create_projects(self.session) + + repo = pagure.lib._get_project(self.session, 'test') + pagure.lib.add_user_to_project( + session=self.session, + project=repo, + new_user='foo', + user='pingou' + ) + + # Create issues to play with + pagure.lib.new_issue( + session=self.session, + repo=repo, + title='Test issue', + content='We should work on this', + user='pingou', + ticketfolder=None + ) + + pagure.lib.new_issue( + session=self.session, + repo=repo, + title='Test issue #2', + content='We should work on this for the second time', + user='foo', + status='Open', + ticketfolder=None + ) + + self.session.commit() + + def test_add_issue_dependency(self): + """ + Test the add_issue_dependency of pagure.lib. + """ + + repo = pagure.lib._get_project(self.session, 'test') + issue = pagure.lib.search_issues(self.session, repo, issueid=1) + issue_blocked = pagure.lib.search_issues( + self.session, repo, issueid=2) + + # Before + self.assertEqual(issue.parents, []) + self.assertEqual(issue.children, []) + self.assertEqual(issue_blocked.parents, []) + self.assertEqual(issue_blocked.children, []) + + self.assertRaises( + pagure.exceptions.PagureException, + pagure.lib.add_issue_dependency, + session=self.session, + issue=issue, + issue_blocked=issue, + user='pingou', + ticketfolder=None) + + msg = pagure.lib.add_issue_dependency( + session=self.session, + issue=issue, + issue_blocked=issue_blocked, + user='pingou', + ticketfolder=None) + self.session.commit() + self.assertEqual(msg, 'Issue marked as depending on: #2') + + # After + self.assertEqual(len(issue.parents), 0) + self.assertEqual(issue.parents, []) + self.assertEqual(len(issue.children), 1) + self.assertEqual(issue.children[0].id, 2) + self.assertEqual(issue.depending_text, []) + self.assertEqual(issue.blocking_text, [2]) + + self.assertEqual(len(issue_blocked.children), 0) + self.assertEqual(issue_blocked.children, []) + self.assertEqual(len(issue_blocked.parents), 1) + self.assertEqual(issue_blocked.parents[0].id, 1) + self.assertEqual(issue_blocked.depending_text, [1]) + self.assertEqual(issue_blocked.blocking_text, []) + + def test_add_issue_assignee(self): + """ + Test the add_issue_assignee of pagure.lib. + """ + + repo = pagure.lib._get_project(self.session, 'test') + issue = pagure.lib.search_issues(self.session, repo, issueid=2) + + # Before + issues = pagure.lib.search_issues( + self.session, repo, assignee='pingou') + self.assertEqual(len(issues), 0) + + # Test when it fails + self.assertRaises( + pagure.exceptions.PagureException, + pagure.lib.add_issue_assignee, + session=self.session, + issue=issue, + assignee='foo@foobar.com', + user='foo@pingou.com', + ticketfolder=None, + ) + + self.assertRaises( + pagure.exceptions.PagureException, + pagure.lib.add_issue_assignee, + session=self.session, + issue=issue, + assignee='foo@bar.com', + user='foo@foopingou.com', + ticketfolder=None, + ) + + # Set the assignee by its email + msg = pagure.lib.add_issue_assignee( + session=self.session, + issue=issue, + assignee='foo@bar.com', + user='foo@pingou.com', + ticketfolder=None) + self.session.commit() + self.assertEqual(msg, 'Issue assigned to foo@bar.com') + + # Change the assignee to someone else by its username + msg = pagure.lib.add_issue_assignee( + session=self.session, + issue=issue, + assignee='pingou', + user='pingou', + ticketfolder=None) + self.session.commit() + self.assertEqual(msg, 'Issue assigned to pingou (was: foo)') + + # After -- Searches by assignee + issues = pagure.lib.search_issues( + self.session, repo, assignee='pingou') + self.assertEqual(len(issues), 1) + self.assertEqual(issues[0].id, 2) + self.assertEqual(issues[0].project_id, 1) + self.assertEqual(issues[0].status, 'Open') + self.assertEqual(issues[0].tags, []) + + issues = pagure.lib.search_issues( + self.session, repo, assignee=True) + self.assertEqual(len(issues), 1) + self.assertEqual(issues[0].id, 2) + self.assertEqual(issues[0].title, 'Test issue #2') + self.assertEqual(issues[0].project_id, 1) + self.assertEqual(issues[0].status, 'Open') + self.assertEqual(issues[0].tags, []) + + issues = pagure.lib.search_issues( + self.session, repo, assignee=False) + self.assertEqual(len(issues), 1) + self.assertEqual(issues[0].id, 1) + self.assertEqual(issues[0].title, 'Test issue') + self.assertEqual(issues[0].project_id, 1) + self.assertEqual(issues[0].status, 'Open') + self.assertEqual(issues[0].tags, []) + + # Reset the assignee to no-one + msg = pagure.lib.add_issue_assignee( + session=self.session, + issue=issue, + assignee=None, + user='pingou', + ticketfolder=None) + self.session.commit() + self.assertEqual(msg, 'Assignee reset') + + issues = pagure.lib.search_issues( + self.session, repo, assignee=False) + self.assertEqual(len(issues), 2) + self.assertEqual(issues[0].id, 2) + self.assertEqual(issues[1].id, 1) + + issues = pagure.lib.search_issues( + self.session, repo, assignee=True) + self.assertEqual(len(issues), 0) + + def test_add_issue_comment(self): + """ + Test the add_issue_comment of pagure.lib. + """ + repo = pagure.lib._get_project(self.session, 'test') + + # Before + issue = pagure.lib.search_issues(self.session, repo, issueid=1) + self.assertEqual(len(issue.comments), 0) + + # Set the assignee by its email + msg = pagure.lib.add_issue_assignee( + session=self.session, + issue=issue, + assignee='foo@bar.com', + user='foo@pingou.com', + ticketfolder=None) + self.session.commit() + self.assertEqual(msg, 'Issue assigned to foo@bar.com') + + # Add a comment to that issue + msg = pagure.lib.add_issue_comment( + session=self.session, + issue=issue, + comment='Hey look a comment!', + user='foo', + ticketfolder=None + ) + self.session.commit() + self.assertEqual(msg, 'Comment added') + + # After + issue = pagure.lib.search_issues(self.session, repo, issueid=1) + self.assertEqual(len(issue.comments), 1) + self.assertEqual(issue.comments[0].comment, 'Hey look a comment!') + self.assertEqual(issue.comments[0].user.user, 'foo') + + def test_add_issue_comment_private(self): + """ + Test the add_issue_comment of pagure.lib. + """ + + project = pagure.lib._get_project(self.session, 'test') + + msg = pagure.lib.new_issue( + session=self.session, + repo=project, + title='Test issue #1', + content='We should work on this for the second time', + user='foo', + status='Open', + ticketfolder=None, + private=True, + ) + self.session.commit() + self.assertEqual(msg.title, 'Test issue #1') + self.assertEqual(project.open_tickets, 3) + self.assertEqual(project.open_tickets_public, 2) + + # Before + issue = pagure.lib.search_issues(self.session, project, issueid=1) + self.assertEqual(len(issue.comments), 0) + + # Add a comment to that issue + msg = pagure.lib.add_issue_comment( + session=self.session, + issue=issue, + comment='Hey look a comment!', + user='foo', + ticketfolder=None + ) + self.session.commit() + self.assertEqual(msg, 'Comment added') + + # After + issue = pagure.lib.search_issues(self.session, project, issueid=1) + self.assertEqual(len(issue.comments), 1) + self.assertEqual(issue.comments[0].comment, 'Hey look a comment!') + self.assertEqual(issue.comments[0].user.user, 'foo') + + +class PagureLibtests_issues_update(tests.Modeltests): + """ + Test the pagure.lib update_tags, update_dependency_issue, + and update_blocked_issue methods + """ + + def setUp(self): + super(PagureLibtests_issues_update, self).setUp() + + tests.create_projects(self.session) + + repo = pagure.lib._get_project(self.session, 'test') + pagure.lib.add_user_to_project( + session=self.session, + project=repo, + new_user='foo', + user='pingou' + ) + + # Create issues to play with + pagure.lib.new_issue( + session=self.session, + repo=repo, + title='Test issue', + content='We should work on this', + user='pingou', + ticketfolder=None + ) + + pagure.lib.new_issue( + session=self.session, + repo=repo, + title='Test issue #2', + content='We should work on this for the second time', + user='foo', + status='Open', + ticketfolder=None + ) + + self.session.commit() + + def test_update_tags(self): + """ + Test the update_tags of pagure.lib. + """ + + repo = pagure.lib._get_project(self.session, 'test') + issue = pagure.lib.search_issues(self.session, repo, issueid=1) + + # before + self.assertEqual(repo.tags_colored, []) + self.assertEqual(issue.tags_text, []) + + messages = pagure.lib.update_tags( + self.session, issue, 'tag', 'pingou', ticketfolder=None) + self.assertEqual(messages, ['Issue tagged with: tag']) + + # after + repo = pagure.get_authorized_project(self.session, 'test') + issue = pagure.lib.search_issues(self.session, repo, issueid=1) + + self.assertEqual( + [t.tag for t in repo.tags_colored], ['tag']) + self.assertEqual(issue.tags_text, ['tag']) + + # Replace the tag by two others + messages = pagure.lib.update_tags( + self.session, issue, ['tag2', 'tag3'], 'pingou', + ticketfolder=None) + self.assertEqual( + messages, [ + 'Issue tagged with: tag2, tag3', + 'Issue **un**tagged with: tag' + ] + ) + + # after + repo = pagure.get_authorized_project(self.session, 'test') + issue = pagure.lib.search_issues(self.session, repo, issueid=1) + + self.assertEqual( + sorted([t.tag for t in repo.tags_colored]), + ['tag', 'tag2', 'tag3']) + self.assertEqual(issue.tags_text, ['tag2', 'tag3']) + + def test_update_dependency_issue(self): + """ + Test the update_dependency_issue of pagure.lib. + """ + + repo = pagure.lib._get_project(self.session, 'test') + issue = pagure.lib.search_issues(self.session, repo, issueid=1) + + self.assertEqual(repo.open_tickets, 2) + self.assertEqual(repo.open_tickets_public, 2) + + # Create issues to play with + msg = pagure.lib.new_issue( + session=self.session, + repo=repo, + title='Test issue #3', + content='We should work on this (3rd time!)', + user='pingou', + ticketfolder=None, + private=True, + ) + self.session.commit() + self.assertEqual(msg.title, 'Test issue #3') + + self.assertEqual(repo.open_tickets, 3) + self.assertEqual(repo.open_tickets_public, 2) + + # before + self.assertEqual(issue.tags_text, []) + self.assertEqual(issue.depending_text, []) + self.assertEqual(issue.blocking_text, []) + + messages = pagure.lib.update_dependency_issue( + self.session, repo, issue, '2', 'pingou', ticketfolder=None) + self.assertEqual(messages, ['Issue marked as depending on: #2']) + messages = pagure.lib.update_dependency_issue( + self.session, repo, issue, ['3', '4', 5], 'pingou', + ticketfolder=None) + self.assertEqual( + messages, + [ + 'Issue marked as depending on: #3', + 'Issue marked as depending on: #4', + 'Issue marked as depending on: #5', + 'Issue **un**marked as depending on: #2' + ] + ) + + # after + self.assertEqual(issue.tags_text, []) + self.assertEqual(issue.depending_text, [3]) + self.assertEqual(issue.blocking_text, []) + + def test_update_blocked_issue(self): + """ + Test the update_blocked_issue of pagure.lib. + """ + + repo = pagure.lib._get_project(self.session, 'test') + issue = pagure.lib.search_issues(self.session, repo, issueid=1) + + # Create issues to play with + msg = pagure.lib.new_issue( + session=self.session, + repo=repo, + title='Test issue #3', + content='We should work on this (3rd time!)', + user='pingou', + ticketfolder=None, + private=True, + ) + self.session.commit() + self.assertEqual(msg.title, 'Test issue #3') + + # before + self.assertEqual(issue.tags_text, []) + self.assertEqual(issue.depending_text, []) + self.assertEqual(issue.blocking_text, []) + + messages = pagure.lib.update_blocked_issue( + self.session, repo, issue, '2', 'pingou', ticketfolder=None) + self.assertEqual(messages, ['Issue marked as blocking: #2']) + messages = pagure.lib.update_blocked_issue( + self.session, repo, issue, ['3', '4', 5], 'pingou', + ticketfolder=None) + self.assertEqual( + messages, [ + 'Issue marked as blocking: #3', + 'Issue marked as blocking: #4', + 'Issue marked as blocking: #5', + 'Issue **un**marked as blocking: #2']) + + # after + self.assertEqual(issue.tags_text, []) + self.assertEqual(issue.depending_text, []) + self.assertEqual(issue.blocking_text, [3]) + + +class PagureLibtests_get_issues(tests.Modeltests): + """ + Test the pagure.lib get_issue_by_uid method. + """ + + def setUp(self): + super(PagureLibtests_get_issues, self).setUp() + + tests.create_projects(self.session) + + repo = pagure.lib._get_project(self.session, 'test') + pagure.lib.add_user_to_project( + session=self.session, + project=repo, + new_user='foo', + user='pingou' + ) + + # Create issues to play with + pagure.lib.new_issue( + session=self.session, + repo=repo, + title='Test issue', + content='We should work on this', + user='pingou', + ticketfolder=None + ) + + self.session.commit() + + def test_get_issue_by_uid(self): + """ + Test the get_issue_by_uid of pagure.lib. + """ + + repo = pagure.lib._get_project(self.session, 'test') + issue = pagure.lib.search_issues(self.session, repo, issueid=1) + + self.assertEqual( + pagure.lib.get_issue_by_uid(self.session, 'foobar'), + None + ) + + new_issue = pagure.lib.get_issue_by_uid(self.session, issue.uid) + self.assertEqual(issue, new_issue) + +if __name__ == '__main__': + unittest.main(verbosity=2) \ No newline at end of file From 1986e22cea1a677c1be0ed5631dae5499bcfd05e Mon Sep 17 00:00:00 2001 From: Clement Verna Date: Jul 03 2017 18:39:36 +0000 Subject: [PATCH 4/7] Move the unit tests related to pagure.lib search issues methods to their own module Signed-off-by: Clement Verna --- diff --git a/tests/lib/test_pagure_lib_search_issue.py b/tests/lib/test_pagure_lib_search_issue.py new file mode 100644 index 0000000..0dd9969 --- /dev/null +++ b/tests/lib/test_pagure_lib_search_issue.py @@ -0,0 +1,225 @@ +import unittest + +import tests +import pagure.lib + + +class PagureLibtests_search_issue(tests.Modeltests): + """ + Test the pagure.lib methods to search issues + """ + + def setUp(self): + super(PagureLibtests_search_issue, self).setUp() + + tests.create_projects(self.session) + + self.repo = pagure.lib._get_project(self.session, 'test') + pagure.lib.add_user_to_project( + session=self.session, + project=self.repo, + new_user='foo', + user='pingou' + ) + + # Create issues to play with + pagure.lib.new_issue( + session=self.session, + repo=self.repo, + title='Test issue', + content='We should work on this', + user='pingou', + status='Open', + ticketfolder=None + ) + + pagure.lib.new_issue( + session=self.session, + repo=self.repo, + title='Test issue #2', + content='We should work on this for the second time', + user='foo', + status='Closed', + close_status='Invalid', + ticketfolder=None + ) + + self.session.commit() + + def test_search_all_issues(self): + """ + Test the search_issues of pagure.lib, search all issues. + """ + + # All issues + issues = pagure.lib.search_issues(self.session, self.repo) + self.assertEqual(len(issues), 2) + self.assertEqual(issues[1].id, 1) + self.assertEqual(issues[1].project_id, 1) + self.assertEqual(issues[1].status, 'Open') + self.assertEqual(issues[1].tags, []) + self.assertEqual(issues[0].id, 2) + self.assertEqual(issues[0].project_id, 1) + self.assertEqual(issues[0].status, 'Closed') + self.assertEqual(issues[0].close_status, 'Invalid') + self.assertEqual(issues[0].tags, []) + + def test_search_issues_by_status(self): + """ + Test the search_issues of pagure.lib, search issues for a given status. + """ + + # Issues by status + issues = pagure.lib.search_issues( + self.session, self.repo, status='Closed') + self.assertEqual(len(issues), 1) + self.assertEqual(issues[0].id, 2) + self.assertEqual(issues[0].project_id, 1) + self.assertEqual(issues[0].status, 'Closed') + self.assertEqual(issues[0].close_status, 'Invalid') + self.assertEqual(issues[0].tags, []) + + # Issues closed + issues = pagure.lib.search_issues( + self.session, self.repo, closed=True) + self.assertEqual(len(issues), 1) + self.assertEqual(issues[0].id, 2) + self.assertEqual(issues[0].project_id, 1) + self.assertEqual(issues[0].status, 'Closed') + self.assertEqual(issues[0].close_status, 'Invalid') + self.assertEqual(issues[0].tags, []) + + def test_search_issues_by_tag(self): + """ + Test the search_issues of pagure.lib, search issues for a given tag. + """ + + # Issues by tag + issues = pagure.lib.search_issues(self.session, self.repo, tags='foo') + self.assertEqual(len(issues), 0) + issues = pagure.lib.search_issues(self.session, self.repo, tags='!foo') + self.assertEqual(len(issues), 2) + + def test_search_issues_by_id(self): + """ + Test the search_issues of pagure.lib, search issues for a given id. + """ + + # Issue by id + issue = pagure.lib.search_issues(self.session, self.repo, issueid=1) + self.assertEqual(issue.title, 'Test issue') + self.assertEqual(issue.user.user, 'pingou') + self.assertEqual(issue.tags, []) + + def test_search_issues_by_authors(self): + """ + Test the search_issues of pagure.lib, search issues for a given author. + """ + + # Issues by authors + issues = pagure.lib.search_issues(self.session, self.repo, author='foo') + self.assertEqual(len(issues), 1) + self.assertEqual(issues[0].id, 2) + self.assertEqual(issues[0].project_id, 1) + self.assertEqual(issues[0].status, 'Closed') + self.assertEqual(issues[0].close_status, 'Invalid') + self.assertEqual(issues[0].tags, []) + + def test_search_issues_by_assignee(self): + """ + Test the search_issues of pagure.lib, search issues for a given assignee. + """ + + # Issues by assignee + issues = pagure.lib.search_issues(self.session, self.repo, assignee='foo') + self.assertEqual(len(issues), 0) + issues = pagure.lib.search_issues(self.session, self.repo, assignee='!foo') + self.assertEqual(len(issues), 2) + + issues = pagure.lib.search_issues(self.session, self.repo, private='foo') + self.assertEqual(len(issues), 2) + + def test_search_issues_milestones_invalid(self): + """ + Test the search_issues_milestones_invalid of pagure.lib. + """ + + issues = pagure.lib.search_issues( + self.session, self.repo, milestones='foo') + self.assertEqual(len(issues), 0) + + issues = pagure.lib.search_issues( + self.session, self.repo, milestones='foo', no_milestones=True) + self.assertEqual(len(issues), 2) + + def test_search_issues_custom_search(self): + """ + Test the search_issues_custom_search of pagure.lib. + """ + + issues = pagure.lib.search_issues( + self.session, self.repo, custom_search={'foo': '*'}) + self.assertEqual(len(issues), 0) + + def test_search_issues_offset(self): + """ + Test the search_issues_offset of pagure.lib. + """ + + issues = pagure.lib.search_issues(self.session, self.repo) + self.assertEqual(len(issues), 2) + self.assertEqual([i.id for i in issues], [2, 1]) + + issues = pagure.lib.search_issues(self.session, self.repo, offset=1) + self.assertEqual(len(issues), 1) + self.assertEqual([i.id for i in issues], [1]) + + def test_search_issues_tags(self): + """ + Test the search_issues_tags of pagure.lib. + """ + + # Add `tag1` to one issues and `tag2` only to the other one + issue = pagure.lib.search_issues(self.session, self.repo, issueid=1) + msg = pagure.lib.add_tag_obj( + session=self.session, + obj=issue, + tags='tag1', + user='pingou', + ticketfolder=None) + self.session.commit() + self.assertEqual(msg, 'Issue tagged with: tag1') + + issue = pagure.lib.search_issues(self.session, self.repo, issueid=2) + msg = pagure.lib.add_tag_obj( + session=self.session, + obj=issue, + tags='tag2', + user='pingou', + ticketfolder=None) + self.session.commit() + self.assertEqual(msg, 'Issue tagged with: tag2') + + # Search all issues tagged with `tag1` + issues = pagure.lib.search_issues(self.session, self.repo, tags='tag1') + self.assertEqual(len(issues), 1) + self.assertEqual(issues[0].id, 1) + self.assertEqual(issues[0].project_id, 1) + self.assertEqual([tag.tag for tag in issues[0].tags], ['tag1']) + + # Search all issues *not* tagged with `tag1` + issues = pagure.lib.search_issues(self.session, self.repo, tags='!tag1') + self.assertEqual(len(issues), 1) + self.assertEqual(issues[0].id, 2) + self.assertEqual(issues[0].project_id, 1) + self.assertEqual( + [tag.tag for tag in issues[0].tags], ['tag2']) + + # Search all issues *not* tagged with `tag1` but tagged with `tag2` + issues = pagure.lib.search_issues( + self.session, self.repo, tags=['!tag1', 'tag2']) + self.assertEqual(len(issues), 1) + self.assertEqual(issues[0].id, 2) + self.assertEqual(issues[0].project_id, 1) + self.assertEqual( + [tag.tag for tag in issues[0].tags], ['tag2']) \ No newline at end of file From 117750cfe1ed6458e03dfeb1850e9fb49e0a25ca Mon Sep 17 00:00:00 2001 From: Clement Verna Date: Jul 03 2017 18:43:00 +0000 Subject: [PATCH 5/7] Refactor the test_pagure_lib.py so that it does not use the methods that were moved in their own modules Signed-off-by: Clement Verna --- diff --git a/tests/test_pagure_lib.py b/tests/test_pagure_lib.py index 3b734b1..7e2e10d 100644 --- a/tests/test_pagure_lib.py +++ b/tests/test_pagure_lib.py @@ -29,874 +29,13 @@ import pagure.lib.model import tests -class PagureLibtests_search_user(tests.Modeltests): - """ - Test the pagure.lib search_user() method - """ - - def test_search_user_all(self): - """ - Test the method returns all the users for the given session - """ - - # Retrieve all users - items = pagure.lib.search_user(self.session) - self.assertEqual(2, len(items)) - self.assertEqual(2, items[0].id) - self.assertEqual('foo', items[0].user) - self.assertEqual('foo', items[0].username) - self.assertEqual([], items[1].groups) - self.assertEqual(1, items[1].id) - self.assertEqual('pingou', items[1].user) - self.assertEqual('pingou', items[1].username) - self.assertEqual([], items[1].groups) - - def test_search_user_username(self): - """ - Test the method returns the user for a given username - """ - - # Retrieve user by username - item = pagure.lib.search_user(self.session, username='foo') - self.assertEqual('foo', item.user) - self.assertEqual('foo', item.username) - self.assertEqual([], item.groups) - - item = pagure.lib.search_user(self.session, username='bar') - self.assertEqual(None, item) - - def test_search_user_email(self): - """ - Test the method returns a user for a given email address - """ - - # Retrieve user by email - item = pagure.lib.search_user(self.session, email='foo@foo.com') - self.assertEqual(None, item) - - item = pagure.lib.search_user(self.session, email='foo@bar.com') - self.assertEqual('foo', item.user) - self.assertEqual('foo', item.username) - self.assertEqual([], item.groups) - self.assertEqual( - ['foo@bar.com'], [email.email for email in item.emails]) - - item = pagure.lib.search_user(self.session, email='foo@pingou.com') - self.assertEqual('pingou', item.user) - self.assertEqual( - sorted(['bar@pingou.com', 'foo@pingou.com']), - sorted([email.email for email in item.emails])) - - def test_search_user_token(self): - """ - Test the method returns a user for a given token - """ - - # Retrieve user by token - item = pagure.lib.search_user(self.session, token='aaa') - self.assertEqual(None, item) - - item = pagure.lib.model.User( - user='pingou2', - fullname='PY C', - token='aaabbb', - default_email='bar@pingou.com', - ) - self.session.add(item) - self.session.commit() - - item = pagure.lib.search_user(self.session, token='aaabbb') - self.assertEqual('pingou2', item.user) - self.assertEqual('PY C', item.fullname) - - def test_search_user_pattern(self): - """ - Test the method returns a user for a given pattern - """ - - # Retrieve user by pattern - item = pagure.lib.search_user(self.session, pattern='a*') - self.assertEqual([], item) - - item = pagure.lib.model.User( - user='pingou2', - fullname='PY C', - token='aaabbb', - default_email='bar@pingou.com', - ) - self.session.add(item) - self.session.commit() - - items = pagure.lib.search_user(self.session, pattern='p*') - self.assertEqual(2, len(items)) - self.assertEqual(1, items[0].id) - self.assertEqual('pingou', items[0].user) - self.assertEqual('pingou', items[0].username) - self.assertEqual([], items[0].groups) - self.assertEqual( - sorted(['bar@pingou.com', 'foo@pingou.com']), - sorted([email.email for email in items[0].emails])) - self.assertEqual(3, items[1].id) - self.assertEqual('pingou2', items[1].user) - self.assertEqual('pingou2', items[1].username) - self.assertEqual([], items[1].groups) - self.assertEqual( - [], [email.email for email in items[1].emails]) - - -class PagureLibtests_search_projects(tests.Modeltests): - """ - Test the pagure.lib search_projects() method - """ - - def setUp(self): - super(PagureLibtests_search_projects, self).setUp() - tests.create_projects(self.session) - - def test_search_projects_all(self): - """ - Test the method returns all the projects for the given session - """ - - projects = pagure.lib.search_projects(self.session) - self.assertEqual(len(projects), 3) - self.assertEqual(projects[0].id, 1) - self.assertEqual(projects[1].id, 2) - - def test_search_projects_username(self): - """ - Test the method returns all the projects for the given username - """ - projects = pagure.lib.search_projects(self.session, username='foo') - self.assertEqual(len(projects), 0) - - projects = pagure.lib.search_projects(self.session, username='pingou') - self.assertEqual(len(projects), 3) - self.assertEqual(projects[0].id, 1) - self.assertEqual(projects[1].id, 2) - - def test_search_projects_start(self): - """ - Test the method returns all the projects for the given start - """ - projects = pagure.lib.search_projects(self.session, start=1) - self.assertEqual(len(projects), 2) - self.assertEqual(projects[0].id, 2) - - def test_search_projects_limit(self): - """ - Test the method returns all the projects for the given limit - """ - projects = pagure.lib.search_projects(self.session, limit=1) - self.assertEqual(len(projects), 1) - self.assertEqual(projects[0].id, 1) - - def test_search_projects_count(self): - """ - Test the method returns the count of the projects - """ - projects = pagure.lib.search_projects(self.session, count=True) - self.assertEqual(projects, 3) - - def test_search_projects_commit_access(self): - """ - Test the method returns the project of user with only commit access - """ - # Also check if the project shows up if a user doesn't - # have admin access in the project - # Check with commit access first - project = pagure.get_authorized_project(self.session, project_name='test') - msg = pagure.lib.add_user_to_project( - self.session, - project=project, - new_user='foo', - user='pingou', - access='commit' - ) - - self.assertEqual(msg, 'User added') - self.session.commit() - projects = pagure.lib.search_projects(self.session, username='foo') - self.assertEqual(len(projects), 1) - - def test_search_projects_ticket_access(self): - """ - Test the method does not returns the project of user with only ticket access - """ - # Now check with only ticket access - project = pagure.get_authorized_project(self.session, project_name='test') - msg = pagure.lib.add_user_to_project( - self.session, - project=project, - new_user='foo', - user='pingou', - access='ticket' - ) - self.assertEqual(msg, 'User added') - self.session.commit() - projects = pagure.lib.search_projects(self.session, username='foo') - self.assertEqual(len(projects), 0) - - def test_search_project_forked(self): - """ - Test the search_project for forked projects in pagure.lib. - """ - - # Create two forked repo - item = pagure.lib.model.Project( - user_id=2, # foo - name='test', - description='test project #1', - is_fork=True, - parent_id=1, - hook_token='aaabbbttt', - ) - self.session.add(item) - - item = pagure.lib.model.Project( - user_id=2, # foo - name='test2', - description='test project #2', - is_fork=True, - parent_id=2, - hook_token='aaabbbuuu', - ) - self.session.add(item) - - # Since we have two forks, let's search them - projects = pagure.lib.search_projects(self.session, fork=True) - self.assertEqual(len(projects), 2) - projects = pagure.lib.search_projects(self.session, fork=False) - self.assertEqual(len(projects), 3) - - def test_search_projects_private(self): - """ - Test the method for private projects - """ - - item = pagure.lib.model.Project( - user_id=1, # pingou - name='private_test', - description='Private test project #1', - hook_token='aaabbbcccpp', - ) - self.session.add(item) - self.session.commit() - - projects = pagure.lib.search_projects(self.session) - self.assertEqual(len(projects), 4) - self.assertEqual( - [p.path for p in projects], - ['private_test.git', 'test.git', 'test2.git', - 'somenamespace/test3.git'] - ) - - projects = pagure.lib.search_projects( - self.session, username='pingou') - self.assertEqual(len(projects), 4) - self.assertEqual( - [p.path for p in projects], - ['private_test.git', 'test.git', 'test2.git', - 'somenamespace/test3.git'] - ) - - projects = pagure.lib.search_projects( - self.session, username='pingou', private='pingou') - self.assertEqual(len(projects), 4) - self.assertEqual( - [p.path for p in projects], - ['private_test.git', 'test.git', 'test2.git', - 'somenamespace/test3.git'] - ) - - projects = pagure.lib.search_projects( - self.session, username='pingou', private='foo') - self.assertEqual(len(projects), 0) - - def test_search_projects_tags(self): - """ - Test the method returns all the projects for the given tags - """ - - # Add tags to the project - project = pagure.lib._get_project(self.session, 'test') - tag = pagure.lib.model.Tag( - tag='fedora' - ) - self.session.add(tag) - self.session.commit() - tp = pagure.lib.model.TagProject( - project_id=project.id, - tag='fedora' - ) - self.session.add(tp) - self.session.commit() - - projects = pagure.lib.search_projects( - self.session, tags='fedora') - self.assertEqual(len(projects), 1) - self.assertEqual(projects[0].path, 'test.git') - - def test_search_projects_pattern(self): - """ - Test the method returns all the projects for the given pattern - """ - - projects = pagure.lib.search_projects( - self.session, pattern='test*') - self.assertEqual(len(projects), 3) - self.assertEqual( - [p.path for p in projects], - ['test.git', 'test2.git', 'somenamespace/test3.git'] - ) - - def test_search_projects_sort(self): - """ - Test the method returns all the projects sorted by lastest and oldest - """ - - projects = pagure.lib.search_projects( - self.session, pattern='*', sort='latest') - self.assertEqual(len(projects), 3) - self.assertEqual( - [p.path for p in projects], - ['somenamespace/test3.git', 'test2.git', 'test.git'] - ) - - projects = pagure.lib.search_projects( - self.session, pattern='*', sort='oldest') - self.assertEqual(len(projects), 3) - self.assertEqual( - [p.path for p in projects], - ['test.git', 'test2.git', 'somenamespace/test3.git'] - ) - - -class PagureLibtests(tests.Modeltests): - """ Tests for pagure.lib """ - - def test_get_next_id(self): - """ Test the get_next_id function of pagure.lib. """ - tests.create_projects(self.session) - self.assertEqual(1, pagure.lib.get_next_id(self.session, 1)) - - @patch('pagure.lib.git.update_git') - @patch('pagure.lib.notify.send_email') - def test_new_issue(self, p_send_email, p_ugt): - """ Test the new_issue of pagure.lib. """ - p_send_email.return_value = True - p_ugt.return_value = True - - tests.create_projects(self.session) - repo = pagure.lib._get_project(self.session, 'test') - # Set some priorities to the project - repo.priorities = {'1': 'High', '2': 'Normal'} - self.session.add(repo) - self.session.commit() - - # Before - issues = pagure.lib.search_issues(self.session, repo) - self.assertEqual(len(issues), 0) - self.assertEqual(repo.open_tickets, 0) - self.assertEqual(repo.open_tickets_public, 0) - - # See where it fails - self.assertRaises( - pagure.exceptions.PagureException, - pagure.lib.new_issue, - session=self.session, - repo=repo, - title='Test issue', - content='We should work on this', - user='blah', - ticketfolder=None - ) - - # Fails since we're trying to give a non-existant priority - self.assertRaises( - pagure.exceptions.PagureException, - pagure.lib.new_issue, - session=self.session, - repo=repo, - title='Test issue', - content='We should work on this', - user='pingou', - ticketfolder=None, - priority=0, - ) - - # Add an extra user to project `foo` - repo = pagure.lib._get_project(self.session, 'test') - msg = pagure.lib.add_user_to_project( - session=self.session, - project=repo, - new_user='foo', - user='pingou' - ) - self.session.commit() - self.assertEqual(msg, 'User added') - - # Try adding again this extra user to project `foo` - self.assertRaises( - pagure.exceptions.PagureException, - pagure.lib.add_user_to_project, - session=self.session, - project=repo, - new_user='foo', - user='pingou' - ) - self.session.commit() - self.assertEqual(msg, 'User added') - - # Create issues to play with - msg = pagure.lib.new_issue( - session=self.session, - repo=repo, - title='Test issue', - content='We should work on this', - user='pingou', - ticketfolder=None - ) - self.session.commit() - self.assertEqual(msg.title, 'Test issue') - self.assertEqual(repo.open_tickets, 1) - self.assertEqual(repo.open_tickets_public, 1) - - msg = pagure.lib.new_issue( - session=self.session, - repo=repo, - title='Test issue #2', - content='We should work on this for the second time', - user='foo', - status='Open', - ticketfolder=None - ) - self.session.commit() - self.assertEqual(msg.title, 'Test issue #2') - self.assertEqual(repo.open_tickets, 2) - self.assertEqual(repo.open_tickets_public, 2) - - # After - issues = pagure.lib.search_issues(self.session, repo) - self.assertEqual(len(issues), 2) - - @patch('pagure.lib.git.update_git') - @patch('pagure.lib.notify.send_email') - def test_edit_issue(self, p_send_email, p_ugt): - """ Test the edit_issue of pagure.lib. """ - p_send_email.return_value = True - p_ugt.return_value = True - - self.test_new_issue() - - repo = pagure.lib._get_project(self.session, 'test') - issue = pagure.lib.search_issues(self.session, repo, issueid=2) - - self.assertEqual(repo.open_tickets, 2) - self.assertEqual(repo.open_tickets_public, 2) - - # Edit the issue - msg = pagure.lib.edit_issue( - session=self.session, - issue=issue, - user='pingou', - ticketfolder=None) - self.session.commit() - self.assertEqual(msg, None) - - msg = pagure.lib.edit_issue( - session=self.session, - issue=issue, - user='pingou', - ticketfolder=None, - title='Test issue #2', - content='We should work on this for the second time', - status='Open', - ) - self.session.commit() - self.assertEqual(msg, None) - - msg = pagure.lib.edit_issue( - session=self.session, - issue=issue, - user='pingou', - ticketfolder=None, - title='Foo issue #2', - content='We should work on this period', - status='Closed', - close_status='Invalid', - private=True, - ) - self.session.commit() - self.assertEqual( - msg, - [ - 'Issue status updated to: Closed (was: Open)', - 'Issue close_status updated to: Invalid', - 'Issue private status set to: True' - ] - ) - - msg = pagure.lib.edit_issue( - session=self.session, - issue=issue, - user='pingou', - ticketfolder=None, - title='Foo issue #2', - content='Fixed!', - status='Closed', - close_status='Fixed', - private=False, - ) - self.session.commit() - self.assertEqual( - msg, - [ - 'Issue close_status updated to: Fixed (was: Invalid)', - 'Issue private status set to: False (was: True)' - ] - ) - - repo = pagure.lib._get_project(self.session, 'test') - self.assertEqual(repo.open_tickets, 1) - self.assertEqual(repo.open_tickets_public, 1) - self.assertEqual(repo.issues[1].status, 'Closed') - self.assertEqual(repo.issues[1].close_status, 'Fixed') - - # Edit the status: re-open the ticket - msg = pagure.lib.edit_issue( - session=self.session, - issue=issue, - user='pingou', - status='Open', - ticketfolder=None, - private=True, - ) - self.session.commit() - self.assertEqual( - msg, - [ - 'Issue status updated to: Open (was: Closed)', - 'Issue private status set to: True' - ] - ) - - repo = pagure.lib._get_project(self.session, 'test') - for issue in repo.issues: - self.assertEqual(issue.status, 'Open') - self.assertEqual(issue.close_status, None) - # 2 open but one of them is private - self.assertEqual(repo.open_tickets, 2) - self.assertEqual(repo.open_tickets_public, 1) - - # Edit the status: re-close the ticket - msg = pagure.lib.edit_issue( - session=self.session, - issue=issue, - user='pingou', - status='Closed', - close_status='Invalid', - ticketfolder=None, - private=True, - ) - self.session.commit() - self.assertEqual( - msg, - [ - 'Issue status updated to: Closed (was: Open)', - 'Issue close_status updated to: Invalid' - ] - ) - - repo = pagure.lib._get_project(self.session, 'test') - self.assertEqual(repo.open_tickets, 1) - self.assertEqual(repo.open_tickets_public, 1) - self.assertEqual(repo.issues[1].status, 'Closed') - self.assertEqual(repo.issues[1].close_status, 'Invalid') - - @patch('pagure.lib.git.update_git') - @patch('pagure.lib.notify.send_email') - def test_edit_issue_close_status(self, p_send_email, p_ugt): - """ Test the edit_issue of pagure.lib. """ - p_send_email.return_value = True - p_ugt.return_value = True - - self.test_new_issue() - - repo = pagure.lib._get_project(self.session, 'test') - issue = pagure.lib.search_issues(self.session, repo, issueid=2) - self.assertEqual(issue.status, 'Open') - self.assertEqual(issue.close_status, None) - - repo = pagure.lib._get_project(self.session, 'test') - self.assertEqual(repo.open_tickets, 2) - self.assertEqual(repo.open_tickets_public, 2) - - # Edit the issue, providing just a close_status should also close - # the ticket - msg = pagure.lib.edit_issue( - session=self.session, - issue=issue, - user='pingou', - close_status='Fixed', - ticketfolder=None) - self.session.commit() - self.assertEqual(msg, ['Issue close_status updated to: Fixed']) - - issue = pagure.lib.search_issues(self.session, repo, issueid=2) - self.assertEqual(issue.status, 'Closed') - self.assertEqual(issue.close_status, 'Fixed') - - repo = pagure.lib._get_project(self.session, 'test') - self.assertEqual(repo.open_tickets, 1) - self.assertEqual(repo.open_tickets_public, 1) - - # Edit the issue, editing the status to open, should reset the - # close_status - msg = pagure.lib.edit_issue( - session=self.session, - issue=issue, - user='pingou', - ticketfolder=None, - status='Open', - ) - self.session.commit() - self.assertEqual( - msg, ['Issue status updated to: Open (was: Closed)']) - - issue = pagure.lib.search_issues(self.session, repo, issueid=2) - self.assertEqual(issue.status, 'Open') - self.assertEqual(issue.close_status, None) - - repo = pagure.lib._get_project(self.session, 'test') - self.assertEqual(repo.open_tickets, 2) - self.assertEqual(repo.open_tickets_public, 2) - - @patch('pagure.lib.git.update_git') - @patch('pagure.lib.notify.send_email') - def test_edit_issue_priority(self, p_send_email, p_ugt): - """ Test the edit_issue of pagure.lib when changing the priority. - """ - p_send_email.return_value = True - p_ugt.return_value = True - - self.test_new_issue() - - repo = pagure.get_authorized_project(self.session, 'test') - issue = pagure.lib.search_issues(self.session, repo, issueid=2) - - # Set some priorities to the repo - repo = pagure.get_authorized_project(self.session, 'test') - repo.priorities = {'1': 'High', '2': 'Normal'} - self.session.add(repo) - self.session.commit() - - self.assertEqual(repo.open_tickets, 2) - self.assertEqual(repo.open_tickets_public, 2) - - # Edit the issue -- Wrong priority value: No changes - msg = pagure.lib.edit_issue( - session=self.session, - issue=issue, - user='pingou', - ticketfolder=None, - priority=3, - ) - self.session.commit() - self.assertEqual(msg, None) - - # Edit the issue -- Good priority - msg = pagure.lib.edit_issue( - session=self.session, - issue=issue, - user='pingou', - ticketfolder=None, - priority=2, - ) - self.session.commit() - self.assertEqual( - msg, - [ - 'Issue priority set to: Normal' - ] - ) - - # Edit the issue -- Update priority - msg = pagure.lib.edit_issue( - session=self.session, - issue=issue, - user='pingou', - ticketfolder=None, - priority=1, - ) - self.session.commit() - self.assertEqual( - msg, - [ - 'Issue priority set to: High (was: Normal)' - ] - ) - - @patch('pagure.lib.git.update_git') - @patch('pagure.lib.notify.send_email') - def test_edit_issue_depending(self, p_send_email, p_ugt): - """ Test the edit_issue of pagure.lib when the issue depends on - another. - """ - p_send_email.return_value = True - p_ugt.return_value = True - - tests.create_projects(self.session) - repo = pagure.get_authorized_project(self.session, 'test') - - # Create 3 issues - msg = pagure.lib.new_issue( - session=self.session, - repo=repo, - title='Test issue #1', - content='We should work on this for the second time', - user='foo', - status='Open', - ticketfolder=None - ) - self.session.commit() - self.assertEqual(msg.title, 'Test issue #1') - - msg = pagure.lib.new_issue( - session=self.session, - repo=repo, - title='Test issue #2', - content='We should work on this for the second time', - user='foo', - status='Open', - ticketfolder=None - ) - self.session.commit() - self.assertEqual(msg.title, 'Test issue #2') - - msg = pagure.lib.new_issue( - session=self.session, - repo=repo, - title='Test issue #3', - content='We should work on this for the second time', - user='foo', - status='Open', - ticketfolder=None - ) - self.session.commit() - self.assertEqual(msg.title, 'Test issue #3') - - issue = pagure.lib.search_issues(self.session, repo, issueid=2) - - self.assertEqual(repo.open_tickets, 3) - self.assertEqual(repo.open_tickets_public, 3) - - # Make issue #2 blocking on issue #1 - msgs = pagure.lib.update_blocked_issue( - self.session, - repo, - issue, - blocks=['1'], - username='pingou', - ticketfolder=None, - ) - self.assertEqual(msgs, ['Issue marked as blocking: #1']) - - # Make issue #2 depend on issue #3 - msgs = pagure.lib.update_dependency_issue( - self.session, - repo, - issue, - depends=['3'], - username='pingou', - ticketfolder=None, - ) - self.assertEqual(msgs, ['Issue marked as depending on: #3']) - - # Edit the issue #3 - issue = pagure.lib.search_issues(self.session, repo, issueid=3) - msg = pagure.lib.edit_issue( - session=self.session, - issue=issue, - user='pingou', - ticketfolder=None) - self.session.commit() - self.assertEqual(msg, None) - - msg = pagure.lib.edit_issue( - session=self.session, - issue=issue, - user='pingou', - ticketfolder=None, - title='Foo issue #2', - content='We should work on this period', - status='Closed', - close_status='Invalid', - private=True, - ) - self.session.commit() - self.assertEqual( - msg, - [ - 'Issue status updated to: Closed (was: Open)', - 'Issue close_status updated to: Invalid', - 'Issue private status set to: True' - ] - ) - - self.assertEqual(repo.open_tickets, 2) - self.assertEqual(repo.open_tickets_public, 2) - - @patch('pagure.lib.REDIS', MagicMock(return_value=True)) - @patch('pagure.lib.git.update_git', MagicMock(return_value=True)) - @patch('pagure.lib.notify.send_email', MagicMock(return_value=True)) - def test_add_issue_dependency(self): - """ Test the add_issue_dependency of pagure.lib. """ - - self.test_new_issue() - repo = pagure.lib._get_project(self.session, 'test') - issue = pagure.lib.search_issues(self.session, repo, issueid=1) - issue_blocked = pagure.lib.search_issues( - self.session, repo, issueid=2) - - # Before - self.assertEqual(issue.parents, []) - self.assertEqual(issue.children, []) - self.assertEqual(issue_blocked.parents, []) - self.assertEqual(issue_blocked.children, []) - - self.assertRaises( - pagure.exceptions.PagureException, - pagure.lib.add_issue_dependency, - session=self.session, - issue=issue, - issue_blocked=issue, - user='pingou', - ticketfolder=None) - - msg = pagure.lib.add_issue_dependency( - session=self.session, - issue=issue, - issue_blocked=issue_blocked, - user='pingou', - ticketfolder=None) - self.session.commit() - self.assertEqual(msg, 'Issue marked as depending on: #2') - - # After - self.assertEqual(len(issue.parents), 0) - self.assertEqual(issue.parents, []) - self.assertEqual(len(issue.children), 1) - self.assertEqual(issue.children[0].id, 2) - self.assertEqual(issue.depending_text, []) - self.assertEqual(issue.blocking_text, [2]) +class PagureLibtests(tests.Modeltests): + """ Tests for pagure.lib """ - self.assertEqual(len(issue_blocked.children), 0) - self.assertEqual(issue_blocked.children, []) - self.assertEqual(len(issue_blocked.parents), 1) - self.assertEqual(issue_blocked.parents[0].id, 1) - self.assertEqual(issue_blocked.depending_text, [1]) - self.assertEqual(issue_blocked.blocking_text, []) + def test_get_next_id(self): + """ Test the get_next_id function of pagure.lib. """ + tests.create_projects(self.session) + self.assertEqual(1, pagure.lib.get_next_id(self.session, 1)) @patch('pagure.lib.REDIS') @patch('pagure.lib.git.update_git', MagicMock(return_value=True)) @@ -905,13 +44,42 @@ class PagureLibtests(tests.Modeltests): """ Test the edit_issue of pagure.lib. """ mock_redis.return_value = True - self.test_add_issue_comment() + tests.create_projects(self.session) repo = pagure.lib._get_project(self.session, 'test') - self.assertEqual(repo.open_tickets, 2) - self.assertEqual(repo.open_tickets_public, 2) + pagure.lib.add_user_to_project( + session=self.session, + project=repo, + new_user='foo', + user='pingou' + ) - self.assertEqual(mock_redis.publish.call_count, 0) + # Create issues to play with + pagure.lib.new_issue( + session=self.session, + repo=repo, + title='Test issue', + content='We should work on this', + user='pingou', + ticketfolder=None + ) + + issue = pagure.lib.search_issues(self.session, repo, issueid=1) + + pagure.lib.add_issue_comment( + session=self.session, + issue=issue, + comment='Hey look a comment!', + user='foo', + ticketfolder=None + ) + + self.session.commit() + + self.assertEqual(repo.open_tickets, 1) + self.assertEqual(repo.open_tickets_public, 1) + + self.assertEqual(mock_redis.publish.call_count, 4) # Before issue = pagure.lib.search_issues(self.session, repo, issueid=1) @@ -928,7 +96,7 @@ class PagureLibtests(tests.Modeltests): folder=None) self.session.commit() self.assertEqual(msg, 'Comment updated') - self.assertEqual(mock_redis.publish.call_count, 2) + self.assertEqual(mock_redis.publish.call_count, 6) # After issue = pagure.lib.search_issues(self.session, repo, issueid=1) @@ -940,14 +108,44 @@ class PagureLibtests(tests.Modeltests): @patch('pagure.lib.notify.send_email', MagicMock(return_value=True)) def test_edit_comment_private(self, mock_redis): """ Test the edit_issue of pagure.lib. """ - - self.test_add_issue_comment_private() + mock_redis.return_value = True + tests.create_projects(self.session) repo = pagure.lib._get_project(self.session, 'test') + pagure.lib.add_user_to_project( + session=self.session, + project=repo, + new_user='foo', + user='pingou' + ) + + pagure.lib.new_issue( + session=self.session, + repo=repo, + title='Test issue #1', + content='We should work on this for the second time', + user='foo', + status='Open', + ticketfolder=None, + private=True, + ) + + issue = pagure.lib.search_issues(self.session, repo, issueid=1) + + pagure.lib.add_issue_comment( + session=self.session, + issue=issue, + comment='Hey look a comment!', + user='foo', + ticketfolder=None + ) + + self.session.commit() + self.assertEqual(repo.open_tickets, 1) self.assertEqual(repo.open_tickets_public, 0) - self.assertEqual(mock_redis.publish.call_count, 0) + self.assertEqual(mock_redis.publish.call_count, 2) # Before issue = pagure.lib.search_issues(self.session, repo, issueid=1) @@ -964,7 +162,7 @@ class PagureLibtests(tests.Modeltests): folder=None) self.session.commit() self.assertEqual(msg, 'Comment updated') - self.assertEqual(mock_redis.publish.call_count, 1) + self.assertEqual(mock_redis.publish.call_count, 3) # After issue = pagure.lib.search_issues(self.session, repo, issueid=1) @@ -978,7 +176,38 @@ class PagureLibtests(tests.Modeltests): """ Test the add_tag_obj of pagure.lib. """ mock_redis.return_value=True - self.test_edit_issue() + tests.create_projects(self.session) + + repo = pagure.lib._get_project(self.session, 'test') + pagure.lib.add_user_to_project( + session=self.session, + project=repo, + new_user='foo', + user='pingou' + ) + + # Create issues to play with + pagure.lib.new_issue( + session=self.session, + repo=repo, + title='Test issue', + content='We should work on this', + user='pingou', + ticketfolder=None + ) + + pagure.lib.new_issue( + session=self.session, + repo=repo, + title='Test issue #2', + content='We should work on this for the second time', + user='foo', + status='Open', + ticketfolder=None + ) + + self.session.commit() + repo = pagure.lib._get_project(self.session, 'test') issue = pagure.lib.search_issues(self.session, repo, issueid=1) self.assertFalse(issue.private) @@ -1145,332 +374,74 @@ class PagureLibtests(tests.Modeltests): msgs = pagure.lib.edit_issue_tags( session=self.session, - project=repo, - old_tag='tag1', - new_tag='tag2', - new_tag_description='lorem ipsum', - new_tag_color='black', - user='pingou', - ticketfolder=None, - ) - self.session.commit() - self.assertEqual( - msgs, - ['Edited tag: tag1()[DeepSkyBlue] to tag2(lorem ipsum)[black]'] - ) - - # Try editing the tag without changing anything - self.assertRaises( - pagure.exceptions.PagureException, - pagure.lib.edit_issue_tags, - session=self.session, - project=repo, - old_tag='tag2', - new_tag='tag2', - new_tag_description='lorem ipsum', - new_tag_color='black', - user='pingou', - ticketfolder=None, - ) - - # Add a new tag - msg = pagure.lib.add_tag_obj( - session=self.session, - obj=issue, - tags='tag3', - user='pingou', - ticketfolder=None) - self.session.commit() - self.assertEqual(msg, 'Issue tagged with: tag3') - self.assertEqual([tag.tag for tag in issue.tags], ['tag2', 'tag3']) - - # Attempt to rename an existing tag into another existing one - self.assertRaises( - pagure.exceptions.PagureException, - pagure.lib.edit_issue_tags, - session=self.session, - project=repo, - old_tag='tag2', - new_tag='tag3', - new_tag_description='lorem ipsum', - new_tag_color='red', - user='pingou', - ticketfolder=None, - ) - - # Rename an existing tag - msgs = pagure.lib.edit_issue_tags( - session=self.session, - project=repo, - old_tag='tag2', - new_tag='tag4', - new_tag_description='ipsum lorem', - new_tag_color='purple', - user='pingou', - ticketfolder=None, - ) - self.session.commit() - self.assertEqual(msgs, ['Edited tag: tag2(lorem ipsum)[black] to tag4(ipsum lorem)[purple]']) - - @patch('pagure.lib.git.update_git') - @patch('pagure.lib.notify.send_email') - def test_search_issues(self, p_send_email, p_ugt): - """ Test the search_issues of pagure.lib. """ - p_send_email.return_value = True - p_ugt.return_value = True - - self.test_edit_issue() - repo = pagure.lib._get_project(self.session, 'test') - - # All issues - issues = pagure.lib.search_issues(self.session, repo) - self.assertEqual(len(issues), 2) - self.assertEqual(issues[1].id, 1) - self.assertEqual(issues[1].project_id, 1) - self.assertEqual(issues[1].status, 'Open') - self.assertEqual(issues[1].tags, []) - self.assertEqual(issues[0].id, 2) - self.assertEqual(issues[0].project_id, 1) - self.assertEqual(issues[0].status, 'Closed') - self.assertEqual(issues[0].close_status, 'Invalid') - self.assertEqual(issues[0].tags, []) - - # Issues by status - issues = pagure.lib.search_issues( - self.session, repo, status='Closed') - self.assertEqual(len(issues), 1) - self.assertEqual(issues[0].id, 2) - self.assertEqual(issues[0].project_id, 1) - self.assertEqual(issues[0].status, 'Closed') - self.assertEqual(issues[0].close_status, 'Invalid') - self.assertEqual(issues[0].tags, []) - - # Issues closed - issues = pagure.lib.search_issues( - self.session, repo, closed=True) - self.assertEqual(len(issues), 1) - self.assertEqual(issues[0].id, 2) - self.assertEqual(issues[0].project_id, 1) - self.assertEqual(issues[0].status, 'Closed') - self.assertEqual(issues[0].close_status, 'Invalid') - self.assertEqual(issues[0].tags, []) - - # Issues by tag - issues = pagure.lib.search_issues(self.session, repo, tags='foo') - self.assertEqual(len(issues), 0) - issues = pagure.lib.search_issues(self.session, repo, tags='!foo') - self.assertEqual(len(issues), 2) - - # Issue by id - issue = pagure.lib.search_issues(self.session, repo, issueid=1) - self.assertEqual(issue.title, 'Test issue') - self.assertEqual(issue.user.user, 'pingou') - self.assertEqual(issue.tags, []) - - # Issues by authors - issues = pagure.lib.search_issues(self.session, repo, author='foo') - self.assertEqual(len(issues), 1) - self.assertEqual(issues[0].id, 2) - self.assertEqual(issues[0].project_id, 1) - self.assertEqual(issues[0].status, 'Closed') - self.assertEqual(issues[0].close_status, 'Invalid') - self.assertEqual(issues[0].tags, []) - - # Issues by assignee - issues = pagure.lib.search_issues(self.session, repo, assignee='foo') - self.assertEqual(len(issues), 0) - issues = pagure.lib.search_issues(self.session, repo, assignee='!foo') - self.assertEqual(len(issues), 2) - - issues = pagure.lib.search_issues(self.session, repo, private='foo') - self.assertEqual(len(issues), 2) - - @patch('pagure.lib.REDIS', MagicMock(return_value=True)) - @patch('pagure.lib.git.update_git', MagicMock(return_value=True)) - @patch('pagure.lib.notify.send_email', MagicMock(return_value=True)) - def test_add_issue_assignee(self): - """ Test the add_issue_assignee of pagure.lib. """ - - self.test_new_issue() - repo = pagure.lib._get_project(self.session, 'test') - issue = pagure.lib.search_issues(self.session, repo, issueid=2) - - # Before - issues = pagure.lib.search_issues( - self.session, repo, assignee='pingou') - self.assertEqual(len(issues), 0) - - # Test when it fails - self.assertRaises( - pagure.exceptions.PagureException, - pagure.lib.add_issue_assignee, - session=self.session, - issue=issue, - assignee='foo@foobar.com', - user='foo@pingou.com', - ticketfolder=None, - ) - - self.assertRaises( - pagure.exceptions.PagureException, - pagure.lib.add_issue_assignee, - session=self.session, - issue=issue, - assignee='foo@bar.com', - user='foo@foopingou.com', - ticketfolder=None, - ) - - # Set the assignee by its email - msg = pagure.lib.add_issue_assignee( - session=self.session, - issue=issue, - assignee='foo@bar.com', - user='foo@pingou.com', - ticketfolder=None) - self.session.commit() - self.assertEqual(msg, 'Issue assigned to foo@bar.com') - - # Change the assignee to someone else by its username - msg = pagure.lib.add_issue_assignee( - session=self.session, - issue=issue, - assignee='pingou', - user='pingou', - ticketfolder=None) - self.session.commit() - self.assertEqual(msg, 'Issue assigned to pingou (was: foo)') - - # After -- Searches by assignee - issues = pagure.lib.search_issues( - self.session, repo, assignee='pingou') - self.assertEqual(len(issues), 1) - self.assertEqual(issues[0].id, 2) - self.assertEqual(issues[0].project_id, 1) - self.assertEqual(issues[0].status, 'Open') - self.assertEqual(issues[0].tags, []) - - issues = pagure.lib.search_issues( - self.session, repo, assignee=True) - self.assertEqual(len(issues), 1) - self.assertEqual(issues[0].id, 2) - self.assertEqual(issues[0].title, 'Test issue #2') - self.assertEqual(issues[0].project_id, 1) - self.assertEqual(issues[0].status, 'Open') - self.assertEqual(issues[0].tags, []) - - issues = pagure.lib.search_issues( - self.session, repo, assignee=False) - self.assertEqual(len(issues), 1) - self.assertEqual(issues[0].id, 1) - self.assertEqual(issues[0].title, 'Test issue') - self.assertEqual(issues[0].project_id, 1) - self.assertEqual(issues[0].status, 'Open') - self.assertEqual(issues[0].tags, []) - - # Reset the assignee to no-one - msg = pagure.lib.add_issue_assignee( - session=self.session, - issue=issue, - assignee=None, + project=repo, + old_tag='tag1', + new_tag='tag2', + new_tag_description='lorem ipsum', + new_tag_color='black', user='pingou', - ticketfolder=None) + ticketfolder=None, + ) self.session.commit() - self.assertEqual(msg, 'Assignee reset') - - issues = pagure.lib.search_issues( - self.session, repo, assignee=False) - self.assertEqual(len(issues), 2) - self.assertEqual(issues[0].id, 2) - self.assertEqual(issues[1].id, 1) - - issues = pagure.lib.search_issues( - self.session, repo, assignee=True) - self.assertEqual(len(issues), 0) - - @patch('pagure.lib.REDIS', MagicMock(return_value=True)) - @patch('pagure.lib.git.update_git', MagicMock(return_value=True)) - @patch('pagure.lib.notify.send_email', MagicMock(return_value=True)) - def test_add_issue_comment(self): - """ Test the add_issue_comment of pagure.lib. """ - - self.test_new_issue() - repo = pagure.lib._get_project(self.session, 'test') + self.assertEqual( + msgs, + ['Edited tag: tag1()[DeepSkyBlue] to tag2(lorem ipsum)[black]'] + ) - # Before - issue = pagure.lib.search_issues(self.session, repo, issueid=1) - self.assertEqual(len(issue.comments), 0) + # Try editing the tag without changing anything + self.assertRaises( + pagure.exceptions.PagureException, + pagure.lib.edit_issue_tags, + session=self.session, + project=repo, + old_tag='tag2', + new_tag='tag2', + new_tag_description='lorem ipsum', + new_tag_color='black', + user='pingou', + ticketfolder=None, + ) - # Set the assignee by its email - msg = pagure.lib.add_issue_assignee( + # Add a new tag + msg = pagure.lib.add_tag_obj( session=self.session, - issue=issue, - assignee='foo@bar.com', - user='foo@pingou.com', + obj=issue, + tags='tag3', + user='pingou', ticketfolder=None) self.session.commit() - self.assertEqual(msg, 'Issue assigned to foo@bar.com') + self.assertEqual(msg, 'Issue tagged with: tag3') + self.assertEqual([tag.tag for tag in issue.tags], ['tag2', 'tag3']) - # Add a comment to that issue - msg = pagure.lib.add_issue_comment( + # Attempt to rename an existing tag into another existing one + self.assertRaises( + pagure.exceptions.PagureException, + pagure.lib.edit_issue_tags, session=self.session, - issue=issue, - comment='Hey look a comment!', - user='foo', - ticketfolder=None + project=repo, + old_tag='tag2', + new_tag='tag3', + new_tag_description='lorem ipsum', + new_tag_color='red', + user='pingou', + ticketfolder=None, ) - self.session.commit() - self.assertEqual(msg, 'Comment added') - - # After - issue = pagure.lib.search_issues(self.session, repo, issueid=1) - self.assertEqual(len(issue.comments), 1) - self.assertEqual(issue.comments[0].comment, 'Hey look a comment!') - self.assertEqual(issue.comments[0].user.user, 'foo') - - @patch('pagure.lib.REDIS', MagicMock(return_value=True)) - @patch('pagure.lib.git.update_git', MagicMock(return_value=True)) - @patch('pagure.lib.notify.send_email', MagicMock(return_value=True)) - def test_add_issue_comment_private(self): - """ Test the add_issue_comment of pagure.lib. """ - tests.create_projects(self.session) - project = pagure.lib._get_project(self.session, 'test') - msg = pagure.lib.new_issue( + # Rename an existing tag + msgs = pagure.lib.edit_issue_tags( session=self.session, - repo=project, - title='Test issue #1', - content='We should work on this for the second time', - user='foo', - status='Open', + project=repo, + old_tag='tag2', + new_tag='tag4', + new_tag_description='ipsum lorem', + new_tag_color='purple', + user='pingou', ticketfolder=None, - private=True, ) self.session.commit() - self.assertEqual(msg.title, 'Test issue #1') - self.assertEqual(project.open_tickets, 1) - self.assertEqual(project.open_tickets_public, 0) - - # Before - issue = pagure.lib.search_issues(self.session, project, issueid=1) - self.assertEqual(len(issue.comments), 0) + self.assertEqual(msgs, ['Edited tag: tag2(lorem ipsum)[black] to tag4(ipsum lorem)[purple]']) - # Add a comment to that issue - msg = pagure.lib.add_issue_comment( - session=self.session, - issue=issue, - comment='Hey look a comment!', - user='foo', - ticketfolder=None - ) - self.session.commit() - self.assertEqual(msg, 'Comment added') - # After - issue = pagure.lib.search_issues(self.session, project, issueid=1) - self.assertEqual(len(issue.comments), 1) - self.assertEqual(issue.comments[0].comment, 'Hey look a comment!') - self.assertEqual(issue.comments[0].user.user, 'foo') @patch('pagure.lib.notify.send_email') def test_add_user_to_project(self, p_send_email): @@ -1972,98 +943,6 @@ class PagureLibtests(tests.Modeltests): self.assertTrue(repo.settings['project_documentation']) self.assertFalse(repo.settings['pull_requests']) - def test_search_issues_milestones_invalid(self): - """ Test the search_issues of pagure.lib. """ - - self.test_edit_issue() - repo = pagure.lib._get_project(self.session, 'test') - self.assertEqual(len(repo.issues), 2) - - issues = pagure.lib.search_issues( - self.session, repo, milestones='foo') - self.assertEqual(len(issues), 0) - - issues = pagure.lib.search_issues( - self.session, repo, milestones='foo', no_milestones=True) - self.assertEqual(len(issues), 2) - - def test_search_issues_custom_search(self): - """ Test the search_issues of pagure.lib. """ - - self.test_edit_issue() - repo = pagure.lib._get_project(self.session, 'test') - self.assertEqual(len(repo.issues), 2) - - issues = pagure.lib.search_issues( - self.session, repo, custom_search={'foo': '*'}) - self.assertEqual(len(issues), 0) - - def test_search_issues_offset(self): - """ Test the search_issues of pagure.lib. """ - - self.test_edit_issue() - repo = pagure.lib._get_project(self.session, 'test') - - issues = pagure.lib.search_issues(self.session, repo) - self.assertEqual(len(issues), 2) - self.assertEqual([i.id for i in issues], [2, 1]) - - issues = pagure.lib.search_issues(self.session, repo, offset=1) - self.assertEqual(len(issues), 1) - self.assertEqual([i.id for i in issues], [1]) - - def test_search_issues_tags(self): - """ Test the search_issues of pagure.lib. """ - - self.test_edit_issue() - repo = pagure.lib._get_project(self.session, 'test') - self.assertEqual(len(repo.issues), 2) - - # Add `tag1` to one issues and `tag2` only to the other one - issue = pagure.lib.search_issues(self.session, repo, issueid=1) - msg = pagure.lib.add_tag_obj( - session=self.session, - obj=issue, - tags='tag1', - user='pingou', - ticketfolder=None) - self.session.commit() - self.assertEqual(msg, 'Issue tagged with: tag1') - - issue = pagure.lib.search_issues(self.session, repo, issueid=2) - msg = pagure.lib.add_tag_obj( - session=self.session, - obj=issue, - tags='tag2', - user='pingou', - ticketfolder=None) - self.session.commit() - self.assertEqual(msg, 'Issue tagged with: tag2') - - # Search all issues tagged with `tag1` - issues = pagure.lib.search_issues(self.session, repo, tags='tag1') - self.assertEqual(len(issues), 1) - self.assertEqual(issues[0].id, 1) - self.assertEqual(issues[0].project_id, 1) - self.assertEqual([tag.tag for tag in issues[0].tags], ['tag1']) - - # Search all issues *not* tagged with `tag1` - issues = pagure.lib.search_issues(self.session, repo, tags='!tag1') - self.assertEqual(len(issues), 1) - self.assertEqual(issues[0].id, 2) - self.assertEqual(issues[0].project_id, 1) - self.assertEqual( - [tag.tag for tag in issues[0].tags], ['tag2']) - - # Search all issues *not* tagged with `tag1` but tagged with `tag2` - issues = pagure.lib.search_issues( - self.session, repo, tags=['!tag1', 'tag2']) - self.assertEqual(len(issues), 1) - self.assertEqual(issues[0].id, 2) - self.assertEqual(issues[0].project_id, 1) - self.assertEqual( - [tag.tag for tag in issues[0].tags], ['tag2']) - def test_get_tags_of_project(self): """ Test the get_tags_of_project of pagure.lib. """ @@ -2845,189 +1724,49 @@ class PagureLibtests(tests.Modeltests): p_send_email.return_value = True p_ugt.return_value = True - self.test_add_issue_comment() - - repo = pagure.lib._get_project(self.session, 'test') - issue = pagure.lib.search_issues(self.session, repo, issueid=1) - - self.assertEqual( - pagure.lib.get_issue_comment(self.session, issue.uid, 10), - None - ) - - comment = pagure.lib.get_issue_comment(self.session, issue.uid, 1) - self.assertEqual(comment.comment, 'Hey look a comment!') - - @patch('pagure.lib.git.update_git') - @patch('pagure.lib.notify.send_email') - def test_get_issue_by_uid(self, p_send_email, p_ugt): - """ Test the get_issue_by_uid of pagure.lib. """ - p_send_email.return_value = True - p_ugt.return_value = True - - self.test_new_issue() - - repo = pagure.lib._get_project(self.session, 'test') - issue = pagure.lib.search_issues(self.session, repo, issueid=1) - - self.assertEqual( - pagure.lib.get_issue_by_uid(self.session, 'foobar'), - None - ) - - new_issue = pagure.lib.get_issue_by_uid(self.session, issue.uid) - self.assertEqual(issue, new_issue) - - @patch('pagure.lib.git.update_git') - @patch('pagure.lib.notify.send_email') - def test_update_tags(self, p_send_email, p_ugt): - """ Test the update_tags of pagure.lib. """ - p_send_email.return_value = True - p_ugt.return_value = True + tests.create_projects(self.session) - self.test_new_issue() repo = pagure.lib._get_project(self.session, 'test') - issue = pagure.lib.search_issues(self.session, repo, issueid=1) - - # before - self.assertEqual(repo.tags_colored, []) - self.assertEqual(issue.tags_text, []) - - messages = pagure.lib.update_tags( - self.session, issue, 'tag', 'pingou', ticketfolder=None) - self.assertEqual(messages, ['Issue tagged with: tag']) - - # after - repo = pagure.get_authorized_project(self.session, 'test') - issue = pagure.lib.search_issues(self.session, repo, issueid=1) - - self.assertEqual( - [t.tag for t in repo.tags_colored], ['tag']) - self.assertEqual(issue.tags_text, ['tag']) - - # Replace the tag by two others - messages = pagure.lib.update_tags( - self.session, issue, ['tag2', 'tag3'], 'pingou', - ticketfolder=None) - self.assertEqual( - messages, [ - 'Issue tagged with: tag2, tag3', - 'Issue **un**tagged with: tag' - ] + pagure.lib.add_user_to_project( + session=self.session, + project=repo, + new_user='foo', + user='pingou' ) - # after - repo = pagure.get_authorized_project(self.session, 'test') - issue = pagure.lib.search_issues(self.session, repo, issueid=1) - - self.assertEqual( - sorted([t.tag for t in repo.tags_colored]), - ['tag', 'tag2', 'tag3']) - self.assertEqual(issue.tags_text, ['tag2', 'tag3']) - - - @patch('pagure.lib.git.update_git') - @patch('pagure.lib.notify.send_email') - def test_update_dependency_issue(self, p_send_email, p_ugt): - """ Test the update_dependency_issue of pagure.lib. """ - p_send_email.return_value = True - p_ugt.return_value = True - - self.test_new_issue() - repo = pagure.lib._get_project(self.session, 'test') - issue = pagure.lib.search_issues(self.session, repo, issueid=1) - - self.assertEqual(repo.open_tickets, 2) - self.assertEqual(repo.open_tickets_public, 2) - # Create issues to play with - msg = pagure.lib.new_issue( + pagure.lib.new_issue( session=self.session, repo=repo, - title='Test issue #3', - content='We should work on this (3rd time!)', + title='Test issue', + content='We should work on this', user='pingou', - ticketfolder=None, - private=True, + ticketfolder=None ) - self.session.commit() - self.assertEqual(msg.title, 'Test issue #3') - self.assertEqual(repo.open_tickets, 3) - self.assertEqual(repo.open_tickets_public, 2) - - # before - self.assertEqual(issue.tags_text, []) - self.assertEqual(issue.depending_text, []) - self.assertEqual(issue.blocking_text, []) - - messages = pagure.lib.update_dependency_issue( - self.session, repo, issue, '2', 'pingou', ticketfolder=None) - self.assertEqual(messages, ['Issue marked as depending on: #2']) - messages = pagure.lib.update_dependency_issue( - self.session, repo, issue, ['3', '4', 5], 'pingou', - ticketfolder=None) - self.assertEqual( - messages, - [ - 'Issue marked as depending on: #3', - 'Issue marked as depending on: #4', - 'Issue marked as depending on: #5', - 'Issue **un**marked as depending on: #2' - ] + pagure.lib.new_issue( + session=self.session, + repo=repo, + title='Test issue #2', + content='We should work on this for the second time', + user='foo', + status='Open', + ticketfolder=None ) - # after - self.assertEqual(issue.tags_text, []) - self.assertEqual(issue.depending_text, [3]) - self.assertEqual(issue.blocking_text, []) - - @patch('pagure.lib.git.update_git') - @patch('pagure.lib.notify.send_email') - def test_update_blocked_issue(self, p_send_email, p_ugt): - """ Test the update_blocked_issue of pagure.lib. """ - p_send_email.return_value = True - p_ugt.return_value = True + self.session.commit() - self.test_new_issue() repo = pagure.lib._get_project(self.session, 'test') issue = pagure.lib.search_issues(self.session, repo, issueid=1) - # Create issues to play with - msg = pagure.lib.new_issue( - session=self.session, - repo=repo, - title='Test issue #3', - content='We should work on this (3rd time!)', - user='pingou', - ticketfolder=None, - private=True, - ) - self.session.commit() - self.assertEqual(msg.title, 'Test issue #3') - - # before - self.assertEqual(issue.tags_text, []) - self.assertEqual(issue.depending_text, []) - self.assertEqual(issue.blocking_text, []) - - messages = pagure.lib.update_blocked_issue( - self.session, repo, issue, '2', 'pingou', ticketfolder=None) - self.assertEqual(messages, ['Issue marked as blocking: #2']) - messages = pagure.lib.update_blocked_issue( - self.session, repo, issue, ['3', '4', 5], 'pingou', - ticketfolder=None) self.assertEqual( - messages, [ - 'Issue marked as blocking: #3', - 'Issue marked as blocking: #4', - 'Issue marked as blocking: #5', - 'Issue **un**marked as blocking: #2']) - - # after - self.assertEqual(issue.tags_text, []) - self.assertEqual(issue.depending_text, []) - self.assertEqual(issue.blocking_text, [3]) + pagure.lib.get_issue_comment(self.session, issue.uid, 10), + None + ) + + comment = pagure.lib.get_issue_comment(self.session, issue.uid, 1) + self.assertEqual(comment.comment, 'Hey look a comment!') + @patch('pagure.lib.notify.send_email') def test_add_pull_request_assignee(self, mockemail): From 25a2b34477d801e44a703e27c7a6232df13f6a40 Mon Sep 17 00:00:00 2001 From: Clement Verna Date: Jul 03 2017 18:43:00 +0000 Subject: [PATCH 6/7] Fix the failling test in test_pagure_lib Signed-off-by: Clement Verna --- diff --git a/tests/test_pagure_lib.py b/tests/test_pagure_lib.py index 7e2e10d..26a5187 100644 --- a/tests/test_pagure_lib.py +++ b/tests/test_pagure_lib.py @@ -1665,12 +1665,51 @@ class PagureLibtests(tests.Modeltests): def test_remove_issue_dependency(self): """ Test remove_issue_dependency of pagure.lib. """ - self.test_add_issue_dependency() + tests.create_projects(self.session) + repo = pagure.lib._get_project(self.session, 'test') + pagure.lib.add_user_to_project( + session=self.session, + project=repo, + new_user='foo', + user='pingou' + ) + + # Create issues to play with + pagure.lib.new_issue( + session=self.session, + repo=repo, + title='Test issue', + content='We should work on this', + user='pingou', + ticketfolder=None + ) + + pagure.lib.new_issue( + session=self.session, + repo=repo, + title='Test issue #2', + content='We should work on this for the second time', + user='foo', + status='Open', + ticketfolder=None + ) + + self.session.commit() + issue = pagure.lib.search_issues(self.session, repo, issueid=1) issue_blocked = pagure.lib.search_issues( self.session, repo, issueid=2) + pagure.lib.add_issue_dependency( + session=self.session, + issue=issue, + issue_blocked=issue_blocked, + user='pingou', + ticketfolder=None) + + self.session.commit() + # Before self.assertEqual(len(issue.children), 1) self.assertEqual(issue.children[0].id, 2) @@ -1744,21 +1783,19 @@ class PagureLibtests(tests.Modeltests): ticketfolder=None ) - pagure.lib.new_issue( - session=self.session, - repo=repo, - title='Test issue #2', - content='We should work on this for the second time', - user='foo', - status='Open', - ticketfolder=None - ) - self.session.commit() repo = pagure.lib._get_project(self.session, 'test') issue = pagure.lib.search_issues(self.session, repo, issueid=1) + pagure.lib.add_issue_comment( + session=self.session, + issue=issue, + comment='Hey look a comment!', + user='foo', + ticketfolder=None + ) + self.assertEqual( pagure.lib.get_issue_comment(self.session, issue.uid, 10), None From 03f86dc5d4f7cde2edd9349d56168a50d3ea3f1e Mon Sep 17 00:00:00 2001 From: Clement Verna Date: Jul 03 2017 18:44:01 +0000 Subject: [PATCH 7/7] Introduce SimplePagureTest and nosetests parallel testing This commit create a new class SimplePagureTest that does not create a worker and broker. Tests that did not require the broker worker were modified to inherit from SimplePagureTest. This commit also introduce nosetests parallel testing. nosetests makes use of the cpu's core to execute the test in parallel. Signed-off-by: Clement Verna --- diff --git a/runtests.sh b/runtests.sh index 1a84849..3fa4091 100755 --- a/runtests.sh +++ b/runtests.sh @@ -2,4 +2,4 @@ PAGURE_CONFIG=`pwd`/tests/test_config \ PYTHONPATH=pagure \ -./nosetests --with-coverage --cover-erase --cover-package=pagure --with-pagureperf $* +./nosetests --with-coverage --cover-erase --cover-package=pagure --with-pagureperf --processes=-1 --process-timeout=600 $* diff --git a/tests/__init__.py b/tests/__init__.py index b0d21ad..18c75f4 100644 --- a/tests/__init__.py +++ b/tests/__init__.py @@ -140,11 +140,9 @@ def user_set(APP, user): yield -class Modeltests(unittest.TestCase): - """ Model tests. """ +class SimplePagureTest(unittest.TestCase): def __init__(self, method_name='runTest'): - """ Constructor. """ unittest.TestCase.__init__(self, method_name) self.session = None self.path = None @@ -171,14 +169,9 @@ class Modeltests(unittest.TestCase): perfrepo.reset_stats() perfrepo.REQUESTS = [] - def setUp(self): # pylint: disable=invalid-name - """ Set up the environnment, ran before every tests. """ - # Clean up test performance info - perfrepo.reset_stats() - perfrepo.REQUESTS = [] + def setUp(self): + self.perfReset() - pagure.REDIS = None - pagure.lib.REDIS = None if self.path is not None: raise Exception('Double init?!') self.path = tempfile.mkdtemp(prefix='pagure-tests-path-') @@ -199,44 +192,9 @@ class Modeltests(unittest.TestCase): with open(os.path.join(self.path, 'config'), 'w') as f: f.write(CONFIG_TEMPLATE % config_values) - # Create a broker - broker_url = os.path.join(self.path, 'broker') - - self.broker = subprocess.Popen( - ['/usr/bin/redis-server', '--unixsocket', broker_url, '--port', - '0', '--loglevel', 'warning', '--logfile', '/dev/null'], - stdout=None, stderr=None) - self.broker.poll() - if self.broker.returncode is not None: - raise Exception('Broker failed to start') - self.session = pagure.lib.model.create_tables( self.dbpath, acls=pagure.APP.config.get('ACLS', {})) - celery_broker_url = 'redis+socket://' + broker_url - pagure.APP.config['BROKER_URL'] = celery_broker_url - reload(pagure.lib.tasks) - - # Start a worker - # Using cocurrency 2 to test with some concurrency, but not be heavy - # Using eventlet so that worker.terminate kills everything - self.workerlog = open(os.path.join(self.path, 'worker.log'), 'w') - self.worker = subprocess.Popen( - ['/usr/bin/celery', '-A', 'pagure.lib.tasks', 'worker', - '--loglevel=info', '--concurrency=2', '--pool=eventlet', - '--without-gossip', '--without-mingle', '--quiet'], - env={'PAGURE_BROKER_URL': celery_broker_url, - 'PAGURE_CONFIG': os.path.join(self.path, 'config'), - 'PYTHONPATH': '.'}, - cwd=os.path.normpath(os.path.join(os.path.dirname(__file__), - '..')), - stdout=self.workerlog, - stderr=self.workerlog) - self.worker.poll() - if self.worker.returncode is not None: - raise Exception('Worker failed to start') - time.sleep(2) - # Create a couple of users item = pagure.lib.model.User( user='pingou', @@ -282,11 +240,8 @@ class Modeltests(unittest.TestCase): pagure.APP.config['ATTACHMENTS_FOLDER'] = os.path.join( self.path, 'attachments') self.app = pagure.APP.test_client() - self.app.get = create_maybe_waiter(self.app.get, self.app.get) - self.app.post = create_maybe_waiter(self.app.post, self.app.get) - def tearDown(self): # pylint: disable=invalid-name - """ Remove the test.db database if there is one. """ + def tearDown(self): self.session.close() # Clear DB @@ -295,6 +250,71 @@ class Modeltests(unittest.TestCase): db_name = self.dbpath.rsplit('/', 1)[1] requests.get('%s/clean/%s' % (FAITOUT_URL, db_name)) + # Remove testdir + shutil.rmtree(self.path) + self.path = None + + def get_csrf(self, url='/new'): + """Retrieve a CSRF token from given URL.""" + output = self.app.get(url) + self.assertEqual(output.status_code, 200) + + return output.data.split( + 'name="csrf_token" type="hidden" value="')[1].split('">')[0] + + +class Modeltests(SimplePagureTest): + """ Model tests. """ + + def setUp(self): # pylint: disable=invalid-name + """ Set up the environnment, ran before every tests. """ + # Clean up test performance info + super(Modeltests, self).setUp() + + pagure.REDIS = None + pagure.lib.REDIS = None + + # Create a broker + broker_url = os.path.join(self.path, 'broker') + + self.broker = subprocess.Popen( + ['/usr/bin/redis-server', '--unixsocket', broker_url, '--port', + '0', '--loglevel', 'warning', '--logfile', '/dev/null'], + stdout=None, stderr=None) + self.broker.poll() + if self.broker.returncode is not None: + raise Exception('Broker failed to start') + + celery_broker_url = 'redis+socket://' + broker_url + pagure.APP.config['BROKER_URL'] = celery_broker_url + reload(pagure.lib.tasks) + + # Start a worker + # Using cocurrency 2 to test with some concurrency, but not be heavy + # Using eventlet so that worker.terminate kills everything + self.workerlog = open(os.path.join(self.path, 'worker.log'), 'w') + self.worker = subprocess.Popen( + ['/usr/bin/celery', '-A', 'pagure.lib.tasks', 'worker', + '--loglevel=info', '--concurrency=2', '--pool=eventlet', + '--without-gossip', '--without-mingle', '--quiet'], + env={'PAGURE_BROKER_URL': celery_broker_url, + 'PAGURE_CONFIG': os.path.join(self.path, 'config'), + 'PYTHONPATH': '.'}, + cwd=os.path.normpath(os.path.join(os.path.dirname(__file__), + '..')), + stdout=self.workerlog, + stderr=self.workerlog) + self.worker.poll() + if self.worker.returncode is not None: + raise Exception('Worker failed to start') + time.sleep(2) + + self.app.get = create_maybe_waiter(self.app.get, self.app.get) + self.app.post = create_maybe_waiter(self.app.post, self.app.get) + + def tearDown(self): # pylint: disable=invalid-name + """ Remove the test.db database if there is one. """ + super(Modeltests, self).tearDown() # Terminate worker and broker # We just send a SIGKILL (kill -9), since when the test finishes, we # don't really care about the output of either worker or broker @@ -308,11 +328,7 @@ class Modeltests(unittest.TestCase): self.broker.wait() self.broker = None - # Remove testdir - shutil.rmtree(self.path) - self.path = None - - def get_csrf(self, url='/new', output=None): + def get_csrf(self, url='/new'): """Retrieve a CSRF token from given URL.""" if output is None: output = self.app.get(url) diff --git a/tests/lib/test_pagure_lib_acls.py b/tests/lib/test_pagure_lib_acls.py new file mode 100644 index 0000000..1bf8733 --- /dev/null +++ b/tests/lib/test_pagure_lib_acls.py @@ -0,0 +1,122 @@ +import unittest + +import tests +import pagure.lib + + +class PagureLibtests_search_acls(tests.SimplePagureTest): + """ + Test the pagure.lib search_acls methods + """ + + def setUp(self): + super(PagureLibtests_search_acls, self).setUp() + tests.create_projects(self.session) + tests.create_tokens(self.session) + tests.create_tokens_acl(self.session) + + def test_search_token_no_acls(self): + """ Test the search_token function of pagure.lib with no acls provided. """ + out = pagure.lib.search_token( + self.session, + [] + ) + self.assertEqual(len(out), 1) + self.assertEqual(out[0].id, 'aaabbbcccddd') + + def test_search_token_single_acls(self): + """ Test the search_token function of pagure.lib with only 1 acls provided """ + + out = pagure.lib.search_token( + self.session, + 'issue_create', + ) + self.assertEqual(len(out), 1) + self.assertEqual(out[0].id, 'aaabbbcccddd') + + def test_search_token_single_acls_user(self): + """ Test the search_token function of pagure.lib with 1 acls and a user""" + + out = pagure.lib.search_token( + self.session, + 'issue_create', + user='pingou', + ) + self.assertEqual(len(out), 1) + self.assertEqual(out[0].id, 'aaabbbcccddd') + + out = pagure.lib.search_token( + self.session, + 'issue_create', + user='foo', + ) + self.assertEqual(len(out), 0) + + def test_search_token_single_acls_active(self): + """ Test the search_token function of pagure.lib with a 1 active acls""" + + out = pagure.lib.search_token( + self.session, + 'issue_create', + active=True + ) + self.assertEqual(len(out), 1) + self.assertEqual(out[0].id, 'aaabbbcccddd') + + out = pagure.lib.search_token( + self.session, + 'issue_create', + expired=True + ) + self.assertEqual(len(out), 0) + + +class PagureLibtest_get_acls(tests.SimplePagureTest): + """ + Test the pagure.lib get_acls methods + """ + def test_get_acls(self): + """ Test the get_acls function of pagure.lib. """ + acls = pagure.lib.get_acls(self.session) + self.assertEqual( + [a.name for a in acls], + [ + 'create_project', + 'fork_project', + 'issue_assign', + 'issue_change_status', + 'issue_comment', + 'issue_create', + 'issue_subscribe', + 'issue_update', + 'issue_update_custom_fields', + 'issue_update_milestone', + 'modify_project', + 'pull_request_close', + 'pull_request_comment', + 'pull_request_flag', + 'pull_request_merge' + ] + ) + + def test_get_acls_restrict_one(self): + """ Test the get_acls function of pagure.lib. """ + acls = pagure.lib.get_acls(self.session, restrict='create_project') + self.assertEqual([a.name for a in acls], ['create_project']) + + def test_get_acls_restrict_two(self): + """ Test the get_acls function of pagure.lib. """ + acls = pagure.lib.get_acls( + self.session, restrict=['create_project', 'issue_create']) + self.assertEqual( + [a.name for a in acls], + ['create_project', 'issue_create']) + + def test_get_access_levels(self): + ''' Test the get_access_levels method in pagure.lib ''' + + acls = pagure.lib.get_access_levels(self.session) + self.assertEqual( + sorted(['admin', 'commit', 'ticket']), + sorted(acls) + ) \ No newline at end of file diff --git a/tests/lib/test_pagure_lib_add_user_to_project.py b/tests/lib/test_pagure_lib_add_user_to_project.py new file mode 100644 index 0000000..25c150c --- /dev/null +++ b/tests/lib/test_pagure_lib_add_user_to_project.py @@ -0,0 +1,333 @@ +# -*- coding: utf-8 -*- + +""" + (c) 2017 - Copyright Red Hat Inc + + Authors: + Pierre-Yves Chibon + +""" + +import unittest +import sys +import os + +from mock import patch, MagicMock + +sys.path.insert(0, os.path.join(os.path.dirname( + os.path.abspath(__file__)), '..')) + +import pagure.lib +import tests + + +class PagureLibAddUserToProjecttests(tests.SimplePagureTest): + """ Tests for pagure.lib.add_user_to_project """ + + def setUp(self): + """ Set up the environnment, ran before every tests. """ + super(PagureLibAddUserToProjecttests, self).setUp() + + tests.create_projects(self.session) + + item = pagure.lib.model.User( + user='bar', + fullname='bar baz', + password='foo', + default_email='bar@bar.com', + ) + self.session.add(item) + item = pagure.lib.model.UserEmail( + user_id=3, + email='bar@bar.com') + self.session.add(item) + + self.session.commit() + + # Before + repo = pagure.lib._get_project(self.session, 'test') + self.assertEqual(len(repo.users), 0) + + msg = pagure.lib.add_user_to_project( + session=self.session, + project=repo, + new_user='foo', + user='pingou', + ) + self.session.commit() + self.assertEqual(msg, 'User added') + + # After + repo = pagure.lib._get_project(self.session, 'test') + self.assertEqual(len(repo.users), 1) + self.assertEqual(repo.users[0].user, 'foo') + self.assertEqual(repo.admins[0].user, 'foo') + + @patch('pagure.lib.notify.send_email', MagicMock(return_value=True)) + def test_re_add_user_to_project_default(self): + """ Update an existing user but to the same access level. """ + repo = pagure.lib._get_project(self.session, 'test') + + # Try adding the same user with the same access + self.assertRaises( + pagure.exceptions.PagureException, + pagure.lib.add_user_to_project, + session=self.session, + project=repo, + new_user='foo', + user='pingou', + access='admin' + ) + + @patch('pagure.lib.notify.send_email', MagicMock(return_value=True)) + def test_update_user_to_project_default(self): + """ Update an existing user without any required group membership. + """ + repo = pagure.lib._get_project(self.session, 'test') + + # Update the access of the user + msg = pagure.lib.add_user_to_project( + session=self.session, + project=repo, + new_user='foo', + user='pingou', + access='commit' + ) + self.session.commit() + self.assertEqual(msg, 'User access updated') + self.assertEqual(len(repo.users), 1) + self.assertEqual(repo.users[0].user, 'foo') + self.assertEqual(repo.committers[0].user, 'foo') + + @patch('pagure.lib.notify.send_email', MagicMock(return_value=True)) + def test_update_user_to_project_require_packager_on_all(self): + """ + Update an existing user but required group membership on all + projects. + """ + repo = pagure.lib._get_project(self.session, 'test') + config = { + '*': ['packager'] + } + + # Update the access of the user + self.assertRaises( + pagure.exceptions.PagureException, + pagure.lib.add_user_to_project, + session=self.session, + project=repo, + new_user='foo', + user='pingou', + access='admin', + required_groups=config + ) + self.session.commit() + self.assertEqual(len(repo.users), 1) + self.assertEqual(repo.users[0].user, 'foo') + self.assertEqual(repo.committers[0].user, 'foo') + + @patch('pagure.lib.notify.send_email', MagicMock(return_value=True)) + def test_update_user_to_project_require_packager_on_st(self): + """ + Update an existing user but required group membership on all + projects match *st. + """ + repo = pagure.lib._get_project(self.session, 'test') + config = { + '*st': ['packager'] + } + + # Update the access of the user + self.assertRaises( + pagure.exceptions.PagureException, + pagure.lib.add_user_to_project, + session=self.session, + project=repo, + new_user='foo', + user='pingou', + access='admin', + required_groups=config + ) + self.session.commit() + self.assertEqual(len(repo.users), 1) + self.assertEqual(repo.users[0].user, 'foo') + self.assertEqual(repo.committers[0].user, 'foo') + + @patch('pagure.lib.notify.send_email', MagicMock(return_value=True)) + def test_update_user_to_project_require_packager_on_te(self): + """ + Update an existing user but required group membership on all + projects match te*. + """ + repo = pagure.lib._get_project(self.session, 'test') + config = { + 'te*': ['packager'] + } + + # Update the access of the user + self.assertRaises( + pagure.exceptions.PagureException, + pagure.lib.add_user_to_project, + session=self.session, + project=repo, + new_user='foo', + user='pingou', + access='admin', + required_groups=config + ) + self.session.commit() + self.assertEqual(len(repo.users), 1) + self.assertEqual(repo.users[0].user, 'foo') + self.assertEqual(repo.committers[0].user, 'foo') + + @patch('pagure.lib.notify.send_email', MagicMock(return_value=True)) + def test_update_user_to_project_require_packager_on_test(self): + """ + Update an existing user but required group membership on a specific + project: test. + """ + repo = pagure.lib._get_project(self.session, 'test') + config = { + 'test': ['packager'] + } + + # Update the access of the user + self.assertRaises( + pagure.exceptions.PagureException, + pagure.lib.add_user_to_project, + session=self.session, + project=repo, + new_user='foo', + user='pingou', + access='admin', + required_groups=config + ) + self.session.commit() + self.assertEqual(len(repo.users), 1) + self.assertEqual(repo.users[0].user, 'foo') + self.assertEqual(repo.committers[0].user, 'foo') + + @patch('pagure.lib.notify.send_email', MagicMock(return_value=True)) + def test_add_user_to_test2_require_packager_on_test(self): + """ + Add user to project test2 while the configuration requires group + membership on the project test. + """ + repo = pagure.lib._get_project(self.session, 'test2') + self.assertEqual(len(repo.users), 0) + + config = { + 'test': ['packager'] + } + + # Add the user + pagure.lib.add_user_to_project( + session=self.session, + project=repo, + new_user='foo', + user='pingou', + access='admin', + required_groups=config + ) + self.session.commit() + self.assertEqual(len(repo.users), 1) + self.assertEqual(repo.users[0].user, 'foo') + self.assertEqual(repo.committers[0].user, 'foo') + +class PagureLibAddUserToProjectWithGrouptests( + PagureLibAddUserToProjecttests): + """ Tests for pagure.lib.add_user_to_project """ + + def setUp(self): + """ Set up the environnment, ran before every tests. """ + super(PagureLibAddUserToProjectWithGrouptests, self).setUp() + + # Create group + msg = pagure.lib.add_group( + self.session, + group_name='packager', + display_name='packager', + description='The Fedora packager groups', + group_type='user', + user='pingou', + is_admin=False, + blacklist=[]) + self.session.commit() + self.assertEqual(msg, 'User `pingou` added to the group `packager`.') + + # Add user to group + group = pagure.lib.search_groups(self.session, group_name='packager') + msg = pagure.lib.add_user_to_group( + self.session, + username='bar', + group=group, + user='pingou', + is_admin=True) + self.session.commit() + self.assertEqual(msg, 'User `bar` added to the group `packager`.') + + @patch('pagure.lib.notify.send_email', MagicMock(return_value=True)) + def test_add_user_to_test_require_packager_on_test(self): + """ + Add user to project test while the configuration requires group + membership on the project test. + """ + repo = pagure.lib._get_project(self.session, 'test') + self.assertEqual(len(repo.users), 1) + + config = { + 'test': ['packager'] + } + + # Add the user to the project + pagure.lib.add_user_to_project( + session=self.session, + project=repo, + new_user='bar', + user='pingou', + access='commit', + required_groups=config + ) + self.session.commit() + + repo = pagure.lib._get_project(self.session, 'test') + self.assertEqual(len(repo.users), 2) + self.assertEqual(repo.users[0].user, 'foo') + self.assertEqual(repo.committers[0].user, 'foo') + self.assertEqual(repo.users[1].user, 'bar') + self.assertEqual(repo.committers[1].user, 'bar') + + @patch('pagure.lib.notify.send_email', MagicMock(return_value=True)) + def test_add_user_to_test_require_packager(self): + """ + Add user to project test while the configuration requires group + membership on all the projects. + """ + repo = pagure.lib._get_project(self.session, 'test') + self.assertEqual(len(repo.users), 1) + + config = { + '*': ['packager'] + } + + # Add the user to the project + pagure.lib.add_user_to_project( + session=self.session, + project=repo, + new_user='bar', + user='pingou', + access='commit', + required_groups=config + ) + self.session.commit() + + repo = pagure.lib._get_project(self.session, 'test') + self.assertEqual(len(repo.users), 2) + self.assertEqual(repo.users[0].user, 'foo') + self.assertEqual(repo.committers[0].user, 'foo') + self.assertEqual(repo.users[1].user, 'bar') + self.assertEqual(repo.committers[1].user, 'bar') + + +if __name__ == '__main__': + unittest.main(verbosity=2) diff --git a/tests/lib/test_pagure_lib_drop_issue.py b/tests/lib/test_pagure_lib_drop_issue.py new file mode 100644 index 0000000..7cafc2b --- /dev/null +++ b/tests/lib/test_pagure_lib_drop_issue.py @@ -0,0 +1,215 @@ +# -*- coding: utf-8 -*- + +""" + (c) 2017 - Copyright Red Hat Inc + + Authors: + Pierre-Yves Chibon + +""" + +__requires__ = ['SQLAlchemy >= 0.8'] +import pkg_resources + +import unittest +import shutil +import sys +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 +import pagure.lib.model +import tests + + +class PagureLibDropIssuetests(tests.SimplePagureTest): + """ Tests for pagure.lib.drop_issue """ + + @patch('pagure.lib.git.update_git') + @patch('pagure.lib.notify.send_email') + def setUp(self, p_send_email, p_ugt): + """ Create a couple of tickets and add tag to the project so we can + play with them later. + """ + super(PagureLibDropIssuetests, self).setUp() + + p_send_email.return_value = True + p_ugt.return_value = True + + + tests.create_projects(self.session) + repo = pagure.get_authorized_project(self.session, 'test') + + # Before + issues = pagure.lib.search_issues(self.session, repo) + self.assertEqual(len(issues), 0) + self.assertEqual(repo.open_tickets, 0) + self.assertEqual(repo.open_tickets_public, 0) + + # Create two issues to play with + msg = pagure.lib.new_issue( + session=self.session, + repo=repo, + title='Test issue', + content='We should work on this', + user='pingou', + ticketfolder=None + ) + self.session.commit() + self.assertEqual(msg.title, 'Test issue') + self.assertEqual(repo.open_tickets, 1) + self.assertEqual(repo.open_tickets_public, 1) + + msg = pagure.lib.new_issue( + session=self.session, + repo=repo, + title='Test issue #2', + content='We should work on this for the second time', + user='foo', + status='Open', + ticketfolder=None + ) + self.session.commit() + self.assertEqual(msg.title, 'Test issue #2') + self.assertEqual(repo.open_tickets, 2) + self.assertEqual(repo.open_tickets_public, 2) + + # After + issues = pagure.lib.search_issues(self.session, repo) + self.assertEqual(len(issues), 2) + + # Add tag to the project + pagure.lib.new_tag( + self.session, + 'red', + 'red tag', + '#ff0000', + repo.id + ) + self.session.commit() + + repo = pagure.get_authorized_project(self.session, 'test') + self.assertEqual( + str(repo.tags_colored), + '[TagColored(id: 1, tag:red, tag_description:red tag, color:#ff0000)]' + ) + + @patch('pagure.lib.git.update_git') + @patch('pagure.lib.notify.send_email') + def test_drop_issue(self, p_send_email, p_ugt): + """ Test the drop_issue of pagure.lib. + + We had an issue where we could not delete issue that had been tagged + with this test, we create two issues, tag one of them and delete + it, ensuring it all goes well. + """ + p_send_email.return_value = True + p_ugt.return_value = True + + repo = pagure.get_authorized_project(self.session, 'test') + + # Add tag to the second issue + issue = pagure.lib.search_issues(self.session, repo, issueid=2) + msgs = pagure.lib.update_tags( + self.session, + issue, + tags=['red'], + username='pingou', + ticketfolder=None, + ) + self.session.commit() + + self.assertEqual(msgs, ['Issue tagged with: red']) + + repo = pagure.get_authorized_project(self.session, 'test') + self.assertEqual(len(repo.issues), 2) + issue = pagure.lib.search_issues(self.session, repo, issueid=2) + self.assertEqual( + str(issue.tags), + '[TagColored(id: 1, tag:red, tag_description:red tag, color:#ff0000)]' + ) + + # Drop the issue #2 + issue = pagure.lib.search_issues(self.session, repo, issueid=2) + pagure.lib.drop_issue( + self.session, issue, user='pingou', ticketfolder=None) + self.session.commit() + + repo = pagure.get_authorized_project(self.session, 'test') + self.assertEqual(len(repo.issues), 1) + + @patch('pagure.lib.git.update_git') + @patch('pagure.lib.notify.send_email') + def test_drop_issue_two_issues_one_tag(self, p_send_email, p_ugt): + """ Test the drop_issue of pagure.lib. + + We had an issue where we could not delete issue that had been tagged + with this test, we create two issues, tag them both and delete one + then we check that the other issue is still tagged. + """ + p_send_email.return_value = True + p_ugt.return_value = True + + repo = pagure.get_authorized_project(self.session, 'test') + + # Add the tag to both issues + issue = pagure.lib.search_issues(self.session, repo, issueid=1) + msgs = pagure.lib.update_tags( + self.session, + issue, + tags=['red'], + username='pingou', + ticketfolder=None, + ) + self.session.commit() + self.assertEqual(msgs, ['Issue tagged with: red']) + + issue = pagure.lib.search_issues(self.session, repo, issueid=2) + msgs = pagure.lib.update_tags( + self.session, + issue, + tags=['red'], + username='pingou', + ticketfolder=None, + ) + self.session.commit() + self.assertEqual(msgs, ['Issue tagged with: red']) + + repo = pagure.get_authorized_project(self.session, 'test') + self.assertEqual(len(repo.issues), 2) + issue = pagure.lib.search_issues(self.session, repo, issueid=1) + self.assertEqual( + str(issue.tags), + '[TagColored(id: 1, tag:red, tag_description:red tag, color:#ff0000)]' + ) + issue = pagure.lib.search_issues(self.session, repo, issueid=2) + self.assertEqual( + str(issue.tags), + '[TagColored(id: 1, tag:red, tag_description:red tag, color:#ff0000)]' + ) + + # Drop the issue #2 + issue = pagure.lib.search_issues(self.session, repo, issueid=2) + pagure.lib.drop_issue( + self.session, issue, user='pingou', ticketfolder=None) + self.session.commit() + + repo = pagure.get_authorized_project(self.session, 'test') + self.assertEqual(len(repo.issues), 1) + + issue = pagure.lib.search_issues(self.session, repo, issueid=1) + self.assertEqual( + str(issue.tags), + '[TagColored(id: 1, tag:red, tag_description:red tag, color:#ff0000)]' + ) + issue = pagure.lib.search_issues(self.session, repo, issueid=2) + self.assertIsNone(issue) + + +if __name__ == '__main__': + unittest.main(verbosity=2) diff --git a/tests/lib/test_pagure_lib_encoding_utils.py b/tests/lib/test_pagure_lib_encoding_utils.py new file mode 100644 index 0000000..67fdb68 --- /dev/null +++ b/tests/lib/test_pagure_lib_encoding_utils.py @@ -0,0 +1,71 @@ +# -*- coding: utf-8 -*- +""" +Tests for :module:`pagure.lib.encoding_utils`. +""" + +import chardet +import os +import unittest +import sys + +sys.path.insert(0, os.path.join(os.path.dirname( + os.path.abspath(__file__)), '..')) + +from pagure.lib import encoding_utils + + +class TestGuessEncoding(unittest.TestCase): + + def test_guess_encoding_ascii(self): + """ + Assert when ascii-only data is provided ascii is the guessed encoding. + """ + data = u'Twas bryllyg, and the slythy toves did gyre and gymble' + result = encoding_utils.guess_encoding(data.encode('ascii')) + self.assertEqual(result, 'ascii') + + def test_guess_encoding_favor_utf_8(self): + """ + Test that strings that could be UTF-8 or ISO-8859-2 result in UTF-8. + """ + data = u'Šabata'.encode('utf-8') + result = encoding_utils.guess_encoding(data) + chardet_result = chardet.detect(data) + self.assertEqual(result, 'utf-8') + self.assertEqual(chardet_result['encoding'], 'ISO-8859-2') + + def test_guess_encoding_no_data(self): + """ Test encoding_utils.guess_encoding() with an empty string """ + result = encoding_utils.guess_encoding(u''.encode('utf-8')) + self.assertEqual(result, 'ascii') + + +class TestGuessEncodings(unittest.TestCase): + + def test_guess_encodings(self): + """ Test the encoding_utils.guess_encodings() method. """ + data = u'Šabata'.encode('utf-8') + result = encoding_utils.guess_encodings(data) + chardet_result = chardet.detect(data) + self.assertEqual( + [encoding.encoding for encoding in result], + ['utf-8', 'ISO-8859-2', 'windows-1252']) + self.assertEqual(chardet_result['encoding'], 'ISO-8859-2') + + def test_guess_encodings_no_data(self): + """ Test encoding_utils.guess_encodings() with an emtpy string """ + result = encoding_utils.guess_encodings(u''.encode('utf-8')) + self.assertEqual( + [encoding.encoding for encoding in result], + ['ascii']) + +class TestDecode(unittest.TestCase): + + def test_decode(self): + """ Test encoding_utils.decode() """ + data = u'Šabata' + self.assertEqual(data, encoding_utils.decode(data.encode('utf-8'))) + + +if __name__ == '__main__': + unittest.main(verbosity=2) diff --git a/tests/lib/test_pagure_lib_get_project_users.py b/tests/lib/test_pagure_lib_get_project_users.py new file mode 100644 index 0000000..3af507c --- /dev/null +++ b/tests/lib/test_pagure_lib_get_project_users.py @@ -0,0 +1,203 @@ +import unittest + +import tests +import pagure.lib + + +class PagureLibtests_get_project_users(tests.SimplePagureTest): + + def test_get_project_users(self): + ''' Test the get_project_users method when combine is True + ''' + + tests.create_projects(self.session) + project = pagure.get_authorized_project(self.session, project_name='test') + + # Default value of combine is True + # which means the an admin is a user, committer as well + # and a committer is also a user + # and a user is just a user + users = project.get_project_users(access='admin') + + # Only pingou is the admin as of now + # But, he is the creator and + # the creator of the project is not listed in user_projects + # table. Thus, get_projec_users won't return him as an admin + # He has all the access of an admin though + self.assertEqual(len(users), 0) + self.assertEqual(project.user.username, 'pingou') + + # Wrong access level, should raise Accesslevelnotfound exception + self.assertRaises( + pagure.exceptions.AccessLevelNotFound, + project.get_project_users, + access='owner', + ) + + # Let's add a new user to the project, 'foo' + # By default, if no access is specified, he becomes an admin + msg = pagure.lib.add_user_to_project( + self.session, + project=project, + new_user='foo', + user='pingou' + ) + self.session.commit() + # since, he is an admin, the msg should be 'User added' + self.assertEqual(msg, 'User added') + + project = pagure.get_authorized_project(self.session, project_name='test') + users = project.get_project_users(access='admin') + + self.assertEqual(len(users), 1) + self.assertEqual(users[0].username, 'foo') + + # foo should be a committer as well, since he is an admin + users = project.get_project_users(access='commit') + + self.assertEqual(len(users), 1) + self.assertEqual(users[0].username, 'foo') + + # the admin also has ticket access + users = project.get_project_users(access='ticket') + + self.assertEqual(len(users), 1) + self.assertEqual(users[0].username, 'foo') + + # let's update the access of foo to 'committer' + msg = pagure.lib.add_user_to_project( + self.session, + project=project, + new_user='foo', + user='pingou', + access='commit' + ) + self.session.commit() + self.assertEqual(msg, 'User access updated') + + project = pagure.get_authorized_project(self.session, project_name='test') + # No admin now, even though pingou the creator is there + users = project.get_project_users(access='admin') + self.assertEqual(len(users), 0) + + users = project.get_project_users(access='commit') + # foo is the committer currently + self.assertEqual(len(users), 1) + self.assertEqual(users[0].username, 'foo') + + users = project.get_project_users(access='ticket') + + # foo also has ticket rights + self.assertEqual(len(users), 1) + self.assertEqual(users[0].username, 'foo') + + # let's update the access of foo to 'ticket' + msg = pagure.lib.add_user_to_project( + self.session, + project=project, + new_user='foo', + user='pingou', + access='ticket' + ) + self.session.commit() + self.assertEqual(msg, 'User access updated') + + project = pagure.get_authorized_project(self.session, project_name='test') + # No admin now, even though pingou the creator is there + users = project.get_project_users(access='admin') + self.assertEqual(len(users), 0) + + users = project.get_project_users(access='commit') + # foo deosn't have commit rights now + self.assertEqual(len(users), 0) + + users = project.get_project_users(access='ticket') + + # foo does have tickets right though + self.assertEqual(len(users), 1) + self.assertEqual(users[0].username, 'foo') + + def test_get_project_users_combine_false(self): + ''' Test the get_project_users method when combine is False + ''' + + tests.create_projects(self.session) + project = pagure.get_authorized_project(self.session, project_name='test') + + # Let's add a new user to the project, 'foo' + # By default, if no access is specified, he becomes an admin + msg = pagure.lib.add_user_to_project( + self.session, + project=project, + new_user='foo', + user='pingou' + ) + self.session.commit() + # since, he is an admin, the msg should be 'User added' + self.assertEqual(msg, 'User added') + + # only one admin + users = project.get_project_users(access='admin', combine=False) + + self.assertEqual(len(users), 1) + self.assertEqual(users[0].username, 'foo') + + # No user with only commit access + users = project.get_project_users(access='commit', combine=False) + self.assertEqual(len(users), 0) + + # No user with only ticket access + users = project.get_project_users(access='ticket', combine=False) + self.assertEqual(len(users), 0) + + # Update the access level of foo user to commit + msg = pagure.lib.add_user_to_project( + self.session, + project=project, + new_user='foo', + user='pingou', + access='commit' + ) + self.session.commit() + self.assertEqual(msg, 'User access updated') + + # He is just a committer + project = pagure.get_authorized_project(self.session, project_name='test') + users = project.get_project_users(access='admin', combine=False) + + self.assertEqual(len(users), 0) + + # He is just a committer + users = project.get_project_users(access='commit', combine=False) + self.assertEqual(len(users), 1) + self.assertEqual(users[0].username, 'foo') + + # He is just a committer + users = project.get_project_users(access='ticket', combine=False) + self.assertEqual(len(users), 0) + + # Update the access level of foo user to ticket + msg = pagure.lib.add_user_to_project( + self.session, + project=project, + new_user='foo', + user='pingou', + access='ticket' + ) + self.session.commit() + self.assertEqual(msg, 'User access updated') + + # He is just a ticketer + project = pagure.get_authorized_project(self.session, project_name='test') + users = project.get_project_users(access='admin',combine=False) + + self.assertEqual(len(users), 0) + + # He is just a ticketer + users = project.get_project_users(access='commit', combine=False) + self.assertEqual(len(users), 0) + + # He is just a ticketer + users = project.get_project_users(access='ticket', combine=False) + self.assertEqual(len(users), 1) + self.assertEqual(users[0].username, 'foo') \ No newline at end of file diff --git a/tests/lib/test_pagure_lib_issues.py b/tests/lib/test_pagure_lib_issues.py index d7491e2..19822cd 100644 --- a/tests/lib/test_pagure_lib_issues.py +++ b/tests/lib/test_pagure_lib_issues.py @@ -118,7 +118,7 @@ class PagureLibtests_new_issue(tests.Modeltests): self.assertEqual(len(issues), 2) -class PagureLibtests_edit_issue(tests.Modeltests): +class PagureLibtests_edit_issue(tests.SimplePagureTest): """ Test the pagure.lib edit_issue() method """ @@ -428,7 +428,7 @@ class PagureLibtests_edit_issue(tests.Modeltests): self.assertEqual(repo.open_tickets_public, 2) -class PagureLibtests_add_issues(tests.Modeltests): +class PagureLibtests_add_issues(tests.SimplePagureTest): """ Test the pagure.lib add_issue_dependency, add_issue_assignee, add_issue_comment and @@ -701,7 +701,7 @@ class PagureLibtests_add_issues(tests.Modeltests): self.assertEqual(issue.comments[0].user.user, 'foo') -class PagureLibtests_issues_update(tests.Modeltests): +class PagureLibtests_issues_update(tests.SimplePagureTest): """ Test the pagure.lib update_tags, update_dependency_issue, and update_blocked_issue methods @@ -884,7 +884,7 @@ class PagureLibtests_issues_update(tests.Modeltests): self.assertEqual(issue.blocking_text, [3]) -class PagureLibtests_get_issues(tests.Modeltests): +class PagureLibtests_get_issues(tests.SimplePagureTest): """ Test the pagure.lib get_issue_by_uid method. """ diff --git a/tests/lib/test_pagure_lib_link.py b/tests/lib/test_pagure_lib_link.py new file mode 100644 index 0000000..3cb0d37 --- /dev/null +++ b/tests/lib/test_pagure_lib_link.py @@ -0,0 +1,288 @@ +# -*- coding: utf-8 -*- + +""" + (c) 2015 - Copyright Red Hat Inc + + Authors: + Pierre-Yves Chibon + +""" + +__requires__ = ['SQLAlchemy >= 0.8'] +import pkg_resources + +import json +import unittest +import shutil +import sys +import os + +import pygit2 +from mock import patch + +sys.path.insert(0, os.path.join(os.path.dirname( + os.path.abspath(__file__)), '..')) + +import pagure +import pagure.lib.link +import tests + +COMMENTS = [ + 'Did you see #1?', + 'This is a duplicate of #2', + 'This is a fixes #3', + 'Might be worth looking at https://fedorahosted.org/pagure/tests2/issue/4', + 'This relates to #5', + 'Could this be related to https://fedorahosted.org/pagure/tests2/issue/6', +] + + +class PagureLibLinktests(tests.Modeltests): + """ Tests for pagure.lib.link """ + + def test_get_relation_relates(self): + """ Test the get_relation function of pagure.lib.link with relates. + """ + + link = pagure.lib.link.get_relation( + self.session, + reponame='test', + namespace=None, + username=None, + text=COMMENTS[0], + reftype='relates', + ) + self.assertEqual(link, []) + + tests.create_projects(self.session) + + link = pagure.lib.link.get_relation( + self.session, + reponame='test', + namespace=None, + username=None, + text=COMMENTS[4], + reftype='relates', + ) + self.assertEqual(link, []) + + # Create the issue + repo = pagure.get_authorized_project(self.session, 'test') + pagure.lib.new_issue( + self.session, + repo, + title='foo', + content='bar', + user='pingou', + ticketfolder=None, + issue_id=5, + notify=False) + self.session.commit() + + for idx, comment in enumerate(COMMENTS): + link = pagure.lib.link.get_relation( + self.session, + reponame='test', + namespace=None, + username=None, + text=comment, + reftype='relates') + if idx == 4: + self.assertEqual( + str(link), + '[Issue(5, project:test, user:pingou, title:foo)]') + else: + self.assertEqual(link, []) + + link = pagure.lib.link.get_relation( + self.session, + reponame='test', + namespace=None, + username=None, + text=COMMENTS[5], + reftype='relates', + ) + self.assertEqual(link, []) + + # Create the issue + repo = pagure.get_authorized_project(self.session, 'test') + pagure.lib.new_issue( + self.session, + repo, + title='another foo', + content='another bar', + user='pingou', + ticketfolder=None, + issue_id=6, + notify=False) + self.session.commit() + + for idx, comment in enumerate(COMMENTS): + link = pagure.lib.link.get_relation( + self.session, + reponame='test', + namespace=None, + username=None, + text=comment, + reftype='relates') + if idx == 4: + self.assertEqual( + str(link), + '[Issue(5, project:test, user:pingou, title:foo)]') + elif idx == 5: + self.assertEqual( + str(link), + '[Issue(6, project:test, user:pingou, title:another foo)]') + else: + self.assertEqual(link, []) + + def test_get_relation_fixes(self): + """ Test the get_relation function of pagure.lib.link with fixes. + """ + + link = pagure.lib.link.get_relation( + self.session, + reponame='test', + namespace=None, + username=None, + text=COMMENTS[0], + reftype='fixes', + ) + self.assertEqual(link, []) + + tests.create_projects(self.session) + + link = pagure.lib.link.get_relation( + self.session, + reponame='test', + namespace=None, + username=None, + text=COMMENTS[2], + reftype='fixes', + ) + self.assertEqual(link, []) + + # Create the issue + repo = pagure.get_authorized_project(self.session, 'test') + pagure.lib.new_issue( + self.session, + repo, + title='issue 3', + content='content issue 3', + user='pingou', + ticketfolder=None, + issue_id=3, + notify=False) + self.session.commit() + + for idx, comment in enumerate(COMMENTS): + link = pagure.lib.link.get_relation( + self.session, + reponame='test', + namespace=None, + username=None, + text=comment, + reftype='fixes') + if idx == 2: + self.assertEqual( + str(link), + '[Issue(3, project:test, user:pingou, title:issue 3)]') + else: + self.assertEqual(link, []) + + def test_relates_regex(self): + ''' Test the relates regex present in pagure.lib.link. ''' + text = 'relates to http://localhost/fork/pingou/test/issue/1' + for index, regex in enumerate(pagure.lib.link.RELATES): + if index == 2: + self.assertNotEqual(regex.match(text), None) + else: + self.assertEqual(regex.match(text), None) + + text = 'relates http://209.132.184.222/fork/pingou/test/issue/1' + for index, regex in enumerate(pagure.lib.link.RELATES): + if index == 2: + self.assertNotEqual(regex.match(text), None) + else: + self.assertEqual(regex.match(text), None) + + text = 'This relates to #5' + for index, regex in enumerate(pagure.lib.link.RELATES): + if index == 0: + self.assertNotEqual(regex.match(text), None) + else: + self.assertEqual(regex.match(text), None) + + text = 'Could this be related to '\ + ' https://fedorahosted.org/pagure/tests2/issue/6' + for index, regex in enumerate(pagure.lib.link.RELATES): + if index == 2: + self.assertNotEqual(regex.match(text), None) + else: + self.assertEqual(regex.match(text), None) + + def test_fixes_regex(self): + ''' Test the fixes regex present in pagure.lib.link. ''' + + # project/issue matches + def project_match(text, groups): + match = None + for regex in pagure.lib.link.FIXES: + match = regex.match(text) + if match: + break + self.assertNotEqual(match, None) + self.assertEqual(len(match.groups()), 2) + self.assertEqual(match.groups(), groups) + + data = [ + # [string, groups] + ] + + project_match('fixes http://localhost/fork/pingou/test/issue/1', + ('test', '1')) + project_match('fix http://209.132.184.222/fork/pingou/test/issue/1', + ('test', '1')) + project_match('Could this be fixes ' + ' https://fedorahosted.org/pagure/tests2/issue/6', + ('tests2', '6')) + project_match('merged https://pagure.io/myproject/pull-request/70', + ('myproject', '70')) + project_match('Now we merge https://pagure.io/myproject/pull-request/99', + ('myproject', '99')) + + # issue matches + def issue_match(text, issue): + match = None + for regex in pagure.lib.link.FIXES: + match = regex.match(text) + if match: + break + self.assertNotEqual(match, None) + self.assertEqual(len(match.groups()), 1) + self.assertEqual(match.group(1), issue) + + issue_match('This fixed #5', '5') + issue_match('Merged #17', '17') + issue_match('Fixed: #23', '23') + issue_match('This commit fixes: #42', '42') + issue_match('Merge #137', '137') + + # no match + def no_match(text): + match = None + for regex in pagure.lib.link.FIXES: + match = regex.match(text) + if match: + break + self.assertEqual(match, None) + + no_match('nowhitespacemerge: #47') + no_match('This commit unmerges #45') + no_match('Fixed 45 typos') + no_match('Fixed 4 typos') + no_match("Merge branch 'work'") + + +if __name__ == '__main__': + unittest.main(verbosity=2) diff --git a/tests/lib/test_pagure_lib_login.py b/tests/lib/test_pagure_lib_login.py new file mode 100644 index 0000000..c361c5a --- /dev/null +++ b/tests/lib/test_pagure_lib_login.py @@ -0,0 +1,106 @@ +# -*- coding: utf-8 -*- + +""" + (c) 2016 - Copyright Red Hat Inc + + Authors: + Pierre-Yves Chibon + Farhaan Bukhsh + +""" + +__requires__ = ['SQLAlchemy >= 0.8'] +import pkg_resources + +import unittest +import shutil +import sys +import os + +from mock import patch + +sys.path.insert(0, os.path.join(os.path.dirname( + os.path.abspath(__file__)), '..')) + +import pagure.lib +from pagure.exceptions import PagureException +import pagure.lib.login +import hashlib +from pagure import APP +import tests + + +class PagureLibLogintests(tests.SimplePagureTest): + """ Tests for pagure.lib.login """ + + def test_id_generator(self): + ''' Test pagure.lib.login.id_generator. ''' + self.assertEqual( + pagure.lib.login.id_generator(size=3, chars=['a']), + 'aaa' + ) + + def test_get_session_by_visitkey(self): + ''' Test pagure.lib.login.get_session_by_visitkey. ''' + + session = pagure.lib.login.get_session_by_visitkey(self.session, 'foo') + self.assertEqual(session, None) + + def test_generate_hashed_value(self): + ''' Test pagure.lib.login.generate_hashed_value. ''' + password = pagure.lib.login.generate_hashed_value('foo') + self.assertTrue(password.startswith('$2$')) + self.assertEqual(len(password), 63) + + def test_check_password(self): + ''' Test pagure.lib.login.check_password. ''' + + # Version 2 + password = pagure.lib.login.generate_hashed_value('foo') + self.assertTrue( + pagure.lib.login.check_password('foo', password)) + self.assertFalse( + pagure.lib.login.check_password('bar', password)) + + # Version 1 + password = '%s%s' % ('foo', APP.config.get('PASSWORD_SEED', None)) + password = '$1$' + hashlib.sha512(password).hexdigest() + self.assertTrue(pagure.lib.login.check_password('foo', password)) + self.assertFalse(pagure.lib.login.check_password('bar', password)) + + # Invalid password - No version + password = '%s%s' % ('foo', APP.config.get('PASSWORD_SEED', None)) + password = hashlib.sha512(password).hexdigest() + self.assertRaises( + PagureException, + pagure.lib.login.check_password, + 'foo', password + ) + + # Invalid password - Invalid version + password = '$3$' + password + self.assertRaises( + PagureException, + pagure.lib.login.check_password, + 'foo', + password + ) + password = '%s%s' % ('foo', APP.config.get('PASSWORD_SEED', None)) + password = hashlib.sha512(password).hexdigest() + self.assertRaises( + PagureException, + pagure.lib.login.check_password, + 'foo', password + ) + + # Invalid password - Invalid version + password = '$3$' + password + self.assertRaises( + PagureException, + pagure.lib.login.check_password, + 'foo', + password + ) + +if __name__ == '__main__': + unittest.main(verbosity=2) diff --git a/tests/lib/test_pagure_lib_model.py b/tests/lib/test_pagure_lib_model.py new file mode 100644 index 0000000..16cdaa4 --- /dev/null +++ b/tests/lib/test_pagure_lib_model.py @@ -0,0 +1,250 @@ +# -*- coding: utf-8 -*- + +""" + (c) 2015-2017 - Copyright Red Hat Inc + + Authors: + Pierre-Yves Chibon + +""" + +__requires__ = ['SQLAlchemy >= 0.8'] +import pkg_resources + +import unittest +import sys +import os + +from mock import patch + +sys.path.insert(0, os.path.join(os.path.dirname( + os.path.abspath(__file__)), '..')) + +import pagure +import pagure.lib +import tests + + +class PagureLibModeltests(tests.SimplePagureTest): + """ Tests for pagure.lib.model """ + + def test_user__repr__(self): + """ Test the User.__repr__ function of pagure.lib.model. """ + item = pagure.lib.search_user(self.session, email='foo@bar.com') + self.assertEqual(str(item), 'User: 2 - name foo') + self.assertEqual('foo', item.user) + self.assertEqual('foo', item.username) + self.assertEqual([], item.groups) + + @patch('pagure.lib.git.update_git') + @patch('pagure.lib.notify.send_email') + def test_issue__repr__(self, p_send_email, p_ugt): + """ Test the Issue.__repr__ function of pagure.lib.model. """ + p_send_email.return_value = True + p_ugt.return_value = True + + tests.create_projects(self.session) + repo = pagure.get_authorized_project(self.session, 'test') + + # Create an issue + msg = pagure.lib.new_issue( + session=self.session, + repo=repo, + title='Test issue', + content='We should work on this', + user='pingou', + ticketfolder=None + ) + self.assertEqual(msg.title, 'Test issue') + + issues = pagure.lib.search_issues(self.session, repo) + self.assertEqual(len(issues), 1) + self.assertEqual( + str(issues[0]), + 'Issue(1, project:test, user:pingou, title:Test issue)') + + @patch('pagure.lib.git.update_git') + @patch('pagure.lib.notify.send_email') + def test_pullrequest__repr__(self, p_send_email, p_ugt): + """ Test the PullRequest.__repr__ function of pagure.lib.model. """ + p_send_email.return_value = True + p_ugt.return_value = True + + tests.create_projects(self.session) + # Create a forked repo + item = pagure.lib.model.Project( + user_id=1, # pingou + name='test', + description='test project #1', + is_fork=True, + parent_id=1, + hook_token='aaabbbyyy', + ) + self.session.commit() + self.session.add(item) + + repo = pagure.get_authorized_project(self.session, 'test') + forked_repo = pagure.get_authorized_project( + self.session, 'test', user='pingou') + + # Create an pull-request + req = pagure.lib.new_pull_request( + session=self.session, + repo_from=forked_repo, + branch_from='master', + repo_to=repo, + branch_to='master', + title='test pull-request', + user='pingou', + requestfolder=None, + ) + self.assertEqual(req.id, 1) + self.assertEqual(req.title, 'test pull-request') + + self.assertEqual( + str(req), + 'PullRequest(1, project:test, user:pingou, ' + 'title:test pull-request)') + + request = pagure.lib.search_pull_requests(self.session, requestid=1) + self.assertEqual( + str(request), + 'PullRequest(1, project:test, user:pingou, ' + 'title:test pull-request)') + + def test_paguregroup__repr__(self): + """ Test the PagureGroup.__repr__ function of pagure.lib.model. """ + item = pagure.lib.model.PagureGroup( + group_name='admin', + display_name='admin group', + description='the local admin group', + user_id=1, + ) + self.session.add(item) + self.session.commit() + + self.assertEqual(str(item), 'Group: 1 - name admin') + + def test_tagissue__repr__(self): + """ Test the TagIssue.__repr__ function of pagure.lib.model. """ + self.test_issue__repr__() + repo = pagure.get_authorized_project(self.session, 'test') + issues = pagure.lib.search_issues(self.session, repo) + self.assertEqual(len(issues), 1) + + item = pagure.lib.model.Tag(tag='foo') + self.session.add(item) + self.session.commit() + + item = pagure.lib.model.TagIssue( + issue_uid=issues[0].uid, + tag='foo' + ) + self.session.add(item) + self.session.commit() + self.assertEqual(str(item), 'TagIssue(issue:1, tag:foo)') + + def test_tagissuecolor__repr__(self): + """ Test the TagIssue.__repr__ function of pagure.lib.model. """ + self.test_issue__repr__() + repo = pagure.get_authorized_project(self.session, 'test') + issues = pagure.lib.search_issues(self.session, repo) + self.assertEqual(len(issues), 1) + + item = pagure.lib.model.TagColored( + tag='foo', + tag_description='bar', + tag_color='DeepSkyBlue', + project_id=repo.id) + self.session.add(item) + self.session.commit() + + item = pagure.lib.model.TagIssueColored( + issue_uid=issues[0].uid, + tag_id=item.id + ) + self.session.add(item) + self.session.commit() + self.assertEqual( + str(item), + 'TagIssueColored(issue:1, tag:foo, project:test)' + ) + + def test_group_project_ordering(self): + """ Test the ordering of project.groups. """ + # Create three projects + item = pagure.lib.model.Project( + user_id=1, # pingou + name='aaa', + description='Project aaa', + hook_token='aaabbbccc', + ) + item.close_status = ['Invalid', 'Fixed', 'Duplicate'] + self.session.add(item) + + item = pagure.lib.model.Project( + user_id=1, # pingou + name='KKK', + description='project KKK', + hook_token='aaabbbddd', + ) + item.close_status = ['Invalid', 'Fixed', 'Duplicate'] + self.session.add(item) + + item = pagure.lib.model.Project( + user_id=1, # pingou + name='zzz', + description='Namespaced project zzz', + hook_token='aaabbbeee', + namespace='somenamespace', + ) + item.close_status = ['Invalid', 'Fixed', 'Duplicate'] + self.session.add(item) + + # Create a group + group = pagure.lib.model.PagureGroup( + group_name='testgrp', + display_name='Test group', + description=None, + group_type='user', + user_id=1, # pingou + ) + item.close_status = ['Invalid', 'Fixed', 'Duplicate'] + self.session.add(group) + + self.session.commit() + + # Add projects to group + for ns, reponame in [ + (None, 'aaa'), (None, 'KKK'), ('somenamespace', 'zzz')]: + + repo = pagure.get_authorized_project( + self.session, reponame, namespace=ns) + msg = pagure.lib.add_group_to_project( + self.session, + project=repo, + new_group='testgrp', + user='pingou', + create=False, + is_admin=False + ) + self.session.commit() + self.assertEqual(msg, 'Group added') + + # Check the ordering + group = pagure.lib.search_groups(self.session, group_name='testgrp') + # Default PostgreSQL order + order = ['aaa', 'KKK', 'somenamespace/zzz'] + # Odd, SQLite order + if str(self.session.bind.engine.url).startswith('sqlite:'): + order = ['somenamespace/zzz', 'aaa', 'KKK'] + + self.assertEqual( + [p.fullname for p in group.projects], + order + ) + + + +if __name__ == '__main__': + unittest.main(verbosity=2) diff --git a/tests/lib/test_pagure_lib_model_delete_project.py b/tests/lib/test_pagure_lib_model_delete_project.py new file mode 100644 index 0000000..d30d670 --- /dev/null +++ b/tests/lib/test_pagure_lib_model_delete_project.py @@ -0,0 +1,349 @@ +# -*- coding: utf-8 -*- + +""" + (c) 2017 - Copyright Red Hat Inc + + Authors: + Pierre-Yves Chibon + +""" + +__requires__ = ['SQLAlchemy >= 0.8'] +import pkg_resources + +import json +import unittest +import sys +import os +import uuid + + +sys.path.insert(0, os.path.join(os.path.dirname( + os.path.abspath(__file__)), '..')) + +import pagure.lib +import pagure.lib.model as model + +import tests + + +class DeleteProjectTests(tests.SimplePagureTest): + """ Tests for flask issues controller of pagure """ + + def setUp(self): + """ Set up the environnment, run before every tests. """ + super(DeleteProjectTests, self).setUp() + + pagure.APP.config['TESTING'] = True + pagure.SESSION = self.session + + def test_delete_project_with_group(self): + """ Test the model when we delete a project with a group. """ + + # Create a project + item = model.Project( + user_id=1, # pingou + name='test', + description='test project #1', + hook_token='aaabbbiii', + ) + self.session.add(item) + self.session.commit() + + # Create a group + grp = model.PagureGroup( + group_name='testgrp', + display_name='Test group', + description=None, + group_type='user', + user_id=1, # pingou + ) + self.session.add(grp) + self.session.commit() + + # Add group to project + project_group = model.ProjectGroup( + project_id=1, + group_id=1, + access='admin', + ) + self.session.add(project_group) + self.session.commit() + + self.assertEqual( + self.session.query(model.Project).count(), 1) + self.assertEqual( + self.session.query(model.ProjectGroup).count(), 1) + + project = self.session.query( + model.Project + ).filter( + model.Project.id==1 + ).one() + self.session.delete(project) + self.session.commit() + + self.assertEqual( + self.session.query(model.Project).count(), 0) + self.assertEqual( + self.session.query(model.ProjectGroup).count(), 0) + + def test_delete_project_with_user(self): + """ Test the model when we delete a project with users. """ + + # Create a project + item = model.Project( + user_id=1, # pingou + name='test', + description='test project #1', + hook_token='aaabbbiii', + ) + self.session.add(item) + self.session.commit() + + # Add user #2 to project + project_user = model.ProjectUser( + project_id=1, + user_id=2, + access='admin', + ) + self.session.add(project_user) + self.session.commit() + + self.assertEqual( + self.session.query(model.Project).count(), 1) + self.assertEqual( + self.session.query(model.ProjectUser).count(), 1) + self.assertEqual( + self.session.query(model.User).count(), 2) + + project = self.session.query( + model.Project + ).filter( + model.Project.id==1 + ).one() + self.session.delete(project) + self.session.commit() + + self.assertEqual( + self.session.query(model.Project).count(), 0) + self.assertEqual( + self.session.query(model.ProjectUser).count(), 0) + self.assertEqual( + self.session.query(model.User).count(), 2) + + def test_delete_project_with_coloredtags(self): + """ Test the model when we delete a project with Colored tags. """ + + # Create a project + item = model.Project( + user_id=1, # pingou + name='test', + description='test project #1', + hook_token='aaabbbiii', + ) + self.session.add(item) + self.session.commit() + + # Create two ColoredTags + tagobj = model.TagColored( + tag='Tag#1', + project_id=1 + ) + self.session.add(tagobj) + self.session.flush() + + tagobj = model.TagColored( + tag='Tag#2', + project_id=1 + ) + self.session.add(tagobj) + self.session.flush() + + self.assertEqual( + self.session.query(model.Project).count(), 1) + self.assertEqual( + self.session.query(model.TagColored).count(), 2) + + project = self.session.query( + model.Project + ).filter( + model.Project.id==1 + ).one() + self.session.delete(project) + self.session.commit() + + self.assertEqual( + self.session.query(model.Project).count(), 0) + self.assertEqual( + self.session.query(model.TagColored).count(), 0) + + def test_delete_project_with_coloredtags_and_issues(self): + """ Test the model when we delete a project with Colored tags and + issues. """ + + # Create a project + item = model.Project( + user_id=1, # pingou + name='test', + description='test project #1', + hook_token='aaabbbiii', + ) + self.session.add(item) + self.session.commit() + + # Create two ColoredTags + tagobj = model.TagColored( + tag='Tag#1', + project_id=1 + ) + self.session.add(tagobj) + self.session.flush() + + tagobj = model.TagColored( + tag='Tag#2', + project_id=1 + ) + self.session.add(tagobj) + self.session.flush() + + # Create issues + issue = model.Issue( + id=pagure.lib.get_next_id(self.session, 1), + project_id=1, + title='Issue #1', + content='Description #1', + user_id=1, + uid=uuid.uuid4().hex, + private=False, + ) + self.session.add(issue) + self.session.commit() + + issue = model.Issue( + id=pagure.lib.get_next_id(self.session, 1), + project_id=1, + title='Issue #2', + content='Description #2', + user_id=1, + uid=uuid.uuid4().hex, + private=False, + ) + self.session.add(issue) + self.session.commit() + + self.assertEqual( + self.session.query(model.Project).count(), 1) + self.assertEqual( + self.session.query(model.TagColored).count(), 2) + self.assertEqual( + self.session.query(model.Issue).count(), 2) + + project = self.session.query( + model.Project + ).filter( + model.Project.id==1 + ).one() + self.session.delete(project) + self.session.commit() + + self.assertEqual( + self.session.query(model.Project).count(), 0) + self.assertEqual( + self.session.query(model.TagColored).count(), 0) + self.assertEqual( + self.session.query(model.Issue).count(), 0) + + def test_delete_project_with_coloredtags_and_tagged_issues(self): + """ Test the model when we delete a project with Colored tags and + tagged issues. """ + + # Create a project + item = model.Project( + user_id=1, # pingou + name='test', + description='test project #1', + hook_token='aaabbbiii', + ) + self.session.add(item) + self.session.commit() + + # Create two ColoredTags + tagobj = model.TagColored( + tag='Tag#1', + project_id=1 + ) + self.session.add(tagobj) + self.session.flush() + + tagobj = model.TagColored( + tag='Tag#2', + project_id=1 + ) + self.session.add(tagobj) + self.session.flush() + + # Create issues + issue = model.Issue( + id=pagure.lib.get_next_id(self.session, 1), + project_id=1, + title='Issue #1', + content='Description #1', + user_id=1, + uid='Issue#1', + private=False, + ) + self.session.add(issue) + self.session.commit() + + issue = model.Issue( + id=pagure.lib.get_next_id(self.session, 1), + project_id=1, + title='Issue #2', + content='Description #2', + user_id=1, + uid='Issue#2', + private=False, + ) + self.session.add(issue) + self.session.commit() + + # Tag the issue + tagissue = model.TagIssueColored( + issue_uid='Issue#1', + tag_id=1 + ) + self.session.add(tagissue) + self.session.commit() + + tagissue = model.TagIssueColored( + issue_uid='Issue#2', + tag_id=2 + ) + self.session.add(tagissue) + self.session.commit() + + self.assertEqual( + self.session.query(model.Project).count(), 1) + self.assertEqual( + self.session.query(model.TagColored).count(), 2) + self.assertEqual( + self.session.query(model.Issue).count(), 2) + + project = self.session.query( + model.Project + ).filter( + model.Project.id==1 + ).one() + self.session.delete(project) + self.session.commit() + + self.assertEqual( + self.session.query(model.Project).count(), 0) + self.assertEqual( + self.session.query(model.TagColored).count(), 0) + self.assertEqual( + self.session.query(model.Issue).count(), 0) + +if __name__ == '__main__': + unittest.main(verbosity=2) diff --git a/tests/lib/test_pagure_lib_notify.py b/tests/lib/test_pagure_lib_notify.py new file mode 100644 index 0000000..97d6e22 --- /dev/null +++ b/tests/lib/test_pagure_lib_notify.py @@ -0,0 +1,383 @@ +# -*- coding: utf-8 -*- + +""" + (c) 2016 - Copyright Red Hat Inc + + Authors: + Pierre-Yves Chibon + +""" + +__requires__ = ['SQLAlchemy >= 0.8'] +import pkg_resources + +import unittest +import shutil +import sys +import os + +from mock import patch, MagicMock + +sys.path.insert(0, os.path.join(os.path.dirname( + os.path.abspath(__file__)), '..')) + +import pagure.lib +import pagure.lib.model +import pagure.lib.notify +import tests + + +class PagureLibNotifytests(tests.Modeltests): + """ Tests for pagure.lib.notify """ + + def test_get_emails_for_obj_issue(self): + """ Test the _get_emails_for_obj method from pagure.lib.notify. """ + + # Create the project ns/test + item = pagure.lib.model.Project( + user_id=1, # pingou + name='test3', + namespace='ns', + description='test project #1', + hook_token='aaabbbcccdd', + ) + item.close_status = ['Invalid', 'Insufficient data', 'Fixed'] + self.session.add(item) + self.session.commit() + + # Create the ticket + iss = pagure.lib.new_issue( + issue_id=4, + session=self.session, + repo=item, + title='test issue', + content='content test issue', + user='pingou', + ticketfolder=None, + ) + self.session.commit() + self.assertEqual(iss.id, 4) + self.assertEqual(iss.title, 'test issue') + + exp = set(['bar@pingou.com']) + out = pagure.lib.notify._get_emails_for_obj(iss) + self.assertEqual(out, exp) + + # Comment on the ticket + out = pagure.lib.add_issue_comment( + self.session, + issue=iss, + comment='This is a comment', + user='foo', + ticketfolder=None, + notify=False) + self.assertEqual(out, 'Comment added') + + exp = set(['bar@pingou.com', 'foo@bar.com']) + out = pagure.lib.notify._get_emails_for_obj(iss) + self.assertEqual(out, exp) + + # Create user `bar` + item = pagure.lib.model.User( + user='bar', + fullname='bar name', + password='bar', + default_email='bar@bar.com', + ) + self.session.add(item) + item = pagure.lib.model.UserEmail( + user_id=3, + email='bar@bar.com') + self.session.add(item) + self.session.commit() + + # Watch the ticket + out = pagure.lib.set_watch_obj(self.session, 'bar', iss, True) + self.assertEqual(out, 'You are now watching this issue') + + exp = set(['bar@pingou.com', 'foo@bar.com', 'bar@bar.com']) + out = pagure.lib.notify._get_emails_for_obj(iss) + self.assertEqual(out, exp) + + def test_get_emails_for_obj_issue_watching_project(self): + """ Test the _get_emails_for_obj method from pagure.lib.notify. """ + + # Create the project ns/test + item = pagure.lib.model.Project( + user_id=1, # pingou + name='test3', + namespace='ns', + description='test project #1', + hook_token='aaabbbcccdd', + ) + item.close_status = ['Invalid', 'Insufficient data', 'Fixed'] + self.session.add(item) + self.session.commit() + + # Create the ticket + iss = pagure.lib.new_issue( + issue_id=4, + session=self.session, + repo=item, + title='test issue', + content='content test issue', + user='pingou', + ticketfolder=None, + ) + self.session.commit() + self.assertEqual(iss.id, 4) + self.assertEqual(iss.title, 'test issue') + + exp = set(['bar@pingou.com']) + out = pagure.lib.notify._get_emails_for_obj(iss) + self.assertEqual(out, exp) + + # Comment on the ticket + out = pagure.lib.add_issue_comment( + self.session, + issue=iss, + comment='This is a comment', + user='foo', + ticketfolder=None, + notify=False) + self.assertEqual(out, 'Comment added') + + exp = set(['bar@pingou.com', 'foo@bar.com']) + out = pagure.lib.notify._get_emails_for_obj(iss) + self.assertEqual(out, exp) + + # Create user `bar` + item = pagure.lib.model.User( + user='bar', + fullname='bar name', + password='bar', + default_email='bar@bar.com', + ) + self.session.add(item) + item = pagure.lib.model.UserEmail( + user_id=3, + email='bar@bar.com') + self.session.add(item) + self.session.commit() + + # Watch the project + repo = pagure.get_authorized_project(self.session, 'test3', namespace='ns') + out = pagure.lib.update_watch_status(self.session, repo, 'bar', '1') + self.assertEqual( + out, 'You are now watching issues and PRs on this project') + + exp = set(['bar@pingou.com', 'foo@bar.com', 'bar@bar.com']) + out = pagure.lib.notify._get_emails_for_obj(iss) + self.assertEqual(out, exp) + + @patch('pagure.lib.notify.smtplib.SMTP') + def test_get_emails_for_obj_pr(self, mock_smtp): + """ Test the _get_emails_for_obj method from pagure.lib.notify. """ + mock_smtp.return_value = MagicMock() + + tests.create_projects(self.session) + + # Create the project ns/test + item = pagure.lib.model.Project( + user_id=1, # pingou + name='test3', + namespace='ns', + description='test project #1', + hook_token='aaabbbcccdd', + ) + item.close_status = ['Invalid', 'Insufficient data', 'Fixed'] + self.session.add(item) + self.session.commit() + + # Create the PR + repo = pagure.lib._get_project(self.session, 'test') + req = pagure.lib.new_pull_request( + session=self.session, + repo_from=repo, + branch_from='master', + repo_to=repo, + branch_to='master', + title='test pull-request', + user='pingou', + requestfolder=None, + ) + self.session.commit() + self.assertEqual(req.id, 1) + self.assertEqual(req.title, 'test pull-request') + self.assertEqual(repo.open_requests, 1) + + exp = set(['bar@pingou.com']) + out = pagure.lib.notify._get_emails_for_obj(req) + self.assertEqual(out, exp) + + # Comment on the ticket + out = pagure.lib.add_pull_request_comment( + self.session, + request=req, + commit=None, + tree_id=None, + filename=None, + row=None, + comment='This is a comment', + user='foo', + requestfolder=None, + notify=False) + self.assertEqual(out, 'Comment added') + + exp = set(['bar@pingou.com', 'foo@bar.com']) + out = pagure.lib.notify._get_emails_for_obj(req) + self.assertEqual(out, exp) + + # Create user `bar` + item = pagure.lib.model.User( + user='bar', + fullname='bar name', + password='bar', + default_email='bar@bar.com', + ) + self.session.add(item) + item = pagure.lib.model.UserEmail( + user_id=3, + email='bar@bar.com') + self.session.add(item) + self.session.commit() + + # Watch the pull-request + out = pagure.lib.set_watch_obj(self.session, 'bar', req, True) + self.assertEqual(out, 'You are now watching this pull-request') + + exp = set(['bar@pingou.com', 'foo@bar.com', 'bar@bar.com']) + out = pagure.lib.notify._get_emails_for_obj(req) + self.assertEqual(out, exp) + + @patch('pagure.lib.notify.smtplib.SMTP') + def test_get_emails_for_obj_pr_watching_project(self, mock_smtp): + """ Test the _get_emails_for_obj method from pagure.lib.notify. """ + mock_smtp.return_value = MagicMock() + + tests.create_projects(self.session) + + # Create the project ns/test + item = pagure.lib.model.Project( + user_id=1, # pingou + name='test3', + namespace='ns', + description='test project #1', + hook_token='aaabbbcccdd', + ) + item.close_status = ['Invalid', 'Insufficient data', 'Fixed'] + self.session.add(item) + self.session.commit() + + # Create the PR + repo = pagure.get_authorized_project(self.session, 'test') + req = pagure.lib.new_pull_request( + session=self.session, + repo_from=repo, + branch_from='master', + repo_to=repo, + branch_to='master', + title='test pull-request', + user='pingou', + requestfolder=None, + ) + self.session.commit() + self.assertEqual(req.id, 1) + self.assertEqual(req.title, 'test pull-request') + self.assertEqual(repo.open_requests, 1) + + exp = set(['bar@pingou.com']) + out = pagure.lib.notify._get_emails_for_obj(req) + self.assertEqual(out, exp) + + # Comment on the ticket + out = pagure.lib.add_pull_request_comment( + self.session, + request=req, + commit=None, + tree_id=None, + filename=None, + row=None, + comment='This is a comment', + user='foo', + requestfolder=None, + notify=False) + self.assertEqual(out, 'Comment added') + + exp = set(['bar@pingou.com', 'foo@bar.com']) + out = pagure.lib.notify._get_emails_for_obj(req) + self.assertEqual(out, exp) + + # Create user `bar` + item = pagure.lib.model.User( + user='bar', + fullname='bar name', + password='bar', + default_email='bar@bar.com', + ) + self.session.add(item) + item = pagure.lib.model.UserEmail( + user_id=3, + email='bar@bar.com') + self.session.add(item) + self.session.commit() + + # Watch the project + repo = pagure.get_authorized_project(self.session, 'test') + out = pagure.lib.update_watch_status(self.session, repo, 'bar', '1') + self.assertEqual( + out, 'You are now watching issues and PRs on this project') + + exp = set(['bar@pingou.com', 'foo@bar.com', 'bar@bar.com']) + out = pagure.lib.notify._get_emails_for_obj(req) + self.assertEqual(out, exp) + + @patch('pagure.lib.notify.smtplib.SMTP') + def test_send_email(self, mock_smtp): + """ Test the notify_new_comment method from pagure.lib.notify. """ + mock_smtp.return_value = MagicMock() + + email = pagure.lib.notify.send_email( + 'Email content', + 'Email “Subject“', + 'foo@bar.com,zöé@foo.net', + mail_id='test-pull-request-2edbf96ebe644f4bb31b94605e-1@pagure', + in_reply_to='test-pull-request-2edbf96ebe644f4bb31b94605e@pagure', + project_name='namespace/project', + user_from='Zöé', + ) + exp = '''Content-Type: text/plain; charset="utf-8" +MIME-Version: 1.0 +Content-Transfer-Encoding: base64 +Subject: =?utf-8?b?W25hbWVzcGFjZS9wcm9qZWN0XSBFbWFpbCDigJxTdWJqZWN04oCc?= +From: =?utf-8?b?WsO2w6k=?= +mail-id: test-pull-request-2edbf96ebe644f4bb31b94605e-1@pagure +Message-Id: +In-Reply-To: +X-Auto-Response-Suppress: All +X-pagure: https://pagure.org/ +X-pagure-project: namespace/project +List-ID: namespace/project +List-Archive: https://pagure.org/namespace/project +To: zöé@foo.net +Reply-To: reply+42f5809bca16d73f59180bdcc76c981e939b5eab5c02930d7d7dd38f45118b89e9ceb877e94e7f22376fbf35aab1d0e8e83dfb074ee82640cc82da12ea8019ca@pagure.org +Mail-Followup-To: reply+42f5809bca16d73f59180bdcc76c981e939b5eab5c02930d7d7dd38f45118b89e9ceb877e94e7f22376fbf35aab1d0e8e83dfb074ee82640cc82da12ea8019ca@pagure.org + +RW1haWwgY29udGVudA== +''' + self.assertEqual(email.as_string(), exp) + + email = pagure.lib.notify.send_email( + 'Email content', + 'Email “Subject“', + u'foo@bar.com,zöé@foo.net', + mail_id='test-pull-request-2edbf96ebe644f4bb31b94605e-1@pagure', + in_reply_to='test-pull-request-2edbf96ebe644f4bb31b94605e@pagure', + project_name='namespace/project', + user_from='Zöé', + ) + self.assertEqual(email.as_string(), exp) + + +if __name__ == '__main__': + unittest.main(verbosity=2) diff --git a/tests/lib/test_pagure_lib_notify_email.py b/tests/lib/test_pagure_lib_notify_email.py new file mode 100644 index 0000000..fb5bcf1 --- /dev/null +++ b/tests/lib/test_pagure_lib_notify_email.py @@ -0,0 +1,207 @@ +# -*- coding: utf-8 -*- + +""" + (c) 2016 - Copyright Red Hat Inc + + Authors: + Adam Williamson + +""" + +import unittest +import sys +import os + +import mock + +sys.path.insert(0, os.path.join(os.path.dirname( + os.path.abspath(__file__)), '..')) + +import pagure.lib # pylint: disable=wrong-import-position +import pagure.lib.model # pylint: disable=wrong-import-position +import pagure.lib.notify # pylint: disable=wrong-import-position +import tests # pylint: disable=wrong-import-position + + +class PagureLibNotifyEmailtests(tests.Modeltests): + """ Some tests for the various email construction functions. In + their own class so they can have some shared fixtures. + """ + + def setUp(self): + """ Override setUp to add more fixtures used for many tests. """ + super(PagureLibNotifyEmailtests, self).setUp() + pagure.SESSION = self.session + tests.create_projects(self.session) + + # we don't want to send any mails while setting up + patcher = mock.patch('pagure.lib.notify.send_email') + patcher.start() + + self.user1 = pagure.lib.get_user(self.session, 'pingou') + self.user2 = pagure.lib.get_user(self.session, 'foo') + self.project1 = pagure.lib._get_project(self.session, 'test') + self.project2 = pagure.lib._get_project(self.session, 'test2') + self.project3 = pagure.lib._get_project(self.session, 'test3', namespace='somenamespace') + + # Create a forked repo, should be project #4 + # Not using fork_project as it tries to do a git clone + item = pagure.lib.model.Project( + user_id=2, # foo + name='test', + description='test project #1', + is_fork=True, + parent_id=1, + hook_token='aaabbbyyy', + ) + self.session.add(item) + self.session.commit() + self.forkedproject = pagure.lib._get_project(self.session, 'test', user='foo') + + # Report an issue on project #1 + self.issue1 = pagure.lib.new_issue( + session=self.session, + repo=self.project1, + title='issue', + content='a bug report', + user='pingou', + ticketfolder=None, + ) + + # Add a comment on the issue + pagure.lib.add_issue_comment( + self.session, + self.issue1, + comment='Test comment', + user='pingou', + ticketfolder=None, + ) + self.comment1 = pagure.lib.get_issue_comment(self.session, self.issue1.uid, 1) + + # Report an issue on project #3 (namespaced) + self.issue2 = pagure.lib.new_issue( + session=self.session, + repo=self.project3, + title='namespaced project issue', + content='a bug report on a namespaced project', + user='pingou', + ticketfolder=None, + ) + + # report an issue on foo's fork of project #1 + self.issue3 = pagure.lib.new_issue( + session=self.session, + repo=self.forkedproject, + title='forked project issue', + content='a bug report on a forked project', + user='pingou', + ticketfolder=None, + ) + + patcher.stop() + + @mock.patch('pagure.lib.notify.send_email') + def test_notify_new_comment(self, fakemail): + """Simple test for notification about new comment.""" + exptext = u""" +pingou added a new comment to an issue you are following: +`` +Test comment +`` + +To reply, visit the link below +https://pagure.org/test/issue/1 +""" + pagure.lib.notify.notify_new_comment(self.comment1) + (_, args, kwargs) = fakemail.mock_calls[0] + + # Mail text should be as expected. + self.assertEqual(args[0], exptext) + + # Mail subject should be as expected. + self.assertEqual(args[1], u'Issue #1: issue') + + # Mail should be sent to user #1. + self.assertEqual(args[2], self.user1.default_email) + + # Mail ID should be comment #1's mail ID... + self.assertEqual(kwargs['mail_id'], self.comment1.mail_id) + + # In reply to issue #1's mail ID. + self.assertEqual(kwargs['in_reply_to'], self.issue1.mail_id) + + # Project name should be...project (full) name. + self.assertEqual(kwargs['project_name'], self.project1.fullname) + + # Mail should be from user1 (who wrote the comment). + self.assertEqual(kwargs['user_from'], self.user1.fullname) + + @mock.patch('pagure.lib.notify.send_email') + def test_notify_new_issue_namespaced(self, fakemail): # pylint: disable=invalid-name + """Test for notifying of a new issue, namespaced project.""" + exptext = u""" +pingou reported a new issue against the project: `test3` that you are following: +`` +a bug report on a namespaced project +`` + +To reply, visit the link below +https://pagure.org/somenamespace/test3/issue/1 +""" + pagure.lib.notify.notify_new_issue(self.issue2) + (_, args, kwargs) = fakemail.mock_calls[0] + + # Mail text should be as expected. + self.assertEqual(args[0], exptext) + + # Mail subject should be as expected. + self.assertEqual(args[1], u'Issue #1: namespaced project issue') + + # Mail should be sent to user #1. + self.assertEqual(args[2], self.user1.default_email) + + # Mail ID should be issue's mail ID. + self.assertEqual(kwargs['mail_id'], self.issue2.mail_id) + + # Project name should be...project (full) name. + self.assertEqual(kwargs['project_name'], self.project3.fullname) + + # Mail should be from user1 (who submitted the issue). + self.assertEqual(kwargs['user_from'], self.user1.fullname) + + @mock.patch('pagure.lib.notify.send_email') + def test_notify_assigned_issue_forked(self, fakemail): # pylint: disable=invalid-name + """Test for notifying re-assignment of issue on forked project. + 'foo' reassigns issue on his fork of 'test' to 'pingou'. + """ + exptext = u""" +The issue: `forked project issue` of project: `test` has been assigned to `pingou` by foo. + +https://pagure.org/fork/foo/test/issue/1 +""" + pagure.lib.notify.notify_assigned_issue(self.issue3, self.user1, self.user2) + (_, args, kwargs) = fakemail.mock_calls[0] + + # Mail text should be as expected. + self.assertEqual(args[0], exptext) + + # Mail subject should be as expected. + self.assertEqual(args[1], u'Issue #1: forked project issue') + + # Mail should be sent to user #1. + # NOTE: Not sent to user #2... + self.assertEqual(args[2], self.user1.default_email) + + # Mail ID should contain issue's mail ID and '/assigned/' + self.assertIn("{0}/assigned/".format(self.issue3.mail_id), kwargs['mail_id']) + + # Project name should be...project (full) name. + self.assertEqual(kwargs['project_name'], self.forkedproject.fullname) + + # Mail should be from user1 (who submitted the issue). + self.assertEqual(kwargs['user_from'], self.user2.fullname) + +# Add more tests to verify that correct mails are sent to correct people here + +if __name__ == '__main__': + unittest.main(verbosity=2) diff --git a/tests/lib/test_pagure_lib_search_projects.py b/tests/lib/test_pagure_lib_search_projects.py index 338ae77..db4af47 100644 --- a/tests/lib/test_pagure_lib_search_projects.py +++ b/tests/lib/test_pagure_lib_search_projects.py @@ -4,7 +4,7 @@ import tests import pagure.lib -class PagureLibtests_search_projects(tests.Modeltests): +class PagureLibtests_search_projects(tests.SimplePagureTest): """ Test the pagure.lib search_projects() method """ diff --git a/tests/lib/test_pagure_lib_search_user.py b/tests/lib/test_pagure_lib_search_user.py index af0a8a0..a8fb798 100644 --- a/tests/lib/test_pagure_lib_search_user.py +++ b/tests/lib/test_pagure_lib_search_user.py @@ -4,7 +4,7 @@ import tests import pagure.lib -class PagureLibtests_search_user(tests.Modeltests): +class PagureLibtests_search_user(tests.SimplePagureTest): """ Test the pagure.lib search_user() method """ diff --git a/tests/lib/test_pagure_lib_watch_list.py b/tests/lib/test_pagure_lib_watch_list.py new file mode 100644 index 0000000..b9ea55c --- /dev/null +++ b/tests/lib/test_pagure_lib_watch_list.py @@ -0,0 +1,524 @@ +# -*- coding: utf-8 -*- + +""" + (c) 2016 - Copyright Red Hat Inc + + Authors: + Pierre-Yves Chibon + +""" + +__requires__ = ['SQLAlchemy >= 0.8'] +import pkg_resources + +import unittest +import shutil +import sys +import os + +import mock + +sys.path.insert(0, os.path.join(os.path.dirname( + os.path.abspath(__file__)), '..')) + +import pagure.lib +import pagure.lib.model +import tests + +@mock.patch( + 'pagure.lib.git.update_git', mock.MagicMock(return_value=True)) +@mock.patch( + 'pagure.lib.notify.send_email', mock.MagicMock(return_value=True)) +class PagureLibGetWatchListtests(tests.SimplePagureTest): + """ Tests for pagure.lib.get_watch_list """ + + def test_get_watch_list_invalid_object(self): + """ Test get_watch_list when given an invalid object """ + # Create a project ns/test + item = pagure.lib.model.Project( + user_id=1, # pingou + name='test3', + namespace='ns', + description='test project #1', + hook_token='aaabbbcccdd', + ) + item.close_status = ['Invalid', 'Insufficient data', 'Fixed'] + self.session.add(item) + self.session.commit() + + self.assertRaises( + pagure.exceptions.InvalidObjectException, + pagure.lib.get_watch_list, + self.session, + item + ) + + def test_get_watch_list_simple(self): + """ Test get_watch_list when the creator of the ticket is the + creator of the project """ + # Create a project ns/test + item = pagure.lib.model.Project( + user_id=1, # pingou + name='test3', + namespace='ns', + description='test project #1', + hook_token='aaabbbcccdd', + ) + item.close_status = ['Invalid', 'Insufficient data', 'Fixed'] + self.session.add(item) + self.session.commit() + + # Create the ticket + iss = pagure.lib.new_issue( + issue_id=4, + session=self.session, + repo=item, + title='test issue', + content='content test issue', + user='pingou', + ticketfolder=None, + ) + self.session.commit() + self.assertEqual(iss.id, 4) + self.assertEqual(iss.title, 'test issue') + + self.assertEqual( + pagure.lib.get_watch_list(self.session, iss), + set(['pingou']) + ) + + def test_get_watch_list_different_creator(self): + """ Test get_watch_list when the creator of the ticket is not the + creator of the project """ + # Create a project ns/test + item = pagure.lib.model.Project( + user_id=1, # pingou + name='test3', + namespace='ns', + description='test project #1', + hook_token='aaabbbcccdd', + ) + item.close_status = ['Invalid', 'Insufficient data', 'Fixed'] + self.session.add(item) + self.session.commit() + + # Create the ticket + iss = pagure.lib.new_issue( + issue_id=4, + session=self.session, + repo=item, + title='test issue', + content='content test issue', + user='foo', + ticketfolder=None, + ) + self.session.commit() + self.assertEqual(iss.id, 4) + self.assertEqual(iss.title, 'test issue') + + self.assertEqual( + pagure.lib.get_watch_list(self.session, iss), + set(['pingou', 'foo']) + ) + + def test_get_watch_list_project_w_contributor(self): + """ Test get_watch_list when the project has more than one + contributor """ + # Create a project ns/test3 + item = pagure.lib.model.Project( + user_id=1, # pingou + name='test3', + namespace='ns', + description='test project #1', + hook_token='aaabbbcccdd', + ) + item.close_status = ['Invalid', 'Insufficient data', 'Fixed'] + self.session.add(item) + self.session.commit() + + # Add a contributor to the project + item = pagure.lib.model.User( + user='bar', + fullname='bar foo', + password='foo', + default_email='bar@bar.com', + ) + self.session.add(item) + item = pagure.lib.model.UserEmail( + user_id=3, + email='bar@bar.com') + self.session.add(item) + + project = pagure.lib._get_project( + self.session, 'test3', namespace='ns') + msg = pagure.lib.add_user_to_project( + session=self.session, + project=project, + new_user='bar', + user='pingou', + ) + self.session.commit() + self.assertEqual(msg, 'User added') + + # Create the ticket + iss = pagure.lib.new_issue( + issue_id=4, + session=self.session, + repo=project, + title='test issue', + content='content test issue', + user='foo', + ticketfolder=None, + ) + self.session.commit() + self.assertEqual(iss.id, 4) + self.assertEqual(iss.title, 'test issue') + + self.assertEqual( + pagure.lib.get_watch_list(self.session, iss), + set(['pingou', 'foo', 'bar']) + ) + + def test_get_watch_list_user_in_group(self): + """ Test get_watch_list when the project has groups of contributors + """ + # Create a project ns/test3 + item = pagure.lib.model.Project( + user_id=1, # pingou + name='test3', + namespace='ns', + description='test project #1', + hook_token='aaabbbcccdd', + ) + item.close_status = ['Invalid', 'Insufficient data', 'Fixed'] + self.session.add(item) + self.session.commit() + + # Create a third user + item = pagure.lib.model.User( + user='bar', + fullname='bar foo', + password='foo', + default_email='bar@bar.com', + ) + self.session.add(item) + item = pagure.lib.model.UserEmail( + user_id=3, + email='bar@bar.com') + self.session.add(item) + + # Create a group + msg = pagure.lib.add_group( + self.session, + group_name='foo', + display_name='foo group', + description=None, + group_type='bar', + user='pingou', + is_admin=False, + blacklist=[], + ) + self.session.commit() + self.assertEqual(msg, 'User `pingou` added to the group `foo`.') + + # Add user to group + group = pagure.lib.search_groups(self.session, group_name='foo') + msg = pagure.lib.add_user_to_group( + self.session, + username='bar', + group=group, + user='pingou', + is_admin=False, + ) + self.session.commit() + self.assertEqual(msg, 'User `bar` added to the group `foo`.') + + project = pagure.lib._get_project( + self.session, 'test3', namespace='ns') + + # Add group to project + msg = pagure.lib.add_group_to_project( + session=self.session, + project=project, + new_group='foo', + user='pingou', + ) + self.session.commit() + self.assertEqual(msg, 'Group added') + + # Create the ticket + iss = pagure.lib.new_issue( + issue_id=4, + session=self.session, + repo=project, + title='test issue', + content='content test issue', + user='foo', + ticketfolder=None, + ) + self.session.commit() + self.assertEqual(iss.id, 4) + self.assertEqual(iss.title, 'test issue') + + self.assertEqual( + pagure.lib.get_watch_list(self.session, iss), + set(['pingou', 'foo', 'bar']) + ) + + def test_get_watch_list_project_w_contributor_out(self): + """ Test get_watch_list when the project has one contributor not + watching the project """ + # Create a project ns/test3 + item = pagure.lib.model.Project( + user_id=1, # pingou + name='test3', + namespace='ns', + description='test project #1', + hook_token='aaabbbcccdd', + ) + item.close_status = ['Invalid', 'Insufficient data', 'Fixed'] + self.session.add(item) + self.session.commit() + + # Add a contributor to the project + item = pagure.lib.model.User( + user='bar', + fullname='bar foo', + password='foo', + default_email='bar@bar.com', + ) + self.session.add(item) + item = pagure.lib.model.UserEmail( + user_id=3, + email='bar@bar.com') + self.session.add(item) + + project = pagure.lib._get_project( + self.session, 'test3', namespace='ns') + msg = pagure.lib.add_user_to_project( + session=self.session, + project=project, + new_user='bar', + user='pingou', + ) + self.session.commit() + self.assertEqual(msg, 'User added') + + # Set the user `pingou` to not watch the project + msg = pagure.lib.update_watch_status( + session=self.session, + project=project, + user='pingou', + watch='0', + ) + self.session.commit() + self.assertEqual(msg, 'You are no longer watching this project') + + # Create the ticket + iss = pagure.lib.new_issue( + issue_id=4, + session=self.session, + repo=project, + title='test issue', + content='content test issue', + user='foo', + ticketfolder=None, + ) + self.session.commit() + self.assertEqual(iss.id, 4) + self.assertEqual(iss.title, 'test issue') + + self.assertEqual( + pagure.lib.get_watch_list(self.session, iss), + set(['foo', 'bar']) + ) + + def test_get_watch_list_project_w_contributor_out_pr(self): + """ Test get_watch_list when the project has one contributor not + watching the pull-request """ + # Create a project ns/test3 + item = pagure.lib.model.Project( + user_id=1, # pingou + name='test3', + namespace='ns', + description='test project #1', + hook_token='aaabbbcccdd', + ) + item.close_status = ['Invalid', 'Insufficient data', 'Fixed'] + self.session.add(item) + self.session.commit() + + # Add a contributor to the project + item = pagure.lib.model.User( + user='bar', + fullname='bar foo', + password='foo', + default_email='bar@bar.com', + ) + self.session.add(item) + item = pagure.lib.model.UserEmail( + user_id=3, + email='bar@bar.com') + self.session.add(item) + + project = pagure.lib._get_project( + self.session, 'test3', namespace='ns') + msg = pagure.lib.add_user_to_project( + session=self.session, + project=project, + new_user='bar', + user='pingou', + ) + self.session.commit() + self.assertEqual(msg, 'User added') + + # Create the pull-request + req = pagure.lib.new_pull_request( + session=self.session, + repo_from=project, + branch_from='dev', + repo_to=project, + branch_to='master', + title='test pull-request', + user='foo', + requestfolder=None, + ) + self.session.commit() + self.assertEqual(req.id, 1) + self.assertEqual(req.title, 'test pull-request') + + # Set the user `pingou` to not watch the pull-request + out = pagure.lib.set_watch_obj(self.session, 'pingou', req, False) + self.assertEqual( + out, 'You are no longer watching this pull-request') + + self.assertEqual( + pagure.lib.get_watch_list(self.session, req), + set(['foo', 'bar']) + ) + + def test_get_watch_list_project_w_contributor_watching_project(self): + """ Test get_watch_list when the project has one contributor watching + the project """ + # Create a project ns/test3 + item = pagure.lib.model.Project( + user_id=1, # pingou + name='test3', + namespace='ns', + description='test project #1', + hook_token='aaabbbcccdd', + ) + item.close_status = ['Invalid', 'Insufficient data', 'Fixed'] + self.session.add(item) + self.session.commit() + + # Add a new user + item = pagure.lib.model.User( + user='bar', + fullname='bar foo', + password='foo', + default_email='bar@bar.com', + ) + self.session.add(item) + item = pagure.lib.model.UserEmail( + user_id=3, + email='bar@bar.com') + self.session.add(item) + + # Set the user `bar` to watch the project + project = pagure.lib._get_project( + self.session, 'test3', namespace='ns') + msg = pagure.lib.update_watch_status( + session=self.session, + project=project, + user='bar', + watch='1', + ) + self.session.commit() + self.assertEqual( + msg, 'You are now watching issues and PRs on this project') + + # Create the pull-request + req = pagure.lib.new_pull_request( + session=self.session, + repo_from=project, + branch_from='dev', + repo_to=project, + branch_to='master', + title='test pull-request', + user='foo', + requestfolder=None, + ) + self.session.commit() + self.assertEqual(req.id, 1) + self.assertEqual(req.title, 'test pull-request') + + self.assertEqual( + pagure.lib.get_watch_list(self.session, req), + set(['foo', 'bar', 'pingou']) + ) + + def test_get_watch_list_project_w_private_issue(self): + """ Test get_watch_list when the project has one contributor watching + the project and the issue is private """ + # Create a project ns/test3 + item = pagure.lib.model.Project( + user_id=1, # pingou + name='test3', + namespace='ns', + description='test project #1', + hook_token='aaabbbcccdd', + ) + item.close_status = ['Invalid', 'Insufficient data', 'Fixed'] + self.session.add(item) + self.session.commit() + + # Add a new user + item = pagure.lib.model.User( + user='bar', + fullname='bar foo', + password='foo', + default_email='bar@bar.com', + ) + self.session.add(item) + item = pagure.lib.model.UserEmail( + user_id=3, + email='bar@bar.com') + self.session.add(item) + + # Set the user `bar` to watch the project + project = pagure.get_authorized_project( + self.session, 'test3', namespace='ns') + msg = pagure.lib.update_watch_status( + session=self.session, + project=project, + user='bar', + watch='1', + ) + self.session.commit() + self.assertEqual( + msg, 'You are now watching issues and PRs on this project') + + # Create the ticket + iss = pagure.lib.new_issue( + issue_id=4, + session=self.session, + repo=project, + title='test issue', + content='content test issue', + user='pingou', + private=True, + ticketfolder=None, + ) + self.session.commit() + self.assertEqual(iss.id, 4) + self.assertEqual(iss.title, 'test issue') + + self.assertEqual( + pagure.lib.get_watch_list(self.session, iss), + set(['pingou']) + ) + + +if __name__ == '__main__': + unittest.main(verbosity=2) diff --git a/tests/test_pagure_exclude_group_index.py b/tests/test_pagure_exclude_group_index.py index 9a02c49..6f63cd2 100644 --- a/tests/test_pagure_exclude_group_index.py +++ b/tests/test_pagure_exclude_group_index.py @@ -26,7 +26,7 @@ import pagure.lib import pagure.lib.model import tests -class PagureExcludeGroupIndex(tests.Modeltests): +class PagureExcludeGroupIndex(tests.SimplePagureTest): """ Tests the EXCLUDE_GROUP_INDEX configuration key in pagure """ def setUp(self): diff --git a/tests/test_pagure_flask.py b/tests/test_pagure_flask.py index 9157677..d8fdf7a 100644 --- a/tests/test_pagure_flask.py +++ b/tests/test_pagure_flask.py @@ -29,7 +29,7 @@ import pagure.lib.model import tests -class PagureGetRemoteRepoPath(tests.Modeltests): +class PagureGetRemoteRepoPath(tests.SimplePagureTest): """ Tests for pagure """ def setUp(self): diff --git a/tests/test_pagure_flask_api.py b/tests/test_pagure_flask_api.py index fbee2a2..7891a4e 100644 --- a/tests/test_pagure_flask_api.py +++ b/tests/test_pagure_flask_api.py @@ -26,7 +26,7 @@ import pagure.lib import tests -class PagureFlaskApitests(tests.Modeltests): +class PagureFlaskApitests(tests.SimplePagureTest): """ Tests for flask API controller of pagure """ def setUp(self): diff --git a/tests/test_pagure_flask_api_auth.py b/tests/test_pagure_flask_api_auth.py index afdd070..567959f 100644 --- a/tests/test_pagure_flask_api_auth.py +++ b/tests/test_pagure_flask_api_auth.py @@ -27,7 +27,7 @@ import pagure.lib import tests -class PagureFlaskApiAuthtests(tests.Modeltests): +class PagureFlaskApiAuthtests(tests.SimplePagureTest): """ Tests for the authentication in the flask API of pagure """ def setUp(self): diff --git a/tests/test_pagure_flask_api_group.py b/tests/test_pagure_flask_api_group.py index 19977b7..3e267fa 100644 --- a/tests/test_pagure_flask_api_group.py +++ b/tests/test_pagure_flask_api_group.py @@ -22,7 +22,7 @@ import pagure.lib import tests -class PagureFlaskApiGroupTests(tests.Modeltests): +class PagureFlaskApiGroupTests(tests.SimplePagureTest): """ Tests for the flask API of pagure for issue """ def setUp(self): diff --git a/tests/test_pagure_flask_docs.py b/tests/test_pagure_flask_docs.py index 90077cb..b6608d0 100644 --- a/tests/test_pagure_flask_docs.py +++ b/tests/test_pagure_flask_docs.py @@ -31,7 +31,7 @@ import tests from pagure.lib.repo import PagureRepo -class PagureFlaskDocstests(tests.Modeltests): +class PagureFlaskDocstests(tests.SimplePagureTest): """ Tests for flask docs of pagure """ def setUp(self): diff --git a/tests/test_pagure_flask_form.py b/tests/test_pagure_flask_form.py index 2b16546..0b4a6a5 100644 --- a/tests/test_pagure_flask_form.py +++ b/tests/test_pagure_flask_form.py @@ -28,7 +28,7 @@ import pagure.forms import tests -class PagureFlaskFormTests(tests.Modeltests): +class PagureFlaskFormTests(tests.SimplePagureTest): """ Tests for forms of the flask application """ def setUpt(self): diff --git a/tests/test_pagure_flask_ui_app_give_project.py b/tests/test_pagure_flask_ui_app_give_project.py index c3a0416..ea5cb08 100644 --- a/tests/test_pagure_flask_ui_app_give_project.py +++ b/tests/test_pagure_flask_ui_app_give_project.py @@ -27,7 +27,7 @@ import pagure.lib import tests -class PagureFlaskGiveRepotests(tests.Modeltests): +class PagureFlaskGiveRepotests(tests.SimplePagureTest): """ Tests for give a project on pagure """ def setUp(self): diff --git a/tests/test_pagure_flask_ui_issues_acl_checks.py b/tests/test_pagure_flask_ui_issues_acl_checks.py index 7f3bdec..657ec91 100644 --- a/tests/test_pagure_flask_ui_issues_acl_checks.py +++ b/tests/test_pagure_flask_ui_issues_acl_checks.py @@ -34,7 +34,7 @@ import pagure.lib import tests -class PagureFlaskIssuesACLtests(tests.Modeltests): +class PagureFlaskIssuesACLtests(tests.SimplePagureTest): """ Tests for flask issues controller of pagure for acls """ def setUp(self): diff --git a/tests/test_pagure_flask_ui_login.py b/tests/test_pagure_flask_ui_login.py index 5312a0d..d4ce901 100644 --- a/tests/test_pagure_flask_ui_login.py +++ b/tests/test_pagure_flask_ui_login.py @@ -35,7 +35,7 @@ from pagure.lib.repo import PagureRepo import pagure.ui.login -class PagureFlaskLogintests(tests.Modeltests): +class PagureFlaskLogintests(tests.SimplePagureTest): """ Tests for flask app controller of pagure """ def setUp(self): diff --git a/tests/test_pagure_flask_ui_no_master_branch.py b/tests/test_pagure_flask_ui_no_master_branch.py index 9f82fa9..a410eb8 100644 --- a/tests/test_pagure_flask_ui_no_master_branch.py +++ b/tests/test_pagure_flask_ui_no_master_branch.py @@ -29,7 +29,7 @@ import tests from pagure.lib.repo import PagureRepo -class PagureFlaskNoMasterBranchtests(tests.Modeltests): +class PagureFlaskNoMasterBranchtests(tests.SimplePagureTest): """ Tests for flask application when the git repo has no master branch. """ diff --git a/tests/test_pagure_flask_ui_old_commit.py b/tests/test_pagure_flask_ui_old_commit.py index ac09026..03595a4 100644 --- a/tests/test_pagure_flask_ui_old_commit.py +++ b/tests/test_pagure_flask_ui_old_commit.py @@ -30,7 +30,7 @@ import tests from pagure.lib.repo import PagureRepo -class PagureFlaskRepoOldUrltests(tests.Modeltests): +class PagureFlaskRepoOldUrltests(tests.SimplePagureTest): """ Tests for flask app controller of pagure """ def setUp(self): diff --git a/tests/test_pagure_flask_ui_plugins.py b/tests/test_pagure_flask_ui_plugins.py index 420860b..57f0780 100644 --- a/tests/test_pagure_flask_ui_plugins.py +++ b/tests/test_pagure_flask_ui_plugins.py @@ -40,7 +40,7 @@ class FakeForm(wtforms.Form): ) -class PagureFlaskPluginstests(tests.Modeltests): +class PagureFlaskPluginstests(tests.SimplePagureTest): """ Tests for flask plugins controller of pagure """ def setUp(self): diff --git a/tests/test_pagure_flask_ui_plugins_fedmsg.py b/tests/test_pagure_flask_ui_plugins_fedmsg.py index ad41463..d057793 100644 --- a/tests/test_pagure_flask_ui_plugins_fedmsg.py +++ b/tests/test_pagure_flask_ui_plugins_fedmsg.py @@ -27,7 +27,7 @@ import pagure.lib import tests -class PagureFlaskPluginFedmsgtests(tests.Modeltests): +class PagureFlaskPluginFedmsgtests(tests.SimplePagureTest): """ Tests for fedmsg plugin of pagure """ def setUp(self): diff --git a/tests/test_pagure_flask_ui_plugins_irc.py b/tests/test_pagure_flask_ui_plugins_irc.py index ff3f74d..301f493 100644 --- a/tests/test_pagure_flask_ui_plugins_irc.py +++ b/tests/test_pagure_flask_ui_plugins_irc.py @@ -27,7 +27,7 @@ import pagure.lib import tests -class PagureFlaskPluginIRCtests(tests.Modeltests): +class PagureFlaskPluginIRCtests(tests.SimplePagureTest): """ Tests for pagure_hook plugin of pagure """ def setUp(self): diff --git a/tests/test_pagure_flask_ui_plugins_mail.py b/tests/test_pagure_flask_ui_plugins_mail.py index 6cafe65..1ad2c5e 100644 --- a/tests/test_pagure_flask_ui_plugins_mail.py +++ b/tests/test_pagure_flask_ui_plugins_mail.py @@ -27,7 +27,7 @@ import pagure.lib import tests -class PagureFlaskPluginMailtests(tests.Modeltests): +class PagureFlaskPluginMailtests(tests.SimplePagureTest): """ Tests for flask plugins controller of pagure """ def setUp(self): diff --git a/tests/test_pagure_flask_ui_plugins_noff.py b/tests/test_pagure_flask_ui_plugins_noff.py index 1f90245..1b1c5df 100644 --- a/tests/test_pagure_flask_ui_plugins_noff.py +++ b/tests/test_pagure_flask_ui_plugins_noff.py @@ -27,7 +27,7 @@ import pagure.lib import tests -class PagureFlaskPluginNoFFtests(tests.Modeltests): +class PagureFlaskPluginNoFFtests(tests.SimplePagureTest): """ Tests for Block non fast-forward pushes plugin of pagure """ def setUp(self): diff --git a/tests/test_pagure_flask_ui_plugins_pagure_ci.py b/tests/test_pagure_flask_ui_plugins_pagure_ci.py index aea146d..9c28e8b 100644 --- a/tests/test_pagure_flask_ui_plugins_pagure_ci.py +++ b/tests/test_pagure_flask_ui_plugins_pagure_ci.py @@ -24,7 +24,7 @@ import pagure.lib import tests -class PagureFlaskPluginPagureCItests(tests.Modeltests): +class PagureFlaskPluginPagureCItests(tests.SimplePagureTest): """ Tests for flask plugins controller of pagure """ def setUp(self): diff --git a/tests/test_pagure_flask_ui_plugins_pagure_hook.py b/tests/test_pagure_flask_ui_plugins_pagure_hook.py index 66191c8..5d22a77 100644 --- a/tests/test_pagure_flask_ui_plugins_pagure_hook.py +++ b/tests/test_pagure_flask_ui_plugins_pagure_hook.py @@ -27,7 +27,7 @@ import pagure.lib import tests -class PagureFlaskPluginPagureHooktests(tests.Modeltests): +class PagureFlaskPluginPagureHooktests(tests.SimplePagureTest): """ Tests for pagure_hook plugin of pagure """ def setUp(self): diff --git a/tests/test_pagure_flask_ui_plugins_pagure_request_hook.py b/tests/test_pagure_flask_ui_plugins_pagure_request_hook.py index 742629a..eaaacc3 100644 --- a/tests/test_pagure_flask_ui_plugins_pagure_request_hook.py +++ b/tests/test_pagure_flask_ui_plugins_pagure_request_hook.py @@ -27,7 +27,7 @@ import pagure.lib import tests -class PagureFlaskPluginPagureRequestHooktests(tests.Modeltests): +class PagureFlaskPluginPagureRequestHooktests(tests.SimplePagureTest): """ Tests for pagure_hook plugin of pagure """ def setUp(self): diff --git a/tests/test_pagure_flask_ui_plugins_pagure_ticket_hook.py b/tests/test_pagure_flask_ui_plugins_pagure_ticket_hook.py index 0f223bf..4b3788b 100644 --- a/tests/test_pagure_flask_ui_plugins_pagure_ticket_hook.py +++ b/tests/test_pagure_flask_ui_plugins_pagure_ticket_hook.py @@ -27,7 +27,7 @@ import pagure.lib import tests -class PagureFlaskPluginPagureTicketHooktests(tests.Modeltests): +class PagureFlaskPluginPagureTicketHooktests(tests.SimplePagureTest): """ Tests for pagure_hook plugin of pagure """ def setUp(self): diff --git a/tests/test_pagure_flask_ui_plugins_rtd_hook.py b/tests/test_pagure_flask_ui_plugins_rtd_hook.py index 03258b2..bfa37a6 100644 --- a/tests/test_pagure_flask_ui_plugins_rtd_hook.py +++ b/tests/test_pagure_flask_ui_plugins_rtd_hook.py @@ -27,7 +27,7 @@ import pagure.lib import tests -class PagureFlaskPluginRtdHooktests(tests.Modeltests): +class PagureFlaskPluginRtdHooktests(tests.SimplePagureTest): """ Tests for rtd_hook plugin of pagure """ def setUp(self): diff --git a/tests/test_pagure_flask_ui_plugins_unsigned.py b/tests/test_pagure_flask_ui_plugins_unsigned.py index 9303225..25733e3 100644 --- a/tests/test_pagure_flask_ui_plugins_unsigned.py +++ b/tests/test_pagure_flask_ui_plugins_unsigned.py @@ -27,7 +27,7 @@ import pagure.lib import tests -class PagureFlaskPluginUnsignedtests(tests.Modeltests): +class PagureFlaskPluginUnsignedtests(tests.SimplePagureTest): """ Tests for Block pushes with unsigned commit plugin of pagure """ def setUp(self): diff --git a/tests/test_pagure_flask_ui_priorities.py b/tests/test_pagure_flask_ui_priorities.py index 762e9a8..f22656e 100644 --- a/tests/test_pagure_flask_ui_priorities.py +++ b/tests/test_pagure_flask_ui_priorities.py @@ -31,7 +31,7 @@ import tests from pagure.lib.repo import PagureRepo -class PagureFlaskPrioritiestests(tests.Modeltests): +class PagureFlaskPrioritiestests(tests.SimplePagureTest): """ Tests for the behavior of priorities in pagure """ def setUp(self): diff --git a/tests/test_pagure_flask_ui_quick_reply.py b/tests/test_pagure_flask_ui_quick_reply.py index 9849d6f..c374588 100644 --- a/tests/test_pagure_flask_ui_quick_reply.py +++ b/tests/test_pagure_flask_ui_quick_reply.py @@ -23,7 +23,7 @@ import pagure.hooks import tests -class PagureFlaskQuickReplytest(tests.Modeltests): +class PagureFlaskQuickReplytest(tests.SimplePagureTest): """ Tests for configuring and displaying quick replies. """ def setUp(self): diff --git a/tests/test_pagure_flask_ui_repo_slash_name.py b/tests/test_pagure_flask_ui_repo_slash_name.py index 9d8c055..e24f167 100644 --- a/tests/test_pagure_flask_ui_repo_slash_name.py +++ b/tests/test_pagure_flask_ui_repo_slash_name.py @@ -29,7 +29,7 @@ import tests from pagure.lib.repo import PagureRepo -class PagureFlaskSlashInNametests(tests.Modeltests): +class PagureFlaskSlashInNametests(tests.SimplePagureTest): """ Tests for flask application when the project contains a '/'. """ diff --git a/tests/test_pagure_flask_ui_roadmap.py b/tests/test_pagure_flask_ui_roadmap.py index aa1e79f..efa8697 100644 --- a/tests/test_pagure_flask_ui_roadmap.py +++ b/tests/test_pagure_flask_ui_roadmap.py @@ -31,7 +31,7 @@ import tests from pagure.lib.repo import PagureRepo -class PagureFlaskRoadmaptests(tests.Modeltests): +class PagureFlaskRoadmaptests(tests.SimplePagureTest): """ Tests for the pagure's roadmap """ def setUp(self): diff --git a/tests/test_pagure_flask_ui_slash_branch_name.py b/tests/test_pagure_flask_ui_slash_branch_name.py index b8463f9..08da657 100644 --- a/tests/test_pagure_flask_ui_slash_branch_name.py +++ b/tests/test_pagure_flask_ui_slash_branch_name.py @@ -29,7 +29,7 @@ import tests from pagure.lib.repo import PagureRepo -class PagureFlaskSlashInBranchtests(tests.Modeltests): +class PagureFlaskSlashInBranchtests(tests.SimplePagureTest): """ Tests for flask application when the branch name contains a '/'. """ diff --git a/tests/test_pagure_lib.py b/tests/test_pagure_lib.py index 26a5187..21636a9 100644 --- a/tests/test_pagure_lib.py +++ b/tests/test_pagure_lib.py @@ -3081,202 +3081,6 @@ class PagureLibtests(tests.Modeltests): sorted(acls) ) - def test_get_project_users(self): - ''' Test the get_project_users method when combine is True - ''' - - tests.create_projects(self.session) - project = pagure.get_authorized_project(self.session, project_name='test') - - # Default value of combine is True - # which means the an admin is a user, committer as well - # and a committer is also a user - # and a user is just a user - users = project.get_project_users(access='admin') - - # Only pingou is the admin as of now - # But, he is the creator and - # the creator of the project is not listed in user_projects - # table. Thus, get_projec_users won't return him as an admin - # He has all the access of an admin though - self.assertEqual(len(users), 0) - self.assertEqual(project.user.username, 'pingou') - - # Wrong access level, should raise Accesslevelnotfound exception - self.assertRaises( - pagure.exceptions.AccessLevelNotFound, - project.get_project_users, - access='owner', - ) - - # Let's add a new user to the project, 'foo' - # By default, if no access is specified, he becomes an admin - msg = pagure.lib.add_user_to_project( - self.session, - project=project, - new_user='foo', - user='pingou' - ) - self.session.commit() - # since, he is an admin, the msg should be 'User added' - self.assertEqual(msg, 'User added') - - project = pagure.get_authorized_project(self.session, project_name='test') - users = project.get_project_users(access='admin') - - self.assertEqual(len(users), 1) - self.assertEqual(users[0].username, 'foo') - - # foo should be a committer as well, since he is an admin - users = project.get_project_users(access='commit') - - self.assertEqual(len(users), 1) - self.assertEqual(users[0].username, 'foo') - - # the admin also has ticket access - users = project.get_project_users(access='ticket') - - self.assertEqual(len(users), 1) - self.assertEqual(users[0].username, 'foo') - - # let's update the access of foo to 'committer' - msg = pagure.lib.add_user_to_project( - self.session, - project=project, - new_user='foo', - user='pingou', - access='commit' - ) - self.session.commit() - self.assertEqual(msg, 'User access updated') - - project = pagure.get_authorized_project(self.session, project_name='test') - # No admin now, even though pingou the creator is there - users = project.get_project_users(access='admin') - self.assertEqual(len(users), 0) - - users = project.get_project_users(access='commit') - # foo is the committer currently - self.assertEqual(len(users), 1) - self.assertEqual(users[0].username, 'foo') - - users = project.get_project_users(access='ticket') - - # foo also has ticket rights - self.assertEqual(len(users), 1) - self.assertEqual(users[0].username, 'foo') - - # let's update the access of foo to 'ticket' - msg = pagure.lib.add_user_to_project( - self.session, - project=project, - new_user='foo', - user='pingou', - access='ticket' - ) - self.session.commit() - self.assertEqual(msg, 'User access updated') - - project = pagure.get_authorized_project(self.session, project_name='test') - # No admin now, even though pingou the creator is there - users = project.get_project_users(access='admin') - self.assertEqual(len(users), 0) - - users = project.get_project_users(access='commit') - # foo deosn't have commit rights now - self.assertEqual(len(users), 0) - - users = project.get_project_users(access='ticket') - - # foo does have tickets right though - self.assertEqual(len(users), 1) - self.assertEqual(users[0].username, 'foo') - - def test_get_project_users_combine_false(self): - ''' Test the get_project_users method when combine is False - ''' - - tests.create_projects(self.session) - project = pagure.get_authorized_project(self.session, project_name='test') - - # Let's add a new user to the project, 'foo' - # By default, if no access is specified, he becomes an admin - msg = pagure.lib.add_user_to_project( - self.session, - project=project, - new_user='foo', - user='pingou' - ) - self.session.commit() - # since, he is an admin, the msg should be 'User added' - self.assertEqual(msg, 'User added') - - # only one admin - users = project.get_project_users(access='admin', combine=False) - - self.assertEqual(len(users), 1) - self.assertEqual(users[0].username, 'foo') - - # No user with only commit access - users = project.get_project_users(access='commit', combine=False) - self.assertEqual(len(users), 0) - - # No user with only ticket access - users = project.get_project_users(access='ticket', combine=False) - self.assertEqual(len(users), 0) - - # Update the access level of foo user to commit - msg = pagure.lib.add_user_to_project( - self.session, - project=project, - new_user='foo', - user='pingou', - access='commit' - ) - self.session.commit() - self.assertEqual(msg, 'User access updated') - - # He is just a committer - project = pagure.get_authorized_project(self.session, project_name='test') - users = project.get_project_users(access='admin', combine=False) - - self.assertEqual(len(users), 0) - - # He is just a committer - users = project.get_project_users(access='commit', combine=False) - self.assertEqual(len(users), 1) - self.assertEqual(users[0].username, 'foo') - - # He is just a committer - users = project.get_project_users(access='ticket', combine=False) - self.assertEqual(len(users), 0) - - # Update the access level of foo user to ticket - msg = pagure.lib.add_user_to_project( - self.session, - project=project, - new_user='foo', - user='pingou', - access='ticket' - ) - self.session.commit() - self.assertEqual(msg, 'User access updated') - - # He is just a ticketer - project = pagure.get_authorized_project(self.session, project_name='test') - users = project.get_project_users(access='admin',combine=False) - - self.assertEqual(len(users), 0) - - # He is just a ticketer - users = project.get_project_users(access='commit', combine=False) - self.assertEqual(len(users), 0) - - # He is just a ticketer - users = project.get_project_users(access='ticket', combine=False) - self.assertEqual(len(users), 1) - self.assertEqual(users[0].username, 'foo') - def test_get_project_groups(self): ''' Test the get_project_groups method when combine is True ''' @@ -4252,43 +4056,6 @@ foo bar email='foo@pingou.com' ) - def test_get_acls(self): - """ Test the get_acls function of pagure.lib. """ - acls = pagure.lib.get_acls(self.session) - self.assertEqual( - [a.name for a in acls], - [ - 'create_project', - 'fork_project', - 'issue_assign', - 'issue_change_status', - 'issue_comment', - 'issue_create', - 'issue_subscribe', - 'issue_update', - 'issue_update_custom_fields', - 'issue_update_milestone', - 'modify_project', - 'pull_request_close', - 'pull_request_comment', - 'pull_request_flag', - 'pull_request_merge' - ] - ) - - def test_get_acls_restrict_one(self): - """ Test the get_acls function of pagure.lib. """ - acls = pagure.lib.get_acls(self.session, restrict='create_project') - self.assertEqual([a.name for a in acls], ['create_project']) - - def test_get_acls_restrict_two(self): - """ Test the get_acls function of pagure.lib. """ - acls = pagure.lib.get_acls( - self.session, restrict=['create_project', 'issue_create']) - self.assertEqual( - [a.name for a in acls], - ['create_project', 'issue_create']) - def test_filter_img_src(self): """ Test the filter_img_src function of pagure.lib. """ for name in ('alt', 'height', 'width', 'class'): @@ -4572,73 +4339,6 @@ foo bar user_obj=None, ) - def test_search_token_no_acls(self): - """ Test the search_token function of pagure.lib. """ - tests.create_projects(self.session) - tests.create_tokens(self.session) - tests.create_tokens_acl(self.session) - - out = pagure.lib.search_token( - self.session, - [] - ) - self.assertEqual(len(out), 1) - self.assertEqual(out[0].id, 'aaabbbcccddd') - - def test_search_token_single_acls(self): - """ Test the search_token function of pagure.lib. """ - tests.create_projects(self.session) - tests.create_tokens(self.session) - tests.create_tokens_acl(self.session) - - out = pagure.lib.search_token( - self.session, - 'issue_create', - ) - self.assertEqual(len(out), 1) - self.assertEqual(out[0].id, 'aaabbbcccddd') - - def test_search_token_single_acls_user(self): - """ Test the search_token function of pagure.lib. """ - tests.create_projects(self.session) - tests.create_tokens(self.session) - tests.create_tokens_acl(self.session) - - out = pagure.lib.search_token( - self.session, - 'issue_create', - user='pingou', - ) - self.assertEqual(len(out), 1) - self.assertEqual(out[0].id, 'aaabbbcccddd') - - out = pagure.lib.search_token( - self.session, - 'issue_create', - user='foo', - ) - self.assertEqual(len(out), 0) - - def test_search_token_single_acls_active(self): - """ Test the search_token function of pagure.lib. """ - tests.create_projects(self.session) - tests.create_tokens(self.session) - tests.create_tokens_acl(self.session) - - out = pagure.lib.search_token( - self.session, - 'issue_create', - active=True - ) - self.assertEqual(len(out), 1) - self.assertEqual(out[0].id, 'aaabbbcccddd') - - out = pagure.lib.search_token( - self.session, - 'issue_create', - expired=True - ) - self.assertEqual(len(out), 0) if __name__ == '__main__': unittest.main(verbosity=2) diff --git a/tests/test_pagure_lib_add_user_to_project.py b/tests/test_pagure_lib_add_user_to_project.py deleted file mode 100644 index dedae96..0000000 --- a/tests/test_pagure_lib_add_user_to_project.py +++ /dev/null @@ -1,333 +0,0 @@ -# -*- coding: utf-8 -*- - -""" - (c) 2017 - Copyright Red Hat Inc - - Authors: - Pierre-Yves Chibon - -""" - -import unittest -import sys -import os - -from mock import patch, MagicMock - -sys.path.insert(0, os.path.join(os.path.dirname( - os.path.abspath(__file__)), '..')) - -import pagure.lib -import tests - - -class PagureLibAddUserToProjecttests(tests.Modeltests): - """ Tests for pagure.lib.add_user_to_project """ - - def setUp(self): - """ Set up the environnment, ran before every tests. """ - super(PagureLibAddUserToProjecttests, self).setUp() - - tests.create_projects(self.session) - - item = pagure.lib.model.User( - user='bar', - fullname='bar baz', - password='foo', - default_email='bar@bar.com', - ) - self.session.add(item) - item = pagure.lib.model.UserEmail( - user_id=3, - email='bar@bar.com') - self.session.add(item) - - self.session.commit() - - # Before - repo = pagure.lib._get_project(self.session, 'test') - self.assertEqual(len(repo.users), 0) - - msg = pagure.lib.add_user_to_project( - session=self.session, - project=repo, - new_user='foo', - user='pingou', - ) - self.session.commit() - self.assertEqual(msg, 'User added') - - # After - repo = pagure.lib._get_project(self.session, 'test') - self.assertEqual(len(repo.users), 1) - self.assertEqual(repo.users[0].user, 'foo') - self.assertEqual(repo.admins[0].user, 'foo') - - @patch('pagure.lib.notify.send_email', MagicMock(return_value=True)) - def test_re_add_user_to_project_default(self): - """ Update an existing user but to the same access level. """ - repo = pagure.lib._get_project(self.session, 'test') - - # Try adding the same user with the same access - self.assertRaises( - pagure.exceptions.PagureException, - pagure.lib.add_user_to_project, - session=self.session, - project=repo, - new_user='foo', - user='pingou', - access='admin' - ) - - @patch('pagure.lib.notify.send_email', MagicMock(return_value=True)) - def test_update_user_to_project_default(self): - """ Update an existing user without any required group membership. - """ - repo = pagure.lib._get_project(self.session, 'test') - - # Update the access of the user - msg = pagure.lib.add_user_to_project( - session=self.session, - project=repo, - new_user='foo', - user='pingou', - access='commit' - ) - self.session.commit() - self.assertEqual(msg, 'User access updated') - self.assertEqual(len(repo.users), 1) - self.assertEqual(repo.users[0].user, 'foo') - self.assertEqual(repo.committers[0].user, 'foo') - - @patch('pagure.lib.notify.send_email', MagicMock(return_value=True)) - def test_update_user_to_project_require_packager_on_all(self): - """ - Update an existing user but required group membership on all - projects. - """ - repo = pagure.lib._get_project(self.session, 'test') - config = { - '*': ['packager'] - } - - # Update the access of the user - self.assertRaises( - pagure.exceptions.PagureException, - pagure.lib.add_user_to_project, - session=self.session, - project=repo, - new_user='foo', - user='pingou', - access='admin', - required_groups=config - ) - self.session.commit() - self.assertEqual(len(repo.users), 1) - self.assertEqual(repo.users[0].user, 'foo') - self.assertEqual(repo.committers[0].user, 'foo') - - @patch('pagure.lib.notify.send_email', MagicMock(return_value=True)) - def test_update_user_to_project_require_packager_on_st(self): - """ - Update an existing user but required group membership on all - projects match *st. - """ - repo = pagure.lib._get_project(self.session, 'test') - config = { - '*st': ['packager'] - } - - # Update the access of the user - self.assertRaises( - pagure.exceptions.PagureException, - pagure.lib.add_user_to_project, - session=self.session, - project=repo, - new_user='foo', - user='pingou', - access='admin', - required_groups=config - ) - self.session.commit() - self.assertEqual(len(repo.users), 1) - self.assertEqual(repo.users[0].user, 'foo') - self.assertEqual(repo.committers[0].user, 'foo') - - @patch('pagure.lib.notify.send_email', MagicMock(return_value=True)) - def test_update_user_to_project_require_packager_on_te(self): - """ - Update an existing user but required group membership on all - projects match te*. - """ - repo = pagure.lib._get_project(self.session, 'test') - config = { - 'te*': ['packager'] - } - - # Update the access of the user - self.assertRaises( - pagure.exceptions.PagureException, - pagure.lib.add_user_to_project, - session=self.session, - project=repo, - new_user='foo', - user='pingou', - access='admin', - required_groups=config - ) - self.session.commit() - self.assertEqual(len(repo.users), 1) - self.assertEqual(repo.users[0].user, 'foo') - self.assertEqual(repo.committers[0].user, 'foo') - - @patch('pagure.lib.notify.send_email', MagicMock(return_value=True)) - def test_update_user_to_project_require_packager_on_test(self): - """ - Update an existing user but required group membership on a specific - project: test. - """ - repo = pagure.lib._get_project(self.session, 'test') - config = { - 'test': ['packager'] - } - - # Update the access of the user - self.assertRaises( - pagure.exceptions.PagureException, - pagure.lib.add_user_to_project, - session=self.session, - project=repo, - new_user='foo', - user='pingou', - access='admin', - required_groups=config - ) - self.session.commit() - self.assertEqual(len(repo.users), 1) - self.assertEqual(repo.users[0].user, 'foo') - self.assertEqual(repo.committers[0].user, 'foo') - - @patch('pagure.lib.notify.send_email', MagicMock(return_value=True)) - def test_add_user_to_test2_require_packager_on_test(self): - """ - Add user to project test2 while the configuration requires group - membership on the project test. - """ - repo = pagure.lib._get_project(self.session, 'test2') - self.assertEqual(len(repo.users), 0) - - config = { - 'test': ['packager'] - } - - # Add the user - pagure.lib.add_user_to_project( - session=self.session, - project=repo, - new_user='foo', - user='pingou', - access='admin', - required_groups=config - ) - self.session.commit() - self.assertEqual(len(repo.users), 1) - self.assertEqual(repo.users[0].user, 'foo') - self.assertEqual(repo.committers[0].user, 'foo') - -class PagureLibAddUserToProjectWithGrouptests( - PagureLibAddUserToProjecttests): - """ Tests for pagure.lib.add_user_to_project """ - - def setUp(self): - """ Set up the environnment, ran before every tests. """ - super(PagureLibAddUserToProjectWithGrouptests, self).setUp() - - # Create group - msg = pagure.lib.add_group( - self.session, - group_name='packager', - display_name='packager', - description='The Fedora packager groups', - group_type='user', - user='pingou', - is_admin=False, - blacklist=[]) - self.session.commit() - self.assertEqual(msg, 'User `pingou` added to the group `packager`.') - - # Add user to group - group = pagure.lib.search_groups(self.session, group_name='packager') - msg = pagure.lib.add_user_to_group( - self.session, - username='bar', - group=group, - user='pingou', - is_admin=True) - self.session.commit() - self.assertEqual(msg, 'User `bar` added to the group `packager`.') - - @patch('pagure.lib.notify.send_email', MagicMock(return_value=True)) - def test_add_user_to_test_require_packager_on_test(self): - """ - Add user to project test while the configuration requires group - membership on the project test. - """ - repo = pagure.lib._get_project(self.session, 'test') - self.assertEqual(len(repo.users), 1) - - config = { - 'test': ['packager'] - } - - # Add the user to the project - pagure.lib.add_user_to_project( - session=self.session, - project=repo, - new_user='bar', - user='pingou', - access='commit', - required_groups=config - ) - self.session.commit() - - repo = pagure.lib._get_project(self.session, 'test') - self.assertEqual(len(repo.users), 2) - self.assertEqual(repo.users[0].user, 'foo') - self.assertEqual(repo.committers[0].user, 'foo') - self.assertEqual(repo.users[1].user, 'bar') - self.assertEqual(repo.committers[1].user, 'bar') - - @patch('pagure.lib.notify.send_email', MagicMock(return_value=True)) - def test_add_user_to_test_require_packager(self): - """ - Add user to project test while the configuration requires group - membership on all the projects. - """ - repo = pagure.lib._get_project(self.session, 'test') - self.assertEqual(len(repo.users), 1) - - config = { - '*': ['packager'] - } - - # Add the user to the project - pagure.lib.add_user_to_project( - session=self.session, - project=repo, - new_user='bar', - user='pingou', - access='commit', - required_groups=config - ) - self.session.commit() - - repo = pagure.lib._get_project(self.session, 'test') - self.assertEqual(len(repo.users), 2) - self.assertEqual(repo.users[0].user, 'foo') - self.assertEqual(repo.committers[0].user, 'foo') - self.assertEqual(repo.users[1].user, 'bar') - self.assertEqual(repo.committers[1].user, 'bar') - - -if __name__ == '__main__': - unittest.main(verbosity=2) diff --git a/tests/test_pagure_lib_drop_issue.py b/tests/test_pagure_lib_drop_issue.py deleted file mode 100644 index abc9965..0000000 --- a/tests/test_pagure_lib_drop_issue.py +++ /dev/null @@ -1,215 +0,0 @@ -# -*- coding: utf-8 -*- - -""" - (c) 2017 - Copyright Red Hat Inc - - Authors: - Pierre-Yves Chibon - -""" - -__requires__ = ['SQLAlchemy >= 0.8'] -import pkg_resources - -import unittest -import shutil -import sys -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 -import pagure.lib.model -import tests - - -class PagureLibDropIssuetests(tests.Modeltests): - """ Tests for pagure.lib.drop_issue """ - - @patch('pagure.lib.git.update_git') - @patch('pagure.lib.notify.send_email') - def setUp(self, p_send_email, p_ugt): - """ Create a couple of tickets and add tag to the project so we can - play with them later. - """ - super(PagureLibDropIssuetests, self).setUp() - - p_send_email.return_value = True - p_ugt.return_value = True - - - tests.create_projects(self.session) - repo = pagure.get_authorized_project(self.session, 'test') - - # Before - issues = pagure.lib.search_issues(self.session, repo) - self.assertEqual(len(issues), 0) - self.assertEqual(repo.open_tickets, 0) - self.assertEqual(repo.open_tickets_public, 0) - - # Create two issues to play with - msg = pagure.lib.new_issue( - session=self.session, - repo=repo, - title='Test issue', - content='We should work on this', - user='pingou', - ticketfolder=None - ) - self.session.commit() - self.assertEqual(msg.title, 'Test issue') - self.assertEqual(repo.open_tickets, 1) - self.assertEqual(repo.open_tickets_public, 1) - - msg = pagure.lib.new_issue( - session=self.session, - repo=repo, - title='Test issue #2', - content='We should work on this for the second time', - user='foo', - status='Open', - ticketfolder=None - ) - self.session.commit() - self.assertEqual(msg.title, 'Test issue #2') - self.assertEqual(repo.open_tickets, 2) - self.assertEqual(repo.open_tickets_public, 2) - - # After - issues = pagure.lib.search_issues(self.session, repo) - self.assertEqual(len(issues), 2) - - # Add tag to the project - pagure.lib.new_tag( - self.session, - 'red', - 'red tag', - '#ff0000', - repo.id - ) - self.session.commit() - - repo = pagure.get_authorized_project(self.session, 'test') - self.assertEqual( - str(repo.tags_colored), - '[TagColored(id: 1, tag:red, tag_description:red tag, color:#ff0000)]' - ) - - @patch('pagure.lib.git.update_git') - @patch('pagure.lib.notify.send_email') - def test_drop_issue(self, p_send_email, p_ugt): - """ Test the drop_issue of pagure.lib. - - We had an issue where we could not delete issue that had been tagged - with this test, we create two issues, tag one of them and delete - it, ensuring it all goes well. - """ - p_send_email.return_value = True - p_ugt.return_value = True - - repo = pagure.get_authorized_project(self.session, 'test') - - # Add tag to the second issue - issue = pagure.lib.search_issues(self.session, repo, issueid=2) - msgs = pagure.lib.update_tags( - self.session, - issue, - tags=['red'], - username='pingou', - ticketfolder=None, - ) - self.session.commit() - - self.assertEqual(msgs, ['Issue tagged with: red']) - - repo = pagure.get_authorized_project(self.session, 'test') - self.assertEqual(len(repo.issues), 2) - issue = pagure.lib.search_issues(self.session, repo, issueid=2) - self.assertEqual( - str(issue.tags), - '[TagColored(id: 1, tag:red, tag_description:red tag, color:#ff0000)]' - ) - - # Drop the issue #2 - issue = pagure.lib.search_issues(self.session, repo, issueid=2) - pagure.lib.drop_issue( - self.session, issue, user='pingou', ticketfolder=None) - self.session.commit() - - repo = pagure.get_authorized_project(self.session, 'test') - self.assertEqual(len(repo.issues), 1) - - @patch('pagure.lib.git.update_git') - @patch('pagure.lib.notify.send_email') - def test_drop_issue_two_issues_one_tag(self, p_send_email, p_ugt): - """ Test the drop_issue of pagure.lib. - - We had an issue where we could not delete issue that had been tagged - with this test, we create two issues, tag them both and delete one - then we check that the other issue is still tagged. - """ - p_send_email.return_value = True - p_ugt.return_value = True - - repo = pagure.get_authorized_project(self.session, 'test') - - # Add the tag to both issues - issue = pagure.lib.search_issues(self.session, repo, issueid=1) - msgs = pagure.lib.update_tags( - self.session, - issue, - tags=['red'], - username='pingou', - ticketfolder=None, - ) - self.session.commit() - self.assertEqual(msgs, ['Issue tagged with: red']) - - issue = pagure.lib.search_issues(self.session, repo, issueid=2) - msgs = pagure.lib.update_tags( - self.session, - issue, - tags=['red'], - username='pingou', - ticketfolder=None, - ) - self.session.commit() - self.assertEqual(msgs, ['Issue tagged with: red']) - - repo = pagure.get_authorized_project(self.session, 'test') - self.assertEqual(len(repo.issues), 2) - issue = pagure.lib.search_issues(self.session, repo, issueid=1) - self.assertEqual( - str(issue.tags), - '[TagColored(id: 1, tag:red, tag_description:red tag, color:#ff0000)]' - ) - issue = pagure.lib.search_issues(self.session, repo, issueid=2) - self.assertEqual( - str(issue.tags), - '[TagColored(id: 1, tag:red, tag_description:red tag, color:#ff0000)]' - ) - - # Drop the issue #2 - issue = pagure.lib.search_issues(self.session, repo, issueid=2) - pagure.lib.drop_issue( - self.session, issue, user='pingou', ticketfolder=None) - self.session.commit() - - repo = pagure.get_authorized_project(self.session, 'test') - self.assertEqual(len(repo.issues), 1) - - issue = pagure.lib.search_issues(self.session, repo, issueid=1) - self.assertEqual( - str(issue.tags), - '[TagColored(id: 1, tag:red, tag_description:red tag, color:#ff0000)]' - ) - issue = pagure.lib.search_issues(self.session, repo, issueid=2) - self.assertIsNone(issue) - - -if __name__ == '__main__': - unittest.main(verbosity=2) diff --git a/tests/test_pagure_lib_encoding_utils.py b/tests/test_pagure_lib_encoding_utils.py deleted file mode 100644 index 67fdb68..0000000 --- a/tests/test_pagure_lib_encoding_utils.py +++ /dev/null @@ -1,71 +0,0 @@ -# -*- coding: utf-8 -*- -""" -Tests for :module:`pagure.lib.encoding_utils`. -""" - -import chardet -import os -import unittest -import sys - -sys.path.insert(0, os.path.join(os.path.dirname( - os.path.abspath(__file__)), '..')) - -from pagure.lib import encoding_utils - - -class TestGuessEncoding(unittest.TestCase): - - def test_guess_encoding_ascii(self): - """ - Assert when ascii-only data is provided ascii is the guessed encoding. - """ - data = u'Twas bryllyg, and the slythy toves did gyre and gymble' - result = encoding_utils.guess_encoding(data.encode('ascii')) - self.assertEqual(result, 'ascii') - - def test_guess_encoding_favor_utf_8(self): - """ - Test that strings that could be UTF-8 or ISO-8859-2 result in UTF-8. - """ - data = u'Šabata'.encode('utf-8') - result = encoding_utils.guess_encoding(data) - chardet_result = chardet.detect(data) - self.assertEqual(result, 'utf-8') - self.assertEqual(chardet_result['encoding'], 'ISO-8859-2') - - def test_guess_encoding_no_data(self): - """ Test encoding_utils.guess_encoding() with an empty string """ - result = encoding_utils.guess_encoding(u''.encode('utf-8')) - self.assertEqual(result, 'ascii') - - -class TestGuessEncodings(unittest.TestCase): - - def test_guess_encodings(self): - """ Test the encoding_utils.guess_encodings() method. """ - data = u'Šabata'.encode('utf-8') - result = encoding_utils.guess_encodings(data) - chardet_result = chardet.detect(data) - self.assertEqual( - [encoding.encoding for encoding in result], - ['utf-8', 'ISO-8859-2', 'windows-1252']) - self.assertEqual(chardet_result['encoding'], 'ISO-8859-2') - - def test_guess_encodings_no_data(self): - """ Test encoding_utils.guess_encodings() with an emtpy string """ - result = encoding_utils.guess_encodings(u''.encode('utf-8')) - self.assertEqual( - [encoding.encoding for encoding in result], - ['ascii']) - -class TestDecode(unittest.TestCase): - - def test_decode(self): - """ Test encoding_utils.decode() """ - data = u'Šabata' - self.assertEqual(data, encoding_utils.decode(data.encode('utf-8'))) - - -if __name__ == '__main__': - unittest.main(verbosity=2) diff --git a/tests/test_pagure_lib_link.py b/tests/test_pagure_lib_link.py deleted file mode 100644 index 3cb0d37..0000000 --- a/tests/test_pagure_lib_link.py +++ /dev/null @@ -1,288 +0,0 @@ -# -*- coding: utf-8 -*- - -""" - (c) 2015 - Copyright Red Hat Inc - - Authors: - Pierre-Yves Chibon - -""" - -__requires__ = ['SQLAlchemy >= 0.8'] -import pkg_resources - -import json -import unittest -import shutil -import sys -import os - -import pygit2 -from mock import patch - -sys.path.insert(0, os.path.join(os.path.dirname( - os.path.abspath(__file__)), '..')) - -import pagure -import pagure.lib.link -import tests - -COMMENTS = [ - 'Did you see #1?', - 'This is a duplicate of #2', - 'This is a fixes #3', - 'Might be worth looking at https://fedorahosted.org/pagure/tests2/issue/4', - 'This relates to #5', - 'Could this be related to https://fedorahosted.org/pagure/tests2/issue/6', -] - - -class PagureLibLinktests(tests.Modeltests): - """ Tests for pagure.lib.link """ - - def test_get_relation_relates(self): - """ Test the get_relation function of pagure.lib.link with relates. - """ - - link = pagure.lib.link.get_relation( - self.session, - reponame='test', - namespace=None, - username=None, - text=COMMENTS[0], - reftype='relates', - ) - self.assertEqual(link, []) - - tests.create_projects(self.session) - - link = pagure.lib.link.get_relation( - self.session, - reponame='test', - namespace=None, - username=None, - text=COMMENTS[4], - reftype='relates', - ) - self.assertEqual(link, []) - - # Create the issue - repo = pagure.get_authorized_project(self.session, 'test') - pagure.lib.new_issue( - self.session, - repo, - title='foo', - content='bar', - user='pingou', - ticketfolder=None, - issue_id=5, - notify=False) - self.session.commit() - - for idx, comment in enumerate(COMMENTS): - link = pagure.lib.link.get_relation( - self.session, - reponame='test', - namespace=None, - username=None, - text=comment, - reftype='relates') - if idx == 4: - self.assertEqual( - str(link), - '[Issue(5, project:test, user:pingou, title:foo)]') - else: - self.assertEqual(link, []) - - link = pagure.lib.link.get_relation( - self.session, - reponame='test', - namespace=None, - username=None, - text=COMMENTS[5], - reftype='relates', - ) - self.assertEqual(link, []) - - # Create the issue - repo = pagure.get_authorized_project(self.session, 'test') - pagure.lib.new_issue( - self.session, - repo, - title='another foo', - content='another bar', - user='pingou', - ticketfolder=None, - issue_id=6, - notify=False) - self.session.commit() - - for idx, comment in enumerate(COMMENTS): - link = pagure.lib.link.get_relation( - self.session, - reponame='test', - namespace=None, - username=None, - text=comment, - reftype='relates') - if idx == 4: - self.assertEqual( - str(link), - '[Issue(5, project:test, user:pingou, title:foo)]') - elif idx == 5: - self.assertEqual( - str(link), - '[Issue(6, project:test, user:pingou, title:another foo)]') - else: - self.assertEqual(link, []) - - def test_get_relation_fixes(self): - """ Test the get_relation function of pagure.lib.link with fixes. - """ - - link = pagure.lib.link.get_relation( - self.session, - reponame='test', - namespace=None, - username=None, - text=COMMENTS[0], - reftype='fixes', - ) - self.assertEqual(link, []) - - tests.create_projects(self.session) - - link = pagure.lib.link.get_relation( - self.session, - reponame='test', - namespace=None, - username=None, - text=COMMENTS[2], - reftype='fixes', - ) - self.assertEqual(link, []) - - # Create the issue - repo = pagure.get_authorized_project(self.session, 'test') - pagure.lib.new_issue( - self.session, - repo, - title='issue 3', - content='content issue 3', - user='pingou', - ticketfolder=None, - issue_id=3, - notify=False) - self.session.commit() - - for idx, comment in enumerate(COMMENTS): - link = pagure.lib.link.get_relation( - self.session, - reponame='test', - namespace=None, - username=None, - text=comment, - reftype='fixes') - if idx == 2: - self.assertEqual( - str(link), - '[Issue(3, project:test, user:pingou, title:issue 3)]') - else: - self.assertEqual(link, []) - - def test_relates_regex(self): - ''' Test the relates regex present in pagure.lib.link. ''' - text = 'relates to http://localhost/fork/pingou/test/issue/1' - for index, regex in enumerate(pagure.lib.link.RELATES): - if index == 2: - self.assertNotEqual(regex.match(text), None) - else: - self.assertEqual(regex.match(text), None) - - text = 'relates http://209.132.184.222/fork/pingou/test/issue/1' - for index, regex in enumerate(pagure.lib.link.RELATES): - if index == 2: - self.assertNotEqual(regex.match(text), None) - else: - self.assertEqual(regex.match(text), None) - - text = 'This relates to #5' - for index, regex in enumerate(pagure.lib.link.RELATES): - if index == 0: - self.assertNotEqual(regex.match(text), None) - else: - self.assertEqual(regex.match(text), None) - - text = 'Could this be related to '\ - ' https://fedorahosted.org/pagure/tests2/issue/6' - for index, regex in enumerate(pagure.lib.link.RELATES): - if index == 2: - self.assertNotEqual(regex.match(text), None) - else: - self.assertEqual(regex.match(text), None) - - def test_fixes_regex(self): - ''' Test the fixes regex present in pagure.lib.link. ''' - - # project/issue matches - def project_match(text, groups): - match = None - for regex in pagure.lib.link.FIXES: - match = regex.match(text) - if match: - break - self.assertNotEqual(match, None) - self.assertEqual(len(match.groups()), 2) - self.assertEqual(match.groups(), groups) - - data = [ - # [string, groups] - ] - - project_match('fixes http://localhost/fork/pingou/test/issue/1', - ('test', '1')) - project_match('fix http://209.132.184.222/fork/pingou/test/issue/1', - ('test', '1')) - project_match('Could this be fixes ' - ' https://fedorahosted.org/pagure/tests2/issue/6', - ('tests2', '6')) - project_match('merged https://pagure.io/myproject/pull-request/70', - ('myproject', '70')) - project_match('Now we merge https://pagure.io/myproject/pull-request/99', - ('myproject', '99')) - - # issue matches - def issue_match(text, issue): - match = None - for regex in pagure.lib.link.FIXES: - match = regex.match(text) - if match: - break - self.assertNotEqual(match, None) - self.assertEqual(len(match.groups()), 1) - self.assertEqual(match.group(1), issue) - - issue_match('This fixed #5', '5') - issue_match('Merged #17', '17') - issue_match('Fixed: #23', '23') - issue_match('This commit fixes: #42', '42') - issue_match('Merge #137', '137') - - # no match - def no_match(text): - match = None - for regex in pagure.lib.link.FIXES: - match = regex.match(text) - if match: - break - self.assertEqual(match, None) - - no_match('nowhitespacemerge: #47') - no_match('This commit unmerges #45') - no_match('Fixed 45 typos') - no_match('Fixed 4 typos') - no_match("Merge branch 'work'") - - -if __name__ == '__main__': - unittest.main(verbosity=2) diff --git a/tests/test_pagure_lib_login.py b/tests/test_pagure_lib_login.py deleted file mode 100644 index 3517415..0000000 --- a/tests/test_pagure_lib_login.py +++ /dev/null @@ -1,106 +0,0 @@ -# -*- coding: utf-8 -*- - -""" - (c) 2016 - Copyright Red Hat Inc - - Authors: - Pierre-Yves Chibon - Farhaan Bukhsh - -""" - -__requires__ = ['SQLAlchemy >= 0.8'] -import pkg_resources - -import unittest -import shutil -import sys -import os - -from mock import patch - -sys.path.insert(0, os.path.join(os.path.dirname( - os.path.abspath(__file__)), '..')) - -import pagure.lib -from pagure.exceptions import PagureException -import pagure.lib.login -import hashlib -from pagure import APP -import tests - - -class PagureLibLogintests(tests.Modeltests): - """ Tests for pagure.lib.login """ - - def test_id_generator(self): - ''' Test pagure.lib.login.id_generator. ''' - self.assertEqual( - pagure.lib.login.id_generator(size=3, chars=['a']), - 'aaa' - ) - - def test_get_session_by_visitkey(self): - ''' Test pagure.lib.login.get_session_by_visitkey. ''' - - session = pagure.lib.login.get_session_by_visitkey(self.session, 'foo') - self.assertEqual(session, None) - - def test_generate_hashed_value(self): - ''' Test pagure.lib.login.generate_hashed_value. ''' - password = pagure.lib.login.generate_hashed_value('foo') - self.assertTrue(password.startswith('$2$')) - self.assertEqual(len(password), 63) - - def test_check_password(self): - ''' Test pagure.lib.login.check_password. ''' - - # Version 2 - password = pagure.lib.login.generate_hashed_value('foo') - self.assertTrue( - pagure.lib.login.check_password('foo', password)) - self.assertFalse( - pagure.lib.login.check_password('bar', password)) - - # Version 1 - password = '%s%s' % ('foo', APP.config.get('PASSWORD_SEED', None)) - password = '$1$' + hashlib.sha512(password).hexdigest() - self.assertTrue(pagure.lib.login.check_password('foo', password)) - self.assertFalse(pagure.lib.login.check_password('bar', password)) - - # Invalid password - No version - password = '%s%s' % ('foo', APP.config.get('PASSWORD_SEED', None)) - password = hashlib.sha512(password).hexdigest() - self.assertRaises( - PagureException, - pagure.lib.login.check_password, - 'foo', password - ) - - # Invalid password - Invalid version - password = '$3$' + password - self.assertRaises( - PagureException, - pagure.lib.login.check_password, - 'foo', - password - ) - password = '%s%s' % ('foo', APP.config.get('PASSWORD_SEED', None)) - password = hashlib.sha512(password).hexdigest() - self.assertRaises( - PagureException, - pagure.lib.login.check_password, - 'foo', password - ) - - # Invalid password - Invalid version - password = '$3$' + password - self.assertRaises( - PagureException, - pagure.lib.login.check_password, - 'foo', - password - ) - -if __name__ == '__main__': - unittest.main(verbosity=2) diff --git a/tests/test_pagure_lib_model.py b/tests/test_pagure_lib_model.py deleted file mode 100644 index dbe228e..0000000 --- a/tests/test_pagure_lib_model.py +++ /dev/null @@ -1,250 +0,0 @@ -# -*- coding: utf-8 -*- - -""" - (c) 2015-2017 - Copyright Red Hat Inc - - Authors: - Pierre-Yves Chibon - -""" - -__requires__ = ['SQLAlchemy >= 0.8'] -import pkg_resources - -import unittest -import sys -import os - -from mock import patch - -sys.path.insert(0, os.path.join(os.path.dirname( - os.path.abspath(__file__)), '..')) - -import pagure -import pagure.lib -import tests - - -class PagureLibModeltests(tests.Modeltests): - """ Tests for pagure.lib.model """ - - def test_user__repr__(self): - """ Test the User.__repr__ function of pagure.lib.model. """ - item = pagure.lib.search_user(self.session, email='foo@bar.com') - self.assertEqual(str(item), 'User: 2 - name foo') - self.assertEqual('foo', item.user) - self.assertEqual('foo', item.username) - self.assertEqual([], item.groups) - - @patch('pagure.lib.git.update_git') - @patch('pagure.lib.notify.send_email') - def test_issue__repr__(self, p_send_email, p_ugt): - """ Test the Issue.__repr__ function of pagure.lib.model. """ - p_send_email.return_value = True - p_ugt.return_value = True - - tests.create_projects(self.session) - repo = pagure.get_authorized_project(self.session, 'test') - - # Create an issue - msg = pagure.lib.new_issue( - session=self.session, - repo=repo, - title='Test issue', - content='We should work on this', - user='pingou', - ticketfolder=None - ) - self.assertEqual(msg.title, 'Test issue') - - issues = pagure.lib.search_issues(self.session, repo) - self.assertEqual(len(issues), 1) - self.assertEqual( - str(issues[0]), - 'Issue(1, project:test, user:pingou, title:Test issue)') - - @patch('pagure.lib.git.update_git') - @patch('pagure.lib.notify.send_email') - def test_pullrequest__repr__(self, p_send_email, p_ugt): - """ Test the PullRequest.__repr__ function of pagure.lib.model. """ - p_send_email.return_value = True - p_ugt.return_value = True - - tests.create_projects(self.session) - # Create a forked repo - item = pagure.lib.model.Project( - user_id=1, # pingou - name='test', - description='test project #1', - is_fork=True, - parent_id=1, - hook_token='aaabbbyyy', - ) - self.session.commit() - self.session.add(item) - - repo = pagure.get_authorized_project(self.session, 'test') - forked_repo = pagure.get_authorized_project( - self.session, 'test', user='pingou') - - # Create an pull-request - req = pagure.lib.new_pull_request( - session=self.session, - repo_from=forked_repo, - branch_from='master', - repo_to=repo, - branch_to='master', - title='test pull-request', - user='pingou', - requestfolder=None, - ) - self.assertEqual(req.id, 1) - self.assertEqual(req.title, 'test pull-request') - - self.assertEqual( - str(req), - 'PullRequest(1, project:test, user:pingou, ' - 'title:test pull-request)') - - request = pagure.lib.search_pull_requests(self.session, requestid=1) - self.assertEqual( - str(request), - 'PullRequest(1, project:test, user:pingou, ' - 'title:test pull-request)') - - def test_paguregroup__repr__(self): - """ Test the PagureGroup.__repr__ function of pagure.lib.model. """ - item = pagure.lib.model.PagureGroup( - group_name='admin', - display_name='admin group', - description='the local admin group', - user_id=1, - ) - self.session.add(item) - self.session.commit() - - self.assertEqual(str(item), 'Group: 1 - name admin') - - def test_tagissue__repr__(self): - """ Test the TagIssue.__repr__ function of pagure.lib.model. """ - self.test_issue__repr__() - repo = pagure.get_authorized_project(self.session, 'test') - issues = pagure.lib.search_issues(self.session, repo) - self.assertEqual(len(issues), 1) - - item = pagure.lib.model.Tag(tag='foo') - self.session.add(item) - self.session.commit() - - item = pagure.lib.model.TagIssue( - issue_uid=issues[0].uid, - tag='foo' - ) - self.session.add(item) - self.session.commit() - self.assertEqual(str(item), 'TagIssue(issue:1, tag:foo)') - - def test_tagissuecolor__repr__(self): - """ Test the TagIssue.__repr__ function of pagure.lib.model. """ - self.test_issue__repr__() - repo = pagure.get_authorized_project(self.session, 'test') - issues = pagure.lib.search_issues(self.session, repo) - self.assertEqual(len(issues), 1) - - item = pagure.lib.model.TagColored( - tag='foo', - tag_description='bar', - tag_color='DeepSkyBlue', - project_id=repo.id) - self.session.add(item) - self.session.commit() - - item = pagure.lib.model.TagIssueColored( - issue_uid=issues[0].uid, - tag_id=item.id - ) - self.session.add(item) - self.session.commit() - self.assertEqual( - str(item), - 'TagIssueColored(issue:1, tag:foo, project:test)' - ) - - def test_group_project_ordering(self): - """ Test the ordering of project.groups. """ - # Create three projects - item = pagure.lib.model.Project( - user_id=1, # pingou - name='aaa', - description='Project aaa', - hook_token='aaabbbccc', - ) - item.close_status = ['Invalid', 'Fixed', 'Duplicate'] - self.session.add(item) - - item = pagure.lib.model.Project( - user_id=1, # pingou - name='KKK', - description='project KKK', - hook_token='aaabbbddd', - ) - item.close_status = ['Invalid', 'Fixed', 'Duplicate'] - self.session.add(item) - - item = pagure.lib.model.Project( - user_id=1, # pingou - name='zzz', - description='Namespaced project zzz', - hook_token='aaabbbeee', - namespace='somenamespace', - ) - item.close_status = ['Invalid', 'Fixed', 'Duplicate'] - self.session.add(item) - - # Create a group - group = pagure.lib.model.PagureGroup( - group_name='testgrp', - display_name='Test group', - description=None, - group_type='user', - user_id=1, # pingou - ) - item.close_status = ['Invalid', 'Fixed', 'Duplicate'] - self.session.add(group) - - self.session.commit() - - # Add projects to group - for ns, reponame in [ - (None, 'aaa'), (None, 'KKK'), ('somenamespace', 'zzz')]: - - repo = pagure.get_authorized_project( - self.session, reponame, namespace=ns) - msg = pagure.lib.add_group_to_project( - self.session, - project=repo, - new_group='testgrp', - user='pingou', - create=False, - is_admin=False - ) - self.session.commit() - self.assertEqual(msg, 'Group added') - - # Check the ordering - group = pagure.lib.search_groups(self.session, group_name='testgrp') - # Default PostgreSQL order - order = ['aaa', 'KKK', 'somenamespace/zzz'] - # Odd, SQLite order - if str(self.session.bind.engine.url).startswith('sqlite:'): - order = ['somenamespace/zzz', 'aaa', 'KKK'] - - self.assertEqual( - [p.fullname for p in group.projects], - order - ) - - - -if __name__ == '__main__': - unittest.main(verbosity=2) diff --git a/tests/test_pagure_lib_model_delete_project.py b/tests/test_pagure_lib_model_delete_project.py deleted file mode 100644 index 59ac8c5..0000000 --- a/tests/test_pagure_lib_model_delete_project.py +++ /dev/null @@ -1,349 +0,0 @@ -# -*- coding: utf-8 -*- - -""" - (c) 2017 - Copyright Red Hat Inc - - Authors: - Pierre-Yves Chibon - -""" - -__requires__ = ['SQLAlchemy >= 0.8'] -import pkg_resources - -import json -import unittest -import sys -import os -import uuid - - -sys.path.insert(0, os.path.join(os.path.dirname( - os.path.abspath(__file__)), '..')) - -import pagure.lib -import pagure.lib.model as model - -import tests - - -class DeleteProjectTests(tests.Modeltests): - """ Tests for flask issues controller of pagure """ - - def setUp(self): - """ Set up the environnment, run before every tests. """ - super(DeleteProjectTests, self).setUp() - - pagure.APP.config['TESTING'] = True - pagure.SESSION = self.session - - def test_delete_project_with_group(self): - """ Test the model when we delete a project with a group. """ - - # Create a project - item = model.Project( - user_id=1, # pingou - name='test', - description='test project #1', - hook_token='aaabbbiii', - ) - self.session.add(item) - self.session.commit() - - # Create a group - grp = model.PagureGroup( - group_name='testgrp', - display_name='Test group', - description=None, - group_type='user', - user_id=1, # pingou - ) - self.session.add(grp) - self.session.commit() - - # Add group to project - project_group = model.ProjectGroup( - project_id=1, - group_id=1, - access='admin', - ) - self.session.add(project_group) - self.session.commit() - - self.assertEqual( - self.session.query(model.Project).count(), 1) - self.assertEqual( - self.session.query(model.ProjectGroup).count(), 1) - - project = self.session.query( - model.Project - ).filter( - model.Project.id==1 - ).one() - self.session.delete(project) - self.session.commit() - - self.assertEqual( - self.session.query(model.Project).count(), 0) - self.assertEqual( - self.session.query(model.ProjectGroup).count(), 0) - - def test_delete_project_with_user(self): - """ Test the model when we delete a project with users. """ - - # Create a project - item = model.Project( - user_id=1, # pingou - name='test', - description='test project #1', - hook_token='aaabbbiii', - ) - self.session.add(item) - self.session.commit() - - # Add user #2 to project - project_user = model.ProjectUser( - project_id=1, - user_id=2, - access='admin', - ) - self.session.add(project_user) - self.session.commit() - - self.assertEqual( - self.session.query(model.Project).count(), 1) - self.assertEqual( - self.session.query(model.ProjectUser).count(), 1) - self.assertEqual( - self.session.query(model.User).count(), 2) - - project = self.session.query( - model.Project - ).filter( - model.Project.id==1 - ).one() - self.session.delete(project) - self.session.commit() - - self.assertEqual( - self.session.query(model.Project).count(), 0) - self.assertEqual( - self.session.query(model.ProjectUser).count(), 0) - self.assertEqual( - self.session.query(model.User).count(), 2) - - def test_delete_project_with_coloredtags(self): - """ Test the model when we delete a project with Colored tags. """ - - # Create a project - item = model.Project( - user_id=1, # pingou - name='test', - description='test project #1', - hook_token='aaabbbiii', - ) - self.session.add(item) - self.session.commit() - - # Create two ColoredTags - tagobj = model.TagColored( - tag='Tag#1', - project_id=1 - ) - self.session.add(tagobj) - self.session.flush() - - tagobj = model.TagColored( - tag='Tag#2', - project_id=1 - ) - self.session.add(tagobj) - self.session.flush() - - self.assertEqual( - self.session.query(model.Project).count(), 1) - self.assertEqual( - self.session.query(model.TagColored).count(), 2) - - project = self.session.query( - model.Project - ).filter( - model.Project.id==1 - ).one() - self.session.delete(project) - self.session.commit() - - self.assertEqual( - self.session.query(model.Project).count(), 0) - self.assertEqual( - self.session.query(model.TagColored).count(), 0) - - def test_delete_project_with_coloredtags_and_issues(self): - """ Test the model when we delete a project with Colored tags and - issues. """ - - # Create a project - item = model.Project( - user_id=1, # pingou - name='test', - description='test project #1', - hook_token='aaabbbiii', - ) - self.session.add(item) - self.session.commit() - - # Create two ColoredTags - tagobj = model.TagColored( - tag='Tag#1', - project_id=1 - ) - self.session.add(tagobj) - self.session.flush() - - tagobj = model.TagColored( - tag='Tag#2', - project_id=1 - ) - self.session.add(tagobj) - self.session.flush() - - # Create issues - issue = model.Issue( - id=pagure.lib.get_next_id(self.session, 1), - project_id=1, - title='Issue #1', - content='Description #1', - user_id=1, - uid=uuid.uuid4().hex, - private=False, - ) - self.session.add(issue) - self.session.commit() - - issue = model.Issue( - id=pagure.lib.get_next_id(self.session, 1), - project_id=1, - title='Issue #2', - content='Description #2', - user_id=1, - uid=uuid.uuid4().hex, - private=False, - ) - self.session.add(issue) - self.session.commit() - - self.assertEqual( - self.session.query(model.Project).count(), 1) - self.assertEqual( - self.session.query(model.TagColored).count(), 2) - self.assertEqual( - self.session.query(model.Issue).count(), 2) - - project = self.session.query( - model.Project - ).filter( - model.Project.id==1 - ).one() - self.session.delete(project) - self.session.commit() - - self.assertEqual( - self.session.query(model.Project).count(), 0) - self.assertEqual( - self.session.query(model.TagColored).count(), 0) - self.assertEqual( - self.session.query(model.Issue).count(), 0) - - def test_delete_project_with_coloredtags_and_tagged_issues(self): - """ Test the model when we delete a project with Colored tags and - tagged issues. """ - - # Create a project - item = model.Project( - user_id=1, # pingou - name='test', - description='test project #1', - hook_token='aaabbbiii', - ) - self.session.add(item) - self.session.commit() - - # Create two ColoredTags - tagobj = model.TagColored( - tag='Tag#1', - project_id=1 - ) - self.session.add(tagobj) - self.session.flush() - - tagobj = model.TagColored( - tag='Tag#2', - project_id=1 - ) - self.session.add(tagobj) - self.session.flush() - - # Create issues - issue = model.Issue( - id=pagure.lib.get_next_id(self.session, 1), - project_id=1, - title='Issue #1', - content='Description #1', - user_id=1, - uid='Issue#1', - private=False, - ) - self.session.add(issue) - self.session.commit() - - issue = model.Issue( - id=pagure.lib.get_next_id(self.session, 1), - project_id=1, - title='Issue #2', - content='Description #2', - user_id=1, - uid='Issue#2', - private=False, - ) - self.session.add(issue) - self.session.commit() - - # Tag the issue - tagissue = model.TagIssueColored( - issue_uid='Issue#1', - tag_id=1 - ) - self.session.add(tagissue) - self.session.commit() - - tagissue = model.TagIssueColored( - issue_uid='Issue#2', - tag_id=2 - ) - self.session.add(tagissue) - self.session.commit() - - self.assertEqual( - self.session.query(model.Project).count(), 1) - self.assertEqual( - self.session.query(model.TagColored).count(), 2) - self.assertEqual( - self.session.query(model.Issue).count(), 2) - - project = self.session.query( - model.Project - ).filter( - model.Project.id==1 - ).one() - self.session.delete(project) - self.session.commit() - - self.assertEqual( - self.session.query(model.Project).count(), 0) - self.assertEqual( - self.session.query(model.TagColored).count(), 0) - self.assertEqual( - self.session.query(model.Issue).count(), 0) - -if __name__ == '__main__': - unittest.main(verbosity=2) diff --git a/tests/test_pagure_lib_notify.py b/tests/test_pagure_lib_notify.py deleted file mode 100644 index 97d6e22..0000000 --- a/tests/test_pagure_lib_notify.py +++ /dev/null @@ -1,383 +0,0 @@ -# -*- coding: utf-8 -*- - -""" - (c) 2016 - Copyright Red Hat Inc - - Authors: - Pierre-Yves Chibon - -""" - -__requires__ = ['SQLAlchemy >= 0.8'] -import pkg_resources - -import unittest -import shutil -import sys -import os - -from mock import patch, MagicMock - -sys.path.insert(0, os.path.join(os.path.dirname( - os.path.abspath(__file__)), '..')) - -import pagure.lib -import pagure.lib.model -import pagure.lib.notify -import tests - - -class PagureLibNotifytests(tests.Modeltests): - """ Tests for pagure.lib.notify """ - - def test_get_emails_for_obj_issue(self): - """ Test the _get_emails_for_obj method from pagure.lib.notify. """ - - # Create the project ns/test - item = pagure.lib.model.Project( - user_id=1, # pingou - name='test3', - namespace='ns', - description='test project #1', - hook_token='aaabbbcccdd', - ) - item.close_status = ['Invalid', 'Insufficient data', 'Fixed'] - self.session.add(item) - self.session.commit() - - # Create the ticket - iss = pagure.lib.new_issue( - issue_id=4, - session=self.session, - repo=item, - title='test issue', - content='content test issue', - user='pingou', - ticketfolder=None, - ) - self.session.commit() - self.assertEqual(iss.id, 4) - self.assertEqual(iss.title, 'test issue') - - exp = set(['bar@pingou.com']) - out = pagure.lib.notify._get_emails_for_obj(iss) - self.assertEqual(out, exp) - - # Comment on the ticket - out = pagure.lib.add_issue_comment( - self.session, - issue=iss, - comment='This is a comment', - user='foo', - ticketfolder=None, - notify=False) - self.assertEqual(out, 'Comment added') - - exp = set(['bar@pingou.com', 'foo@bar.com']) - out = pagure.lib.notify._get_emails_for_obj(iss) - self.assertEqual(out, exp) - - # Create user `bar` - item = pagure.lib.model.User( - user='bar', - fullname='bar name', - password='bar', - default_email='bar@bar.com', - ) - self.session.add(item) - item = pagure.lib.model.UserEmail( - user_id=3, - email='bar@bar.com') - self.session.add(item) - self.session.commit() - - # Watch the ticket - out = pagure.lib.set_watch_obj(self.session, 'bar', iss, True) - self.assertEqual(out, 'You are now watching this issue') - - exp = set(['bar@pingou.com', 'foo@bar.com', 'bar@bar.com']) - out = pagure.lib.notify._get_emails_for_obj(iss) - self.assertEqual(out, exp) - - def test_get_emails_for_obj_issue_watching_project(self): - """ Test the _get_emails_for_obj method from pagure.lib.notify. """ - - # Create the project ns/test - item = pagure.lib.model.Project( - user_id=1, # pingou - name='test3', - namespace='ns', - description='test project #1', - hook_token='aaabbbcccdd', - ) - item.close_status = ['Invalid', 'Insufficient data', 'Fixed'] - self.session.add(item) - self.session.commit() - - # Create the ticket - iss = pagure.lib.new_issue( - issue_id=4, - session=self.session, - repo=item, - title='test issue', - content='content test issue', - user='pingou', - ticketfolder=None, - ) - self.session.commit() - self.assertEqual(iss.id, 4) - self.assertEqual(iss.title, 'test issue') - - exp = set(['bar@pingou.com']) - out = pagure.lib.notify._get_emails_for_obj(iss) - self.assertEqual(out, exp) - - # Comment on the ticket - out = pagure.lib.add_issue_comment( - self.session, - issue=iss, - comment='This is a comment', - user='foo', - ticketfolder=None, - notify=False) - self.assertEqual(out, 'Comment added') - - exp = set(['bar@pingou.com', 'foo@bar.com']) - out = pagure.lib.notify._get_emails_for_obj(iss) - self.assertEqual(out, exp) - - # Create user `bar` - item = pagure.lib.model.User( - user='bar', - fullname='bar name', - password='bar', - default_email='bar@bar.com', - ) - self.session.add(item) - item = pagure.lib.model.UserEmail( - user_id=3, - email='bar@bar.com') - self.session.add(item) - self.session.commit() - - # Watch the project - repo = pagure.get_authorized_project(self.session, 'test3', namespace='ns') - out = pagure.lib.update_watch_status(self.session, repo, 'bar', '1') - self.assertEqual( - out, 'You are now watching issues and PRs on this project') - - exp = set(['bar@pingou.com', 'foo@bar.com', 'bar@bar.com']) - out = pagure.lib.notify._get_emails_for_obj(iss) - self.assertEqual(out, exp) - - @patch('pagure.lib.notify.smtplib.SMTP') - def test_get_emails_for_obj_pr(self, mock_smtp): - """ Test the _get_emails_for_obj method from pagure.lib.notify. """ - mock_smtp.return_value = MagicMock() - - tests.create_projects(self.session) - - # Create the project ns/test - item = pagure.lib.model.Project( - user_id=1, # pingou - name='test3', - namespace='ns', - description='test project #1', - hook_token='aaabbbcccdd', - ) - item.close_status = ['Invalid', 'Insufficient data', 'Fixed'] - self.session.add(item) - self.session.commit() - - # Create the PR - repo = pagure.lib._get_project(self.session, 'test') - req = pagure.lib.new_pull_request( - session=self.session, - repo_from=repo, - branch_from='master', - repo_to=repo, - branch_to='master', - title='test pull-request', - user='pingou', - requestfolder=None, - ) - self.session.commit() - self.assertEqual(req.id, 1) - self.assertEqual(req.title, 'test pull-request') - self.assertEqual(repo.open_requests, 1) - - exp = set(['bar@pingou.com']) - out = pagure.lib.notify._get_emails_for_obj(req) - self.assertEqual(out, exp) - - # Comment on the ticket - out = pagure.lib.add_pull_request_comment( - self.session, - request=req, - commit=None, - tree_id=None, - filename=None, - row=None, - comment='This is a comment', - user='foo', - requestfolder=None, - notify=False) - self.assertEqual(out, 'Comment added') - - exp = set(['bar@pingou.com', 'foo@bar.com']) - out = pagure.lib.notify._get_emails_for_obj(req) - self.assertEqual(out, exp) - - # Create user `bar` - item = pagure.lib.model.User( - user='bar', - fullname='bar name', - password='bar', - default_email='bar@bar.com', - ) - self.session.add(item) - item = pagure.lib.model.UserEmail( - user_id=3, - email='bar@bar.com') - self.session.add(item) - self.session.commit() - - # Watch the pull-request - out = pagure.lib.set_watch_obj(self.session, 'bar', req, True) - self.assertEqual(out, 'You are now watching this pull-request') - - exp = set(['bar@pingou.com', 'foo@bar.com', 'bar@bar.com']) - out = pagure.lib.notify._get_emails_for_obj(req) - self.assertEqual(out, exp) - - @patch('pagure.lib.notify.smtplib.SMTP') - def test_get_emails_for_obj_pr_watching_project(self, mock_smtp): - """ Test the _get_emails_for_obj method from pagure.lib.notify. """ - mock_smtp.return_value = MagicMock() - - tests.create_projects(self.session) - - # Create the project ns/test - item = pagure.lib.model.Project( - user_id=1, # pingou - name='test3', - namespace='ns', - description='test project #1', - hook_token='aaabbbcccdd', - ) - item.close_status = ['Invalid', 'Insufficient data', 'Fixed'] - self.session.add(item) - self.session.commit() - - # Create the PR - repo = pagure.get_authorized_project(self.session, 'test') - req = pagure.lib.new_pull_request( - session=self.session, - repo_from=repo, - branch_from='master', - repo_to=repo, - branch_to='master', - title='test pull-request', - user='pingou', - requestfolder=None, - ) - self.session.commit() - self.assertEqual(req.id, 1) - self.assertEqual(req.title, 'test pull-request') - self.assertEqual(repo.open_requests, 1) - - exp = set(['bar@pingou.com']) - out = pagure.lib.notify._get_emails_for_obj(req) - self.assertEqual(out, exp) - - # Comment on the ticket - out = pagure.lib.add_pull_request_comment( - self.session, - request=req, - commit=None, - tree_id=None, - filename=None, - row=None, - comment='This is a comment', - user='foo', - requestfolder=None, - notify=False) - self.assertEqual(out, 'Comment added') - - exp = set(['bar@pingou.com', 'foo@bar.com']) - out = pagure.lib.notify._get_emails_for_obj(req) - self.assertEqual(out, exp) - - # Create user `bar` - item = pagure.lib.model.User( - user='bar', - fullname='bar name', - password='bar', - default_email='bar@bar.com', - ) - self.session.add(item) - item = pagure.lib.model.UserEmail( - user_id=3, - email='bar@bar.com') - self.session.add(item) - self.session.commit() - - # Watch the project - repo = pagure.get_authorized_project(self.session, 'test') - out = pagure.lib.update_watch_status(self.session, repo, 'bar', '1') - self.assertEqual( - out, 'You are now watching issues and PRs on this project') - - exp = set(['bar@pingou.com', 'foo@bar.com', 'bar@bar.com']) - out = pagure.lib.notify._get_emails_for_obj(req) - self.assertEqual(out, exp) - - @patch('pagure.lib.notify.smtplib.SMTP') - def test_send_email(self, mock_smtp): - """ Test the notify_new_comment method from pagure.lib.notify. """ - mock_smtp.return_value = MagicMock() - - email = pagure.lib.notify.send_email( - 'Email content', - 'Email “Subject“', - 'foo@bar.com,zöé@foo.net', - mail_id='test-pull-request-2edbf96ebe644f4bb31b94605e-1@pagure', - in_reply_to='test-pull-request-2edbf96ebe644f4bb31b94605e@pagure', - project_name='namespace/project', - user_from='Zöé', - ) - exp = '''Content-Type: text/plain; charset="utf-8" -MIME-Version: 1.0 -Content-Transfer-Encoding: base64 -Subject: =?utf-8?b?W25hbWVzcGFjZS9wcm9qZWN0XSBFbWFpbCDigJxTdWJqZWN04oCc?= -From: =?utf-8?b?WsO2w6k=?= -mail-id: test-pull-request-2edbf96ebe644f4bb31b94605e-1@pagure -Message-Id: -In-Reply-To: -X-Auto-Response-Suppress: All -X-pagure: https://pagure.org/ -X-pagure-project: namespace/project -List-ID: namespace/project -List-Archive: https://pagure.org/namespace/project -To: zöé@foo.net -Reply-To: reply+42f5809bca16d73f59180bdcc76c981e939b5eab5c02930d7d7dd38f45118b89e9ceb877e94e7f22376fbf35aab1d0e8e83dfb074ee82640cc82da12ea8019ca@pagure.org -Mail-Followup-To: reply+42f5809bca16d73f59180bdcc76c981e939b5eab5c02930d7d7dd38f45118b89e9ceb877e94e7f22376fbf35aab1d0e8e83dfb074ee82640cc82da12ea8019ca@pagure.org - -RW1haWwgY29udGVudA== -''' - self.assertEqual(email.as_string(), exp) - - email = pagure.lib.notify.send_email( - 'Email content', - 'Email “Subject“', - u'foo@bar.com,zöé@foo.net', - mail_id='test-pull-request-2edbf96ebe644f4bb31b94605e-1@pagure', - in_reply_to='test-pull-request-2edbf96ebe644f4bb31b94605e@pagure', - project_name='namespace/project', - user_from='Zöé', - ) - self.assertEqual(email.as_string(), exp) - - -if __name__ == '__main__': - unittest.main(verbosity=2) diff --git a/tests/test_pagure_lib_notify_email.py b/tests/test_pagure_lib_notify_email.py deleted file mode 100644 index fb5bcf1..0000000 --- a/tests/test_pagure_lib_notify_email.py +++ /dev/null @@ -1,207 +0,0 @@ -# -*- coding: utf-8 -*- - -""" - (c) 2016 - Copyright Red Hat Inc - - Authors: - Adam Williamson - -""" - -import unittest -import sys -import os - -import mock - -sys.path.insert(0, os.path.join(os.path.dirname( - os.path.abspath(__file__)), '..')) - -import pagure.lib # pylint: disable=wrong-import-position -import pagure.lib.model # pylint: disable=wrong-import-position -import pagure.lib.notify # pylint: disable=wrong-import-position -import tests # pylint: disable=wrong-import-position - - -class PagureLibNotifyEmailtests(tests.Modeltests): - """ Some tests for the various email construction functions. In - their own class so they can have some shared fixtures. - """ - - def setUp(self): - """ Override setUp to add more fixtures used for many tests. """ - super(PagureLibNotifyEmailtests, self).setUp() - pagure.SESSION = self.session - tests.create_projects(self.session) - - # we don't want to send any mails while setting up - patcher = mock.patch('pagure.lib.notify.send_email') - patcher.start() - - self.user1 = pagure.lib.get_user(self.session, 'pingou') - self.user2 = pagure.lib.get_user(self.session, 'foo') - self.project1 = pagure.lib._get_project(self.session, 'test') - self.project2 = pagure.lib._get_project(self.session, 'test2') - self.project3 = pagure.lib._get_project(self.session, 'test3', namespace='somenamespace') - - # Create a forked repo, should be project #4 - # Not using fork_project as it tries to do a git clone - item = pagure.lib.model.Project( - user_id=2, # foo - name='test', - description='test project #1', - is_fork=True, - parent_id=1, - hook_token='aaabbbyyy', - ) - self.session.add(item) - self.session.commit() - self.forkedproject = pagure.lib._get_project(self.session, 'test', user='foo') - - # Report an issue on project #1 - self.issue1 = pagure.lib.new_issue( - session=self.session, - repo=self.project1, - title='issue', - content='a bug report', - user='pingou', - ticketfolder=None, - ) - - # Add a comment on the issue - pagure.lib.add_issue_comment( - self.session, - self.issue1, - comment='Test comment', - user='pingou', - ticketfolder=None, - ) - self.comment1 = pagure.lib.get_issue_comment(self.session, self.issue1.uid, 1) - - # Report an issue on project #3 (namespaced) - self.issue2 = pagure.lib.new_issue( - session=self.session, - repo=self.project3, - title='namespaced project issue', - content='a bug report on a namespaced project', - user='pingou', - ticketfolder=None, - ) - - # report an issue on foo's fork of project #1 - self.issue3 = pagure.lib.new_issue( - session=self.session, - repo=self.forkedproject, - title='forked project issue', - content='a bug report on a forked project', - user='pingou', - ticketfolder=None, - ) - - patcher.stop() - - @mock.patch('pagure.lib.notify.send_email') - def test_notify_new_comment(self, fakemail): - """Simple test for notification about new comment.""" - exptext = u""" -pingou added a new comment to an issue you are following: -`` -Test comment -`` - -To reply, visit the link below -https://pagure.org/test/issue/1 -""" - pagure.lib.notify.notify_new_comment(self.comment1) - (_, args, kwargs) = fakemail.mock_calls[0] - - # Mail text should be as expected. - self.assertEqual(args[0], exptext) - - # Mail subject should be as expected. - self.assertEqual(args[1], u'Issue #1: issue') - - # Mail should be sent to user #1. - self.assertEqual(args[2], self.user1.default_email) - - # Mail ID should be comment #1's mail ID... - self.assertEqual(kwargs['mail_id'], self.comment1.mail_id) - - # In reply to issue #1's mail ID. - self.assertEqual(kwargs['in_reply_to'], self.issue1.mail_id) - - # Project name should be...project (full) name. - self.assertEqual(kwargs['project_name'], self.project1.fullname) - - # Mail should be from user1 (who wrote the comment). - self.assertEqual(kwargs['user_from'], self.user1.fullname) - - @mock.patch('pagure.lib.notify.send_email') - def test_notify_new_issue_namespaced(self, fakemail): # pylint: disable=invalid-name - """Test for notifying of a new issue, namespaced project.""" - exptext = u""" -pingou reported a new issue against the project: `test3` that you are following: -`` -a bug report on a namespaced project -`` - -To reply, visit the link below -https://pagure.org/somenamespace/test3/issue/1 -""" - pagure.lib.notify.notify_new_issue(self.issue2) - (_, args, kwargs) = fakemail.mock_calls[0] - - # Mail text should be as expected. - self.assertEqual(args[0], exptext) - - # Mail subject should be as expected. - self.assertEqual(args[1], u'Issue #1: namespaced project issue') - - # Mail should be sent to user #1. - self.assertEqual(args[2], self.user1.default_email) - - # Mail ID should be issue's mail ID. - self.assertEqual(kwargs['mail_id'], self.issue2.mail_id) - - # Project name should be...project (full) name. - self.assertEqual(kwargs['project_name'], self.project3.fullname) - - # Mail should be from user1 (who submitted the issue). - self.assertEqual(kwargs['user_from'], self.user1.fullname) - - @mock.patch('pagure.lib.notify.send_email') - def test_notify_assigned_issue_forked(self, fakemail): # pylint: disable=invalid-name - """Test for notifying re-assignment of issue on forked project. - 'foo' reassigns issue on his fork of 'test' to 'pingou'. - """ - exptext = u""" -The issue: `forked project issue` of project: `test` has been assigned to `pingou` by foo. - -https://pagure.org/fork/foo/test/issue/1 -""" - pagure.lib.notify.notify_assigned_issue(self.issue3, self.user1, self.user2) - (_, args, kwargs) = fakemail.mock_calls[0] - - # Mail text should be as expected. - self.assertEqual(args[0], exptext) - - # Mail subject should be as expected. - self.assertEqual(args[1], u'Issue #1: forked project issue') - - # Mail should be sent to user #1. - # NOTE: Not sent to user #2... - self.assertEqual(args[2], self.user1.default_email) - - # Mail ID should contain issue's mail ID and '/assigned/' - self.assertIn("{0}/assigned/".format(self.issue3.mail_id), kwargs['mail_id']) - - # Project name should be...project (full) name. - self.assertEqual(kwargs['project_name'], self.forkedproject.fullname) - - # Mail should be from user1 (who submitted the issue). - self.assertEqual(kwargs['user_from'], self.user2.fullname) - -# Add more tests to verify that correct mails are sent to correct people here - -if __name__ == '__main__': - unittest.main(verbosity=2) diff --git a/tests/test_pagure_lib_watch_list.py b/tests/test_pagure_lib_watch_list.py deleted file mode 100644 index 12366c6..0000000 --- a/tests/test_pagure_lib_watch_list.py +++ /dev/null @@ -1,524 +0,0 @@ -# -*- coding: utf-8 -*- - -""" - (c) 2016 - Copyright Red Hat Inc - - Authors: - Pierre-Yves Chibon - -""" - -__requires__ = ['SQLAlchemy >= 0.8'] -import pkg_resources - -import unittest -import shutil -import sys -import os - -import mock - -sys.path.insert(0, os.path.join(os.path.dirname( - os.path.abspath(__file__)), '..')) - -import pagure.lib -import pagure.lib.model -import tests - -@mock.patch( - 'pagure.lib.git.update_git', mock.MagicMock(return_value=True)) -@mock.patch( - 'pagure.lib.notify.send_email', mock.MagicMock(return_value=True)) -class PagureLibGetWatchListtests(tests.Modeltests): - """ Tests for pagure.lib.get_watch_list """ - - def test_get_watch_list_invalid_object(self): - """ Test get_watch_list when given an invalid object """ - # Create a project ns/test - item = pagure.lib.model.Project( - user_id=1, # pingou - name='test3', - namespace='ns', - description='test project #1', - hook_token='aaabbbcccdd', - ) - item.close_status = ['Invalid', 'Insufficient data', 'Fixed'] - self.session.add(item) - self.session.commit() - - self.assertRaises( - pagure.exceptions.InvalidObjectException, - pagure.lib.get_watch_list, - self.session, - item - ) - - def test_get_watch_list_simple(self): - """ Test get_watch_list when the creator of the ticket is the - creator of the project """ - # Create a project ns/test - item = pagure.lib.model.Project( - user_id=1, # pingou - name='test3', - namespace='ns', - description='test project #1', - hook_token='aaabbbcccdd', - ) - item.close_status = ['Invalid', 'Insufficient data', 'Fixed'] - self.session.add(item) - self.session.commit() - - # Create the ticket - iss = pagure.lib.new_issue( - issue_id=4, - session=self.session, - repo=item, - title='test issue', - content='content test issue', - user='pingou', - ticketfolder=None, - ) - self.session.commit() - self.assertEqual(iss.id, 4) - self.assertEqual(iss.title, 'test issue') - - self.assertEqual( - pagure.lib.get_watch_list(self.session, iss), - set(['pingou']) - ) - - def test_get_watch_list_different_creator(self): - """ Test get_watch_list when the creator of the ticket is not the - creator of the project """ - # Create a project ns/test - item = pagure.lib.model.Project( - user_id=1, # pingou - name='test3', - namespace='ns', - description='test project #1', - hook_token='aaabbbcccdd', - ) - item.close_status = ['Invalid', 'Insufficient data', 'Fixed'] - self.session.add(item) - self.session.commit() - - # Create the ticket - iss = pagure.lib.new_issue( - issue_id=4, - session=self.session, - repo=item, - title='test issue', - content='content test issue', - user='foo', - ticketfolder=None, - ) - self.session.commit() - self.assertEqual(iss.id, 4) - self.assertEqual(iss.title, 'test issue') - - self.assertEqual( - pagure.lib.get_watch_list(self.session, iss), - set(['pingou', 'foo']) - ) - - def test_get_watch_list_project_w_contributor(self): - """ Test get_watch_list when the project has more than one - contributor """ - # Create a project ns/test3 - item = pagure.lib.model.Project( - user_id=1, # pingou - name='test3', - namespace='ns', - description='test project #1', - hook_token='aaabbbcccdd', - ) - item.close_status = ['Invalid', 'Insufficient data', 'Fixed'] - self.session.add(item) - self.session.commit() - - # Add a contributor to the project - item = pagure.lib.model.User( - user='bar', - fullname='bar foo', - password='foo', - default_email='bar@bar.com', - ) - self.session.add(item) - item = pagure.lib.model.UserEmail( - user_id=3, - email='bar@bar.com') - self.session.add(item) - - project = pagure.lib._get_project( - self.session, 'test3', namespace='ns') - msg = pagure.lib.add_user_to_project( - session=self.session, - project=project, - new_user='bar', - user='pingou', - ) - self.session.commit() - self.assertEqual(msg, 'User added') - - # Create the ticket - iss = pagure.lib.new_issue( - issue_id=4, - session=self.session, - repo=project, - title='test issue', - content='content test issue', - user='foo', - ticketfolder=None, - ) - self.session.commit() - self.assertEqual(iss.id, 4) - self.assertEqual(iss.title, 'test issue') - - self.assertEqual( - pagure.lib.get_watch_list(self.session, iss), - set(['pingou', 'foo', 'bar']) - ) - - def test_get_watch_list_user_in_group(self): - """ Test get_watch_list when the project has groups of contributors - """ - # Create a project ns/test3 - item = pagure.lib.model.Project( - user_id=1, # pingou - name='test3', - namespace='ns', - description='test project #1', - hook_token='aaabbbcccdd', - ) - item.close_status = ['Invalid', 'Insufficient data', 'Fixed'] - self.session.add(item) - self.session.commit() - - # Create a third user - item = pagure.lib.model.User( - user='bar', - fullname='bar foo', - password='foo', - default_email='bar@bar.com', - ) - self.session.add(item) - item = pagure.lib.model.UserEmail( - user_id=3, - email='bar@bar.com') - self.session.add(item) - - # Create a group - msg = pagure.lib.add_group( - self.session, - group_name='foo', - display_name='foo group', - description=None, - group_type='bar', - user='pingou', - is_admin=False, - blacklist=[], - ) - self.session.commit() - self.assertEqual(msg, 'User `pingou` added to the group `foo`.') - - # Add user to group - group = pagure.lib.search_groups(self.session, group_name='foo') - msg = pagure.lib.add_user_to_group( - self.session, - username='bar', - group=group, - user='pingou', - is_admin=False, - ) - self.session.commit() - self.assertEqual(msg, 'User `bar` added to the group `foo`.') - - project = pagure.lib._get_project( - self.session, 'test3', namespace='ns') - - # Add group to project - msg = pagure.lib.add_group_to_project( - session=self.session, - project=project, - new_group='foo', - user='pingou', - ) - self.session.commit() - self.assertEqual(msg, 'Group added') - - # Create the ticket - iss = pagure.lib.new_issue( - issue_id=4, - session=self.session, - repo=project, - title='test issue', - content='content test issue', - user='foo', - ticketfolder=None, - ) - self.session.commit() - self.assertEqual(iss.id, 4) - self.assertEqual(iss.title, 'test issue') - - self.assertEqual( - pagure.lib.get_watch_list(self.session, iss), - set(['pingou', 'foo', 'bar']) - ) - - def test_get_watch_list_project_w_contributor_out(self): - """ Test get_watch_list when the project has one contributor not - watching the project """ - # Create a project ns/test3 - item = pagure.lib.model.Project( - user_id=1, # pingou - name='test3', - namespace='ns', - description='test project #1', - hook_token='aaabbbcccdd', - ) - item.close_status = ['Invalid', 'Insufficient data', 'Fixed'] - self.session.add(item) - self.session.commit() - - # Add a contributor to the project - item = pagure.lib.model.User( - user='bar', - fullname='bar foo', - password='foo', - default_email='bar@bar.com', - ) - self.session.add(item) - item = pagure.lib.model.UserEmail( - user_id=3, - email='bar@bar.com') - self.session.add(item) - - project = pagure.lib._get_project( - self.session, 'test3', namespace='ns') - msg = pagure.lib.add_user_to_project( - session=self.session, - project=project, - new_user='bar', - user='pingou', - ) - self.session.commit() - self.assertEqual(msg, 'User added') - - # Set the user `pingou` to not watch the project - msg = pagure.lib.update_watch_status( - session=self.session, - project=project, - user='pingou', - watch='0', - ) - self.session.commit() - self.assertEqual(msg, 'You are no longer watching this project') - - # Create the ticket - iss = pagure.lib.new_issue( - issue_id=4, - session=self.session, - repo=project, - title='test issue', - content='content test issue', - user='foo', - ticketfolder=None, - ) - self.session.commit() - self.assertEqual(iss.id, 4) - self.assertEqual(iss.title, 'test issue') - - self.assertEqual( - pagure.lib.get_watch_list(self.session, iss), - set(['foo', 'bar']) - ) - - def test_get_watch_list_project_w_contributor_out_pr(self): - """ Test get_watch_list when the project has one contributor not - watching the pull-request """ - # Create a project ns/test3 - item = pagure.lib.model.Project( - user_id=1, # pingou - name='test3', - namespace='ns', - description='test project #1', - hook_token='aaabbbcccdd', - ) - item.close_status = ['Invalid', 'Insufficient data', 'Fixed'] - self.session.add(item) - self.session.commit() - - # Add a contributor to the project - item = pagure.lib.model.User( - user='bar', - fullname='bar foo', - password='foo', - default_email='bar@bar.com', - ) - self.session.add(item) - item = pagure.lib.model.UserEmail( - user_id=3, - email='bar@bar.com') - self.session.add(item) - - project = pagure.lib._get_project( - self.session, 'test3', namespace='ns') - msg = pagure.lib.add_user_to_project( - session=self.session, - project=project, - new_user='bar', - user='pingou', - ) - self.session.commit() - self.assertEqual(msg, 'User added') - - # Create the pull-request - req = pagure.lib.new_pull_request( - session=self.session, - repo_from=project, - branch_from='dev', - repo_to=project, - branch_to='master', - title='test pull-request', - user='foo', - requestfolder=None, - ) - self.session.commit() - self.assertEqual(req.id, 1) - self.assertEqual(req.title, 'test pull-request') - - # Set the user `pingou` to not watch the pull-request - out = pagure.lib.set_watch_obj(self.session, 'pingou', req, False) - self.assertEqual( - out, 'You are no longer watching this pull-request') - - self.assertEqual( - pagure.lib.get_watch_list(self.session, req), - set(['foo', 'bar']) - ) - - def test_get_watch_list_project_w_contributor_watching_project(self): - """ Test get_watch_list when the project has one contributor watching - the project """ - # Create a project ns/test3 - item = pagure.lib.model.Project( - user_id=1, # pingou - name='test3', - namespace='ns', - description='test project #1', - hook_token='aaabbbcccdd', - ) - item.close_status = ['Invalid', 'Insufficient data', 'Fixed'] - self.session.add(item) - self.session.commit() - - # Add a new user - item = pagure.lib.model.User( - user='bar', - fullname='bar foo', - password='foo', - default_email='bar@bar.com', - ) - self.session.add(item) - item = pagure.lib.model.UserEmail( - user_id=3, - email='bar@bar.com') - self.session.add(item) - - # Set the user `bar` to watch the project - project = pagure.lib._get_project( - self.session, 'test3', namespace='ns') - msg = pagure.lib.update_watch_status( - session=self.session, - project=project, - user='bar', - watch='1', - ) - self.session.commit() - self.assertEqual( - msg, 'You are now watching issues and PRs on this project') - - # Create the pull-request - req = pagure.lib.new_pull_request( - session=self.session, - repo_from=project, - branch_from='dev', - repo_to=project, - branch_to='master', - title='test pull-request', - user='foo', - requestfolder=None, - ) - self.session.commit() - self.assertEqual(req.id, 1) - self.assertEqual(req.title, 'test pull-request') - - self.assertEqual( - pagure.lib.get_watch_list(self.session, req), - set(['foo', 'bar', 'pingou']) - ) - - def test_get_watch_list_project_w_private_issue(self): - """ Test get_watch_list when the project has one contributor watching - the project and the issue is private """ - # Create a project ns/test3 - item = pagure.lib.model.Project( - user_id=1, # pingou - name='test3', - namespace='ns', - description='test project #1', - hook_token='aaabbbcccdd', - ) - item.close_status = ['Invalid', 'Insufficient data', 'Fixed'] - self.session.add(item) - self.session.commit() - - # Add a new user - item = pagure.lib.model.User( - user='bar', - fullname='bar foo', - password='foo', - default_email='bar@bar.com', - ) - self.session.add(item) - item = pagure.lib.model.UserEmail( - user_id=3, - email='bar@bar.com') - self.session.add(item) - - # Set the user `bar` to watch the project - project = pagure.get_authorized_project( - self.session, 'test3', namespace='ns') - msg = pagure.lib.update_watch_status( - session=self.session, - project=project, - user='bar', - watch='1', - ) - self.session.commit() - self.assertEqual( - msg, 'You are now watching issues and PRs on this project') - - # Create the ticket - iss = pagure.lib.new_issue( - issue_id=4, - session=self.session, - repo=project, - title='test issue', - content='content test issue', - user='pingou', - private=True, - ticketfolder=None, - ) - self.session.commit() - self.assertEqual(iss.id, 4) - self.assertEqual(iss.title, 'test issue') - - self.assertEqual( - pagure.lib.get_watch_list(self.session, iss), - set(['pingou']) - ) - - -if __name__ == '__main__': - unittest.main(verbosity=2)