# -*- coding: utf-8 -*- """ (c) 2016 - Copyright Red Hat Inc Authors: Pierre-Yves Chibon """ from __future__ import unicode_literals __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.model import pagure.lib.query 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.query.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.query.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.query.new_issue( issue_id=4, session=self.session, repo=item, title='test issue', content='content test issue', user='pingou', ) self.session.commit() self.assertEqual(iss.id, 4) self.assertEqual(iss.title, 'test issue') self.assertEqual( pagure.lib.query.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.query.new_issue( issue_id=4, session=self.session, repo=item, title='test issue', content='content test issue', user='foo', ) self.session.commit() self.assertEqual(iss.id, 4) self.assertEqual(iss.title, 'test issue') self.assertEqual( pagure.lib.query.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.query._get_project( self.session, 'test3', namespace='ns') msg = pagure.lib.query.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.query.new_issue( issue_id=4, session=self.session, repo=project, title='test issue', content='content test issue', user='foo', ) self.session.commit() self.assertEqual(iss.id, 4) self.assertEqual(iss.title, 'test issue') self.assertEqual( pagure.lib.query.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.query.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.query.search_groups(self.session, group_name='foo') msg = pagure.lib.query.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.query._get_project( self.session, 'test3', namespace='ns') # Add group to project msg = pagure.lib.query.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.query.new_issue( issue_id=4, session=self.session, repo=project, title='test issue', content='content test issue', user='foo', ) self.session.commit() self.assertEqual(iss.id, 4) self.assertEqual(iss.title, 'test issue') self.assertEqual( pagure.lib.query.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.query._get_project( self.session, 'test3', namespace='ns') msg = pagure.lib.query.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.query.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.query.new_issue( issue_id=4, session=self.session, repo=project, title='test issue', content='content test issue', user='foo', ) self.session.commit() self.assertEqual(iss.id, 4) self.assertEqual(iss.title, 'test issue') self.assertEqual( pagure.lib.query.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.query._get_project( self.session, 'test3', namespace='ns') msg = pagure.lib.query.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.query.new_pull_request( session=self.session, repo_from=project, branch_from='dev', repo_to=project, branch_to='master', title='test pull-request', user='foo', ) 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.query.set_watch_obj(self.session, 'pingou', req, False) self.assertEqual( out, 'You are no longer watching this pull-request') self.assertEqual( pagure.lib.query.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.query._get_project( self.session, 'test3', namespace='ns') msg = pagure.lib.query.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.query.new_pull_request( session=self.session, repo_from=project, branch_from='dev', repo_to=project, branch_to='master', title='test pull-request', user='foo', ) self.session.commit() self.assertEqual(req.id, 1) self.assertEqual(req.title, 'test pull-request') self.assertEqual( pagure.lib.query.get_watch_list(self.session, req), set(['foo', 'bar', 'pingou']) ) @mock.patch.dict('pagure.config.config', {'PAGURE_ADMIN_USERS': 'foo'}) 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.lib.query.get_authorized_project( self.session, 'test3', namespace='ns') msg = pagure.lib.query.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.query.new_issue( issue_id=4, session=self.session, repo=project, title='test issue', content='content test issue', user='pingou', private=True, ) self.session.commit() self.assertEqual(iss.id, 4) self.assertEqual(iss.title, 'test issue') self.assertEqual( pagure.lib.query.get_watch_list(self.session, iss), set(['pingou']) ) out = pagure.lib.query.set_watch_obj(self.session, 'foo', iss, True) self.assertEqual(out, 'You are now watching this issue') self.assertEqual( pagure.lib.query.get_watch_list(self.session, iss), set(['pingou','foo']) ) out = pagure.lib.query.set_watch_obj(self.session, 'foo', iss, False) self.assertEqual( out, 'You are no longer watching this issue') self.assertEqual( pagure.lib.query.get_watch_list(self.session, iss), set(['pingou']) ) if __name__ == '__main__': unittest.main(verbosity=2)