def testAddIssuesToHotlists(self): # Create two hotlists hotlist_1 = self.services.features.CreateHotlist( self.cnxn, 'Hotlist-1', 'Summary', 'Description', owner_ids=[111], editor_ids=[]) hotlist_2 = self.services.features.CreateHotlist( self.cnxn, 'Hotlist-2', 'Summary', 'Description', owner_ids=[111], editor_ids=[]) # Add Issue 1 to both hotlists request = features_pb2.AddIssuesToHotlistsRequest( note='Foo', hotlist_refs=[ common_pb2.HotlistRef( name='Hotlist-1', owner=common_pb2.UserRef(user_id=111)), common_pb2.HotlistRef( name='Hotlist-2', owner=common_pb2.UserRef(user_id=111))], issue_refs=[ common_pb2.IssueRef(project_name='proj', local_id=1)]) mc = monorailcontext.MonorailContext( self.services, cnxn=self.cnxn, requester='*****@*****.**') self.CallWrapped(self.features_svcr.AddIssuesToHotlists, mc, request) self.assertEqual( [self.issue_1.issue_id], [item.issue_id for item in hotlist_1.items]) self.assertEqual( [self.issue_1.issue_id], [item.issue_id for item in hotlist_2.items]) self.assertEqual('Foo', hotlist_1.items[0].note) self.assertEqual('Foo', hotlist_2.items[0].note)
def testCreateHotlist_Normal(self): request = features_pb2.CreateHotlistRequest( name='Fake-Hotlist', summary='Summary', description='Description', editor_refs=[ common_pb2.UserRef(user_id=222), common_pb2.UserRef(display_name='*****@*****.**')], issue_refs=[ common_pb2.IssueRef(project_name='proj', local_id=1), common_pb2.IssueRef(project_name='proj', local_id=2)], is_private=True) mc = monorailcontext.MonorailContext( self.services, cnxn=self.cnxn, requester='*****@*****.**') self.CallWrapped(self.features_svcr.CreateHotlist, mc, request) # Check that the hotlist was successfuly added. hotlist_id = self.services.features.LookupHotlistIDs( self.cnxn, ['Fake-Hotlist'], [111]).get(('fake-hotlist', 111)) hotlist = self.services.features.GetHotlist(self.cnxn, hotlist_id) self.assertEqual('Summary', hotlist.summary) self.assertEqual('Description', hotlist.description) self.assertEqual([111], hotlist.owner_ids) self.assertEqual([222, 333], hotlist.editor_ids) self.assertEqual( [self.issue_1.issue_id, self.issue_2.issue_id], [item.issue_id for item in hotlist.items]) self.assertTrue(hotlist.is_private)
def testGetUsersProjects(self): self.user = self.services.user.TestAddUser('*****@*****.**', 333) self.services.project_star.SetStar(self.cnxn, self.project.project_id, 222, True) self.project.committer_ids.extend([222]) self.AddUserProjects(222) self.AddUserProjects(333) request = users_pb2.GetUsersProjectsRequest(user_refs=[ common_pb2.UserRef(display_name='*****@*****.**'), common_pb2.UserRef(display_name='*****@*****.**') ]) mc = monorailcontext.MonorailContext(self.services, cnxn=self.cnxn, requester='*****@*****.**') mc.LookupLoggedInUserPerms(self.project) response = self.CallWrapped(self.users_svcr.GetUsersProjects, mc, request) self.assertEqual([ user_objects_pb2.UserProjects( user_ref=common_pb2.UserRef(display_name='*****@*****.**'), owner_of=['members-only-222', 'owner-live-222'], member_of=['committer-live-222', 'proj'], contributor_to=['contributor-live-222'], starred_projects=['proj']), user_objects_pb2.UserProjects( user_ref=common_pb2.UserRef(display_name='*****@*****.**'), owner_of=['owner-live-333'], member_of=['committer-live-333'], contributor_to=['contributor-live-333']) ], list(response.users_projects))
def testListHotlistIssues(self): hotlist_id = self.services.features.CreateHotlist( self.cnxn, 'Fake-Hotlist', 'Summary', 'Description', owner_ids=[111], editor_ids=[]).hotlist_id self.services.features.UpdateHotlistItems( self.cnxn, hotlist_id, [], [(self.issue_1.issue_id, 222, 12345, 'Note'), (self.issue_2.issue_id, 111, 12346, 'Note')]) self.issue_2.labels = ['Restrict-View-CoreTeam'] owner_ref = common_pb2.UserRef(user_id=111) hotlist_ref = common_pb2.HotlistRef(name='Fake-Hotlist', owner=owner_ref) request = features_pb2.ListHotlistIssuesRequest(hotlist_ref=hotlist_ref) mc = monorailcontext.MonorailContext( self.services, cnxn=self.cnxn, requester='*****@*****.**') mc.LookupLoggedInUserPerms(self.project) response = self.CallWrapped( self.features_svcr.ListHotlistIssues, mc, request) self.assertEqual(1, len(response.items)) self.assertEqual(10, response.items[0].rank) self.assertEqual(12345, response.items[0].added_timestamp) self.assertEqual('Note', response.items[0].note) self.assertEqual( common_pb2.UserRef( user_id=222, display_name='*****@*****.**'), response.items[0].adder_ref) self.assertEqual(1, response.items[0].issue.local_id) self.assertEqual('proj', response.items[0].issue.project_name) self.assertEqual('sum', response.items[0].issue.summary) self.assertEqual('New', response.items[0].issue.status_ref.status)
def ConvertUserRef(explicit_user_id, derived_user_id, users_by_id): """Use the given user IDs to create a UserRef.""" user_id = explicit_user_id or derived_user_id is_derived = not explicit_user_id if not user_id: return common_pb2.UserRef( user_id=0, display_name=framework_constants.NO_USER_NAME) return common_pb2.UserRef(user_id=user_id, is_derived=is_derived, display_name=users_by_id[user_id].display_name)
def testUnlinkAccounts_Normal(self): """Users can unlink their accounts.""" self.services.user.linked_account_rows = [(111, 222)] request = users_pb2.UnlinkAccountsRequest( parent=common_pb2.UserRef(display_name='*****@*****.**'), child=common_pb2.UserRef(display_name='*****@*****.**')) mc = monorailcontext.MonorailContext(self.services, cnxn=self.cnxn, requester='*****@*****.**') self.CallWrapped(self.users_svcr.UnlinkAccounts, mc, request) self.assertEqual([], self.services.user.linked_account_rows)
def testListComponents_IncludeAdminInfo(self): self.services.config.CreateComponentDef( self.cnxn, self.project.project_id, 'Foo', 'Foo Component', True, [], [], 1234567, 111, []) self.services.config.CreateComponentDef( self.cnxn, self.project.project_id, 'Bar', 'Bar Component', False, [], [], 1234568, 111, []) self.services.config.CreateComponentDef( self.cnxn, self.project.project_id, 'Bar>Baz', 'Baz Component', False, [], [], 1234569, 111, []) creator_ref = common_pb2.UserRef( user_id=111, display_name='*****@*****.**') no_user_ref = common_pb2.UserRef( display_name=framework_constants.NO_USER_NAME) request = projects_pb2.ListComponentsRequest( project_name='proj', include_admin_info=True) mc = monorailcontext.MonorailContext( self.services, cnxn=self.cnxn, requester='*****@*****.**') response = self.CallWrapped( self.projects_svcr.ListComponents, mc, request) self.assertEqual( [project_objects_pb2.ComponentDef( path='Foo', docstring='Foo Component', deprecated=True, created=1234567, creator_ref=creator_ref, modifier_ref=no_user_ref), project_objects_pb2.ComponentDef( path='Bar', docstring='Bar Component', deprecated=False, created=1234568, creator_ref=creator_ref, modifier_ref=no_user_ref), project_objects_pb2.ComponentDef( path='Bar>Baz', docstring='Baz Component', deprecated=False, created=1234569, creator_ref=creator_ref, modifier_ref=no_user_ref), ], list(response.component_defs))
def testGetMemberships(self): request = users_pb2.GetMembershipsRequest(user_ref=common_pb2.UserRef( display_name='*****@*****.**', user_id=111)) mc = monorailcontext.MonorailContext(self.services, cnxn=self.cnxn, requester='*****@*****.**') response = self.CallWrapped(self.users_svcr.GetMemberships, mc, request) expected_group_refs = [ common_pb2.UserRef(display_name='*****@*****.**', user_id=self.group1_id), common_pb2.UserRef(display_name='*****@*****.**', user_id=self.group2_id) ] self.assertItemsEqual(expected_group_refs, response.group_refs)
def CallStar(self, requester='*****@*****.**', starred=True): request = users_pb2.StarUserRequest( user_ref=common_pb2.UserRef(user_id=222), starred=starred) mc = monorailcontext.MonorailContext(self.services, cnxn=self.cnxn, requester=requester) response = self.CallWrapped(self.users_svcr.StarUser, mc, request) return response.star_count
def testListReferencedUsers(self): """We can get all valid users by email addresses.""" request = users_pb2.ListReferencedUsersRequest( # we ignore emails that are empty or belong to non-existent users. user_refs=[ common_pb2.UserRef(display_name='*****@*****.**'), common_pb2.UserRef(display_name='*****@*****.**'), common_pb2.UserRef(display_name=''), common_pb2.UserRef() ]) mc = monorailcontext.MonorailContext(self.services, cnxn=self.cnxn, requester='*****@*****.**') response = self.CallWrapped(self.users_svcr.ListReferencedUsers, mc, request) self.assertEqual(len(response.users), 1) self.assertEqual(response.users[0].user_id, 222)
def CallGetStarCount(self): request = users_pb2.GetUserStarCountRequest( user_ref=common_pb2.UserRef(user_id=222)) mc = monorailcontext.MonorailContext(self.services, cnxn=self.cnxn, requester='*****@*****.**') response = self.CallWrapped(self.users_svcr.GetUserStarCount, mc, request) return response.star_count
def ConvertUserRefs(explicit_user_ids, derived_user_ids, users_by_id, use_email): """Use the given user ID lists to create a list of UserRef.""" result = [] for user_id in explicit_user_ids: result.append( common_pb2.UserRef( user_id=user_id, is_derived=False, display_name=(users_by_id[user_id].email if use_email else users_by_id[user_id].display_name))) for user_id in derived_user_ids: result.append( common_pb2.UserRef( user_id=user_id, is_derived=True, display_name=(users_by_id[user_id].email if use_email else users_by_id[user_id].display_name))) return result
def testGetMemberships_NonExistentUser(self): request = users_pb2.GetMembershipsRequest(user_ref=common_pb2.UserRef( display_name='*****@*****.**', user_id=888)) mc = monorailcontext.MonorailContext(self.services, cnxn=self.cnxn, requester='') with self.assertRaises(exceptions.NoSuchUserException): self.CallWrapped(self.users_svcr.GetMemberships, mc, request)
def CallGetStarCount(self): # Query for hotlists for '*****@*****.**' owner_ref = common_pb2.UserRef(user_id=111) hotlist_ref = common_pb2.HotlistRef(name='Fake-Hotlist', owner=owner_ref) request = features_pb2.GetHotlistStarCountRequest(hotlist_ref=hotlist_ref) mc = monorailcontext.MonorailContext( self.services, cnxn=self.cnxn, requester='*****@*****.**') response = self.CallWrapped( self.features_svcr.GetHotlistStarCount, mc, request) return response.star_count
def testListStarredHotlists(self): hotlists = [ self.services.features.CreateHotlist( self.cnxn, 'Fake-Hotlist', 'Summary', 'Description', owner_ids=[222], editor_ids=[111]), self.services.features.CreateHotlist( self.cnxn, 'Fake-Hotlist-2', 'Summary', 'Description', owner_ids=[111], editor_ids=[222]), self.services.features.CreateHotlist( self.cnxn, 'Private-Hotlist', 'Summary', 'Description', owner_ids=[333], editor_ids=[222], is_private=True)] for hotlist in hotlists: self.services.hotlist_star.SetStar( self.cnxn, hotlist.hotlist_id, 111, True) request = features_pb2.ListStarredHotlistsRequest() mc = monorailcontext.MonorailContext( self.services, cnxn=self.cnxn, requester='*****@*****.**') response = self.CallWrapped( self.features_svcr.ListStarredHotlists, mc, request) expected_hotlists = [ features_objects_pb2.Hotlist( owner_ref=common_pb2.UserRef( user_id=222, display_name='*****@*****.**'), name='Fake-Hotlist', summary='Summary', description='Description'), features_objects_pb2.Hotlist( owner_ref=common_pb2.UserRef( user_id=111, display_name='*****@*****.**'), name='Fake-Hotlist-2', summary='Summary', description='Description')] # We don't have permission to see the last issue, because it is marked as # private and we're not owners or editors. self.assertEqual(expected_hotlists, list(response.hotlists))
def testUnlinkAccounts_NotFound(self): """Reject attempt to unlink a user that does not exist or unspecified.""" mc = monorailcontext.MonorailContext(self.services, cnxn=self.cnxn, requester='*****@*****.**') request = users_pb2.UnlinkAccountsRequest( parent=common_pb2.UserRef(display_name='*****@*****.**'), child=common_pb2.UserRef(display_name='*****@*****.**')) with self.assertRaises(exceptions.NoSuchUserException): self.CallWrapped(self.users_svcr.UnlinkAccounts, mc, request) request = users_pb2.UnlinkAccountsRequest( parent=common_pb2.UserRef(display_name='*****@*****.**'), child=common_pb2.UserRef(display_name='*****@*****.**')) with self.assertRaises(exceptions.NoSuchUserException): self.CallWrapped(self.users_svcr.UnlinkAccounts, mc, request) request = users_pb2.UnlinkAccountsRequest(parent=common_pb2.UserRef( display_name='*****@*****.**')) with self.assertRaises(exceptions.InputException): self.CallWrapped(self.users_svcr.UnlinkAccounts, mc, request) request = users_pb2.UnlinkAccountsRequest(child=common_pb2.UserRef( display_name='*****@*****.**')) with self.assertRaises(exceptions.InputException): self.CallWrapped(self.users_svcr.UnlinkAccounts, mc, request)
def testListHotlistsByUser_NoHotlists(self): """There are no hotlists.""" # No hotlists # Query for issues for '*****@*****.**' user_ref = common_pb2.UserRef(user_id=111) request = features_pb2.ListHotlistsByUserRequest(user=user_ref) # We're authenticated as '*****@*****.**' mc = monorailcontext.MonorailContext( self.services, cnxn=self.cnxn, requester='*****@*****.**') response = self.CallWrapped(self.features_svcr.ListHotlistsByUser, mc, request) self.assertEqual(0, len(response.hotlists))
def testRemoveIssuesFromHotlists(self): # Create two hotlists with issues 1 and 2. hotlist_1 = self.services.features.CreateHotlist( self.cnxn, 'Hotlist-1', 'Summary', 'Description', owner_ids=[111], editor_ids=[]) hotlist_2 = self.services.features.CreateHotlist( self.cnxn, 'Hotlist-2', 'Summary', 'Description', owner_ids=[111], editor_ids=[]) self.services.features.AddIssuesToHotlists( self.cnxn, [hotlist_1.hotlist_id, hotlist_2.hotlist_id], [(self.issue_1.issue_id, 111, 0, ''), (self.issue_2.issue_id, 111, 0, '')], None, None, None) # Remove Issue 1 from both hotlists. request = features_pb2.RemoveIssuesFromHotlistsRequest( hotlist_refs=[ common_pb2.HotlistRef( name='Hotlist-1', owner=common_pb2.UserRef(user_id=111)), common_pb2.HotlistRef( name='Hotlist-2', owner=common_pb2.UserRef(user_id=111))], issue_refs=[ common_pb2.IssueRef(project_name='proj', local_id=1)]) mc = monorailcontext.MonorailContext( self.services, cnxn=self.cnxn, requester='*****@*****.**') self.CallWrapped(self.features_svcr.RemoveIssuesFromHotlists, mc, request) # Only Issue 2 should remain in both lists. self.assertEqual( [self.issue_2.issue_id], [item.issue_id for item in hotlist_1.items]) self.assertEqual( [self.issue_2.issue_id], [item.issue_id for item in hotlist_2.items])
def testGetUser(self): """We can get a user by email address.""" user_ref = common_pb2.UserRef(display_name='*****@*****.**') request = users_pb2.GetUserRequest(user_ref=user_ref) mc = monorailcontext.MonorailContext(self.services, cnxn=self.cnxn, requester='*****@*****.**') response = self.CallWrapped(self.users_svcr.GetUser, mc, request) self.assertEqual(response.email, '*****@*****.**') self.assertEqual(response.user_id, 222) self.assertFalse(response.is_site_admin) self.user_2.is_site_admin = True response = self.CallWrapped(self.users_svcr.GetUser, mc, request) self.assertTrue(response.is_site_admin)
def testListHotlistsByUser_PrivateIssueNotSignedIn(self): # Private hostlist owned by '*****@*****.**' self.services.features.CreateHotlist( self.cnxn, 'Fake-Hotlist', 'Summary', 'Description', owner_ids=[111], editor_ids=[222], is_private=True) # Query for issues for '*****@*****.**' user_ref = common_pb2.UserRef(user_id=111) request = features_pb2.ListHotlistsByUserRequest(user=user_ref) # We're not authenticated mc = monorailcontext.MonorailContext(self.services, cnxn=self.cnxn) response = self.CallWrapped(self.features_svcr.ListHotlistsByUser, mc, request) self.assertEqual(0, len(response.hotlists))
def testListHotlistsByUser_Empty(self): """There are no hotlists for the given user.""" # Public hostlist owned by '*****@*****.**' self.services.features.CreateHotlist( self.cnxn, 'Fake-Hotlist', 'Summary', 'Description', owner_ids=[111], editor_ids=[222]) # Query for issues for '*****@*****.**' user_ref = common_pb2.UserRef(user_id=444) request = features_pb2.ListHotlistsByUserRequest(user=user_ref) # We're authenticated as '*****@*****.**' mc = monorailcontext.MonorailContext( self.services, cnxn=self.cnxn, requester='*****@*****.**') response = self.CallWrapped(self.features_svcr.ListHotlistsByUser, mc, request) self.assertEqual(0, len(response.hotlists))
def testUpdateHotlistIssueNote_NotAllowed(self): hotlist = self.services.features.CreateHotlist( self.cnxn, 'Hotlist-1', 'Summary', 'Description', owner_ids=[222], editor_ids=[]) self.services.features.AddIssuesToHotlists( self.cnxn, [hotlist.hotlist_id], [(self.issue_1.issue_id, 222, 0, '')], None, None, None) request = features_pb2.UpdateHotlistIssueNoteRequest( hotlist_ref=common_pb2.HotlistRef( name='Hotlist-1', owner=common_pb2.UserRef(user_id=222)), issue_ref=common_pb2.IssueRef( project_name='proj', local_id=1), note='Note') mc = monorailcontext.MonorailContext( self.services, cnxn=self.cnxn, requester='*****@*****.**') with self.assertRaises(permissions.PermissionException): self.CallWrapped(self.features_svcr.UpdateHotlistIssueNote, mc, request)
def testListHotlistsByUser_SearchByEmail(self): """We can get a list of hotlists for a given email.""" # Public hostlist owned by '*****@*****.**' self.services.features.CreateHotlist( self.cnxn, 'Fake-Hotlist', 'Summary', 'Description', owner_ids=[111], editor_ids=[222]) # Query for issues for '*****@*****.**' user_ref = common_pb2.UserRef(display_name='*****@*****.**') request = features_pb2.ListHotlistsByUserRequest(user=user_ref) # We're authenticated as '*****@*****.**' mc = monorailcontext.MonorailContext(self.services, cnxn=self.cnxn) response = self.CallWrapped(self.features_svcr.ListHotlistsByUser, mc, request) self.assertEqual(1, len(response.hotlists)) hotlist = response.hotlists[0] self.assertEqual(111, hotlist.owner_ref.user_id) self.assertEqual('*****@*****.**', hotlist.owner_ref.display_name) self.assertEqual('Fake-Hotlist', hotlist.name) self.assertEqual('Summary', hotlist.summary) self.assertEqual('Description', hotlist.description)
def testUpdateHotlistIssueNote(self): hotlist = self.services.features.CreateHotlist( self.cnxn, 'Hotlist-1', 'Summary', 'Description', owner_ids=[111], editor_ids=[]) self.services.features.AddIssuesToHotlists( self.cnxn, [hotlist.hotlist_id], [(self.issue_1.issue_id, 111, 0, '')], None, None, None) request = features_pb2.UpdateHotlistIssueNoteRequest( hotlist_ref=common_pb2.HotlistRef( name='Hotlist-1', owner=common_pb2.UserRef(user_id=111)), issue_ref=common_pb2.IssueRef( project_name='proj', local_id=1), note='Note') mc = monorailcontext.MonorailContext( self.services, cnxn=self.cnxn, requester='*****@*****.**') self.CallWrapped(self.features_svcr.UpdateHotlistIssueNote, mc, request) self.assertEqual('Note', hotlist.items[0].note)