| OLD | NEW | 
|---|
| (Empty) |  | 
|  | 1 # Copyright 2016 The Chromium Authors. All rights reserved. | 
|  | 2 # Use of this source code is govered by a BSD-style | 
|  | 3 # license that can be found in the LICENSE file or at | 
|  | 4 # https://developers.google.com/open-source/licenses/bsd | 
|  | 5 | 
|  | 6 """Unit tests for the sitewide_helpers module.""" | 
|  | 7 | 
|  | 8 import unittest | 
|  | 9 | 
|  | 10 from proto import project_pb2 | 
|  | 11 from services import service_manager | 
|  | 12 from sitewide import sitewide_helpers | 
|  | 13 from testing import fake | 
|  | 14 | 
|  | 15 | 
|  | 16 REGULAR_USER_ID = 111L | 
|  | 17 ADMIN_USER_ID = 222L | 
|  | 18 OTHER_USER_ID = 333L | 
|  | 19 | 
|  | 20 # Test project IDs | 
|  | 21 REGULAR_OWNER_LIVE = 1001 | 
|  | 22 REGULAR_OWNER_ARCHIVED = 1002 | 
|  | 23 REGULAR_OWNER_DELETABLE = 1003 | 
|  | 24 REGULAR_COMMITTER_LIVE = 2001 | 
|  | 25 REGULAR_COMMITTER_ARCHIVED = 2002 | 
|  | 26 REGULAR_COMMITTER_DELETABLE = 2003 | 
|  | 27 OTHER_OWNER_LIVE = 3001 | 
|  | 28 OTHER_OWNER_ARCHIVED = 3002 | 
|  | 29 OTHER_OWNER_DELETABLE = 3003 | 
|  | 30 OTHER_COMMITTER_LIVE = 4001 | 
|  | 31 MEMBERS_ONLY = 5001 | 
|  | 32 | 
|  | 33 | 
|  | 34 class HelperFunctionsTest(unittest.TestCase): | 
|  | 35 | 
|  | 36   def setUp(self): | 
|  | 37     self.services = service_manager.Services( | 
|  | 38         project=fake.ProjectService(), | 
|  | 39         user=fake.UserService(), | 
|  | 40         project_star=fake.ProjectStarService()) | 
|  | 41     self.cnxn = 'fake cnxn' | 
|  | 42 | 
|  | 43     for user_id in (ADMIN_USER_ID, REGULAR_USER_ID, OTHER_USER_ID): | 
|  | 44       self.services.user.TestAddUser('ignored_%s@gmail.com' % user_id, user_id) | 
|  | 45 | 
|  | 46     self.regular_owner_live = self.services.project.TestAddProject( | 
|  | 47         'regular-owner-live', state=project_pb2.ProjectState.LIVE, | 
|  | 48         owner_ids=[REGULAR_USER_ID], project_id=REGULAR_OWNER_LIVE) | 
|  | 49     self.regular_owner_archived = self.services.project.TestAddProject( | 
|  | 50         'regular-owner-archived', state=project_pb2.ProjectState.ARCHIVED, | 
|  | 51         owner_ids=[REGULAR_USER_ID], project_id=REGULAR_OWNER_ARCHIVED) | 
|  | 52     self.regular_owner_deletable = self.services.project.TestAddProject( | 
|  | 53         'regular-owner-deletable', state=project_pb2.ProjectState.DELETABLE, | 
|  | 54         owner_ids=[REGULAR_USER_ID], project_id=REGULAR_OWNER_DELETABLE) | 
|  | 55     self.regular_committer_live = self.services.project.TestAddProject( | 
|  | 56         'regular-committer-live', state=project_pb2.ProjectState.LIVE, | 
|  | 57         committer_ids=[REGULAR_USER_ID], project_id=REGULAR_COMMITTER_LIVE) | 
|  | 58     self.regular_committer_archived = self.services.project.TestAddProject( | 
|  | 59         'regular-committer-archived', state=project_pb2.ProjectState.ARCHIVED, | 
|  | 60         committer_ids=[REGULAR_USER_ID], project_id=REGULAR_COMMITTER_ARCHIVED) | 
|  | 61     self.regular_committer_deletable = self.services.project.TestAddProject( | 
|  | 62         'regular-committer-deletable', state=project_pb2.ProjectState.DELETABLE, | 
|  | 63         committer_ids=[REGULAR_USER_ID], project_id=REGULAR_COMMITTER_DELETABLE) | 
|  | 64     self.other_owner_live = self.services.project.TestAddProject( | 
|  | 65         'other-owner-live', state=project_pb2.ProjectState.LIVE, | 
|  | 66         owner_ids=[OTHER_USER_ID], project_id=OTHER_OWNER_LIVE) | 
|  | 67     self.other_owner_archived = self.services.project.TestAddProject( | 
|  | 68         'other-owner-archived', state=project_pb2.ProjectState.ARCHIVED, | 
|  | 69         owner_ids=[OTHER_USER_ID], project_id=OTHER_OWNER_ARCHIVED) | 
|  | 70     self.other_owner_deletable = self.services.project.TestAddProject( | 
|  | 71         'other-owner-deletable', state=project_pb2.ProjectState.DELETABLE, | 
|  | 72         owner_ids=[OTHER_USER_ID], project_id=OTHER_OWNER_DELETABLE) | 
|  | 73     self.other_committer_live = self.services.project.TestAddProject( | 
|  | 74         'other-committer-live', state=project_pb2.ProjectState.LIVE, | 
|  | 75         committer_ids=[OTHER_USER_ID], project_id=OTHER_COMMITTER_LIVE) | 
|  | 76 | 
|  | 77     self.regular_user = self.services.user.GetUser(self.cnxn, REGULAR_USER_ID) | 
|  | 78 | 
|  | 79     self.admin_user = self.services.user.TestAddUser( | 
|  | 80         'administrator@chromium.org', ADMIN_USER_ID) | 
|  | 81     self.admin_user.is_site_admin = True | 
|  | 82 | 
|  | 83     self.other_user = self.services.user.GetUser(self.cnxn, OTHER_USER_ID) | 
|  | 84 | 
|  | 85     self.members_only_project = self.services.project.TestAddProject( | 
|  | 86         'members-only', owner_ids=[REGULAR_USER_ID], project_id=MEMBERS_ONLY) | 
|  | 87     self.members_only_project.access = project_pb2.ProjectAccess.MEMBERS_ONLY | 
|  | 88 | 
|  | 89   def assertProjectsAnyOrder(self, actual_projects, *expected_projects): | 
|  | 90     # Check names rather than Project objects so that output is easier to read. | 
|  | 91     actual_names = [p.project_name for p in actual_projects] | 
|  | 92     expected_names = [p.project_name for p in expected_projects] | 
|  | 93     self.assertItemsEqual(expected_names, actual_names) | 
|  | 94 | 
|  | 95   def testFilterViewableProjects_CantViewArchived(self): | 
|  | 96     projects = list(sitewide_helpers.FilterViewableProjects( | 
|  | 97         self.services.project.test_projects.values(), | 
|  | 98         self.regular_user, {REGULAR_USER_ID})) | 
|  | 99     self.assertProjectsAnyOrder( | 
|  | 100         projects, self.regular_owner_live, self.regular_committer_live, | 
|  | 101         self.other_owner_live, self.other_committer_live, | 
|  | 102         self.members_only_project) | 
|  | 103 | 
|  | 104   def testFilterViewableProjects_NonMemberCantViewMembersOnly(self): | 
|  | 105     projects = list(sitewide_helpers.FilterViewableProjects( | 
|  | 106         self.services.project.test_projects.values(), | 
|  | 107         self.other_user, {OTHER_USER_ID})) | 
|  | 108     self.assertProjectsAnyOrder( | 
|  | 109         projects, self.regular_owner_live, self.regular_committer_live, | 
|  | 110         self.other_owner_live, self.other_committer_live) | 
|  | 111 | 
|  | 112   def testFilterViewableProjects_AdminCanViewAny(self): | 
|  | 113     projects = list(sitewide_helpers.FilterViewableProjects( | 
|  | 114         self.services.project.test_projects.values(), | 
|  | 115         self.admin_user, {ADMIN_USER_ID})) | 
|  | 116     self.assertProjectsAnyOrder( | 
|  | 117         projects, self.regular_owner_live, self.regular_committer_live, | 
|  | 118         self.other_owner_live, self.other_committer_live, | 
|  | 119         self.members_only_project) | 
|  | 120 | 
|  | 121   def testGetStarredProjects_OnlyViewableLiveStarred(self): | 
|  | 122     viewed_user_id = 123 | 
|  | 123     for p in self.services.project.test_projects.values(): | 
|  | 124       self.services.project_star.SetStar( | 
|  | 125           self.cnxn, p.project_id, viewed_user_id, True) | 
|  | 126 | 
|  | 127     self.assertProjectsAnyOrder( | 
|  | 128         sitewide_helpers.GetViewableStarredProjects( | 
|  | 129             self.cnxn, self.services, viewed_user_id, | 
|  | 130             {REGULAR_USER_ID}, self.regular_user), | 
|  | 131         self.regular_owner_live, self.regular_committer_live, | 
|  | 132         self.other_owner_live, self.other_committer_live, | 
|  | 133         self.members_only_project) | 
|  | 134 | 
|  | 135   def testGetStarredProjects_MembersOnly(self): | 
|  | 136     # Both users were able to star the project in the past.  The stars do not | 
|  | 137     # go away even if access to the project changes. | 
|  | 138     self.services.project_star.SetStar( | 
|  | 139         self.cnxn, self.members_only_project.project_id, REGULAR_USER_ID, True) | 
|  | 140     self.services.project_star.SetStar( | 
|  | 141         self.cnxn, self.members_only_project.project_id, OTHER_USER_ID, True) | 
|  | 142 | 
|  | 143     # But now, only one of them is currently a member, so only regular_user | 
|  | 144     # can see the starred project in the lists. | 
|  | 145     self.assertProjectsAnyOrder( | 
|  | 146         sitewide_helpers.GetViewableStarredProjects( | 
|  | 147             self.cnxn, self.services, REGULAR_USER_ID, {REGULAR_USER_ID}, | 
|  | 148             self.regular_user), | 
|  | 149         self.members_only_project) | 
|  | 150     self.assertProjectsAnyOrder( | 
|  | 151         sitewide_helpers.GetViewableStarredProjects( | 
|  | 152             self.cnxn, self.services, OTHER_USER_ID, {REGULAR_USER_ID}, | 
|  | 153             self.regular_user), | 
|  | 154         self.members_only_project) | 
|  | 155 | 
|  | 156     # The other user cannot see the project, so he does not see it in either | 
|  | 157     # list of starred projects. | 
|  | 158     self.assertProjectsAnyOrder( | 
|  | 159         sitewide_helpers.GetViewableStarredProjects( | 
|  | 160             self.cnxn, self.services, REGULAR_USER_ID, {OTHER_USER_ID}, | 
|  | 161             self.other_user))  # No expected projects listed. | 
|  | 162     self.assertProjectsAnyOrder( | 
|  | 163         sitewide_helpers.GetViewableStarredProjects( | 
|  | 164             self.cnxn, self.services, OTHER_USER_ID, {OTHER_USER_ID}, | 
|  | 165             self.other_user))  # No expected projects listed. | 
|  | 166 | 
|  | 167   def testGetUserProjects_OnlyLiveOfOtherUsers(self): | 
|  | 168     """Regular users should only see live projects of other users.""" | 
|  | 169     (owned, archived, membered, | 
|  | 170      _contrib) = sitewide_helpers.GetUserProjects( | 
|  | 171          self.cnxn, self.services, self.regular_user, {REGULAR_USER_ID}, | 
|  | 172          {OTHER_USER_ID}) | 
|  | 173     self.assertProjectsAnyOrder(owned, self.other_owner_live) | 
|  | 174     self.assertEqual([], archived) | 
|  | 175     self.assertProjectsAnyOrder(membered, self.other_committer_live) | 
|  | 176 | 
|  | 177   def testGetUserProjects_AdminSeesAll(self): | 
|  | 178     (owned, archived, membered, | 
|  | 179      _contrib) = sitewide_helpers.GetUserProjects( | 
|  | 180          self.cnxn, self.services, self.admin_user, {ADMIN_USER_ID}, | 
|  | 181          {OTHER_USER_ID}) | 
|  | 182     self.assertProjectsAnyOrder(owned, self.other_owner_live) | 
|  | 183     self.assertProjectsAnyOrder(archived, self.other_owner_archived) | 
|  | 184     self.assertProjectsAnyOrder(membered, self.other_committer_live) | 
|  | 185 | 
|  | 186   def testGetUserProjects_UserSeesOwnArchived(self): | 
|  | 187     (owned, archived, membered, | 
|  | 188      _contrib) = sitewide_helpers.GetUserProjects( | 
|  | 189          self.cnxn, self.services, self.regular_user, {REGULAR_USER_ID}, | 
|  | 190          {REGULAR_USER_ID}) | 
|  | 191     self.assertProjectsAnyOrder( | 
|  | 192         owned, self.regular_owner_live, self.members_only_project) | 
|  | 193     self.assertProjectsAnyOrder(archived, self.regular_owner_archived) | 
|  | 194     self.assertProjectsAnyOrder(membered, self.regular_committer_live) | 
|  | 195 | 
|  | 196   def testGetUserProjects_UserSeesGroupArchived(self): | 
|  | 197     # Now imagine that "regular user" is part of a user group, and the "other | 
|  | 198     # user" is the group.  Users and user groups are treated | 
|  | 199     # the same: there's no separate way to represent a user group. | 
|  | 200     (owned, archived, membered, | 
|  | 201      _contrib) = sitewide_helpers.GetUserProjects( | 
|  | 202          self.cnxn, self.services, self.regular_user, | 
|  | 203          {REGULAR_USER_ID, OTHER_USER_ID}, | 
|  | 204          {REGULAR_USER_ID, OTHER_USER_ID}) | 
|  | 205     self.assertProjectsAnyOrder( | 
|  | 206         owned, self.regular_owner_live, self.members_only_project, | 
|  | 207         self.other_owner_live) | 
|  | 208     self.assertProjectsAnyOrder( | 
|  | 209         archived, self.regular_owner_archived, self.other_owner_archived) | 
|  | 210     self.assertProjectsAnyOrder( | 
|  | 211         membered, self.regular_committer_live, self.other_committer_live) | 
|  | 212 | 
|  | 213 | 
|  | 214 class PickProjectsTest(unittest.TestCase): | 
|  | 215 | 
|  | 216   def setUp(self): | 
|  | 217     self.project_1 = project_pb2.Project() | 
|  | 218     self.project_2 = project_pb2.Project() | 
|  | 219     self.project_archived = project_pb2.Project() | 
|  | 220     self.project_archived.state = project_pb2.ProjectState.ARCHIVED | 
|  | 221 | 
|  | 222   def testPickProjects_NoneDesired(self): | 
|  | 223     wanted = [] | 
|  | 224     preloaded = {} | 
|  | 225     picked = sitewide_helpers._PickProjects(wanted, preloaded) | 
|  | 226     self.assertEqual([], picked) | 
|  | 227 | 
|  | 228   def testPickProjects_NoneAvailable(self): | 
|  | 229     wanted = [234] | 
|  | 230     preloaded = {} | 
|  | 231     picked = sitewide_helpers._PickProjects(wanted, preloaded) | 
|  | 232     self.assertEqual([], picked) | 
|  | 233 | 
|  | 234   def testPickProjects_Normal(self): | 
|  | 235     preloaded = {123: self.project_1, | 
|  | 236                  234: self.project_2, | 
|  | 237                  999: self.project_archived} | 
|  | 238 | 
|  | 239     # We get the only one we actually want. | 
|  | 240     wanted = [123] | 
|  | 241     picked = sitewide_helpers._PickProjects(wanted, preloaded) | 
|  | 242     self.assertEqual([self.project_1], picked) | 
|  | 243 | 
|  | 244     # Archived projects are normally not included. | 
|  | 245     wanted = [123, 999] | 
|  | 246     picked = sitewide_helpers._PickProjects(wanted, preloaded) | 
|  | 247     self.assertEqual([self.project_1], picked) | 
|  | 248 | 
|  | 249     # Just archived projects are returned if we ask for that. | 
|  | 250     picked = sitewide_helpers._PickProjects(wanted, preloaded, archived=True) | 
|  | 251     self.assertEqual([self.project_archived], picked) | 
|  | 252 | 
|  | 253     # Non-existent projects are ignored.  Projects might not exist if there | 
|  | 254     # is data corruption in our dev and staging instances. | 
|  | 255     wanted = [123, 999, 234] | 
|  | 256     picked = sitewide_helpers._PickProjects(wanted, preloaded) | 
|  | 257     self.assertEqual([self.project_1, self.project_2], picked) | 
|  | 258 | 
|  | 259 | 
|  | 260 if __name__ == '__main__': | 
|  | 261   unittest.main() | 
| OLD | NEW | 
|---|