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 """Unittest for the people detail page.""" |
| 7 |
| 8 import logging |
| 9 |
| 10 import unittest |
| 11 |
| 12 import webapp2 |
| 13 |
| 14 from framework import monorailrequest |
| 15 from framework import permissions |
| 16 from project import peopledetail |
| 17 from proto import project_pb2 |
| 18 from services import service_manager |
| 19 from testing import fake |
| 20 from testing import testing_helpers |
| 21 |
| 22 |
| 23 class PeopleDetailTest(unittest.TestCase): |
| 24 |
| 25 def setUp(self): |
| 26 services = service_manager.Services( |
| 27 project=fake.ProjectService(), |
| 28 user=fake.UserService()) |
| 29 services.user.TestAddUser('jrobbins', 111L) |
| 30 services.user.TestAddUser('jrobbins@jrobbins.org', 333L) |
| 31 services.user.TestAddUser('jrobbins@chromium.org', 555L) |
| 32 services.user.TestAddUser('imso31337@gmail.com', 999L) |
| 33 self.project = services.project.TestAddProject('proj') |
| 34 self.project.owner_ids.extend([111L, 222L]) |
| 35 self.project.committer_ids.extend([333L, 444L]) |
| 36 self.project.contributor_ids.extend([555L]) |
| 37 self.servlet = peopledetail.PeopleDetail('req', 'res', services=services) |
| 38 |
| 39 def VerifyAccess(self, exception_expected): |
| 40 mr = testing_helpers.MakeMonorailRequest( |
| 41 path='/p/proj/people/detail?u=111', |
| 42 project=self.project, |
| 43 perms=permissions.OWNER_ACTIVE_PERMISSIONSET) |
| 44 self.servlet.AssertBasePermission(mr) |
| 45 # Owner never raises PermissionException. |
| 46 |
| 47 mr = testing_helpers.MakeMonorailRequest( |
| 48 path='/p/proj/people/detail?u=333', |
| 49 project=self.project, |
| 50 perms=permissions.COMMITTER_ACTIVE_PERMISSIONSET) |
| 51 self.servlet.AssertBasePermission(mr) |
| 52 # Committer never raises PermissionException. |
| 53 |
| 54 mr = testing_helpers.MakeMonorailRequest( |
| 55 path='/p/proj/people/detail?u=555', |
| 56 project=self.project, |
| 57 perms=permissions.CONTRIBUTOR_ACTIVE_PERMISSIONSET) |
| 58 if exception_expected: |
| 59 self.assertRaises(permissions.PermissionException, |
| 60 self.servlet.AssertBasePermission, mr) |
| 61 else: |
| 62 self.servlet.AssertBasePermission(mr) |
| 63 # No PermissionException raised |
| 64 |
| 65 # Sign-out users |
| 66 mr = testing_helpers.MakeMonorailRequest( |
| 67 path='/p/proj/people/detail?u=555', |
| 68 project=self.project, |
| 69 perms=permissions.READ_ONLY_PERMISSIONSET) |
| 70 if exception_expected: |
| 71 self.assertRaises(permissions.PermissionException, |
| 72 self.servlet.AssertBasePermission, mr) |
| 73 else: |
| 74 self.servlet.AssertBasePermission(mr) |
| 75 |
| 76 # Non-membr users |
| 77 mr = testing_helpers.MakeMonorailRequest( |
| 78 path='/p/proj/people/detail?u=555', |
| 79 project=self.project, |
| 80 perms=permissions.USER_PERMISSIONSET) |
| 81 if exception_expected: |
| 82 self.assertRaises(permissions.PermissionException, |
| 83 self.servlet.AssertBasePermission, mr) |
| 84 else: |
| 85 self.servlet.AssertBasePermission(mr) |
| 86 |
| 87 def testAssertBasePermission_Normal(self): |
| 88 self.VerifyAccess(False) |
| 89 |
| 90 def testAssertBasePermission_HubSpoke(self): |
| 91 self.project.only_owners_see_contributors = True |
| 92 self.VerifyAccess(True) |
| 93 |
| 94 def testAssertBasePermission_HubSpokeViewingSelf(self): |
| 95 self.project.only_owners_see_contributors = True |
| 96 mr = testing_helpers.MakeMonorailRequest( |
| 97 path='/p/proj/people/detail?u=333', |
| 98 project=self.project, |
| 99 perms=permissions.COMMITTER_ACTIVE_PERMISSIONSET) |
| 100 mr.auth.user_id = 333L |
| 101 self.servlet.AssertBasePermission(mr) |
| 102 # No PermissionException raised |
| 103 |
| 104 def testGatherPageData(self): |
| 105 mr = testing_helpers.MakeMonorailRequest( |
| 106 path='/p/proj/people/detail?u=111', |
| 107 project=self.project, |
| 108 perms=permissions.OWNER_ACTIVE_PERMISSIONSET) |
| 109 mr.auth = monorailrequest.AuthData() |
| 110 page_data = self.servlet.GatherPageData(mr) |
| 111 self.assertFalse(page_data['warn_abandonment']) |
| 112 self.assertEquals(2, page_data['total_num_owners']) |
| 113 # TODO(jrobbins): fill in tests for all other aspects. |
| 114 |
| 115 def testValidateMemberID(self): |
| 116 # We can validate owners |
| 117 self.assertEquals( |
| 118 111L, |
| 119 self.servlet.ValidateMemberID('fake cnxn', 111, self.project)) |
| 120 |
| 121 # We can parse members |
| 122 self.assertEquals( |
| 123 333L, |
| 124 self.servlet.ValidateMemberID( |
| 125 'fake cnxn', 333, self.project)) |
| 126 |
| 127 # 404 for user that does not exist |
| 128 try: |
| 129 self.servlet.ValidateMemberID('fake cnxn', 8933, self.project) |
| 130 self.fail() |
| 131 except webapp2.HTTPException as e: |
| 132 self.assertEquals(404, e.code) |
| 133 |
| 134 # 404 for valid user that is not in this project |
| 135 try: |
| 136 self.servlet.ValidateMemberID('fake cnxn', 999, self.project) |
| 137 self.fail() |
| 138 except webapp2.HTTPException as e: |
| 139 self.assertEquals(404, e.code) |
| 140 |
| 141 def testParsePersonData_BadPost(self): |
| 142 mr = testing_helpers.MakeMonorailRequest( |
| 143 path='/p/proj/people/detail', |
| 144 project=self.project) |
| 145 post_data = fake.PostData() |
| 146 try: |
| 147 _result = self.servlet.ParsePersonData(mr, post_data) |
| 148 self.fail() |
| 149 except monorailrequest.InputException: |
| 150 pass |
| 151 |
| 152 mr = testing_helpers.MakeMonorailRequest( |
| 153 path='/p/proj/people/detail?u=', |
| 154 project=self.project) |
| 155 post_data = fake.PostData() |
| 156 try: |
| 157 _result = self.servlet.ParsePersonData(mr, post_data) |
| 158 self.fail() |
| 159 except monorailrequest.InputException: |
| 160 pass |
| 161 |
| 162 def testParsePersonData_NoDetails(self): |
| 163 mr = testing_helpers.MakeMonorailRequest( |
| 164 path='/p/proj/people/detail?u=111', |
| 165 project=self.project) |
| 166 post_data = fake.PostData(role=['owner']) |
| 167 u, r, ac, n = self.servlet.ParsePersonData(mr, post_data) |
| 168 self.assertEquals(111, u) |
| 169 self.assertEquals('owner', r) |
| 170 self.assertEquals([], ac) |
| 171 self.assertEquals('', n) |
| 172 |
| 173 mr = testing_helpers.MakeMonorailRequest( |
| 174 path='/p/proj/people/detail?u=333', |
| 175 project=self.project) |
| 176 post_data = fake.PostData(role=['owner']) |
| 177 u, r, ac, n = self.servlet.ParsePersonData(mr, post_data) |
| 178 self.assertEquals(333, u) |
| 179 |
| 180 def testParsePersonData(self): |
| 181 mr = testing_helpers.MakeMonorailRequest( |
| 182 path='/p/proj/people/detail?u=111', |
| 183 project=self.project) |
| 184 post_data = fake.PostData( |
| 185 role=['owner'], extra_perms=['ViewQuota', 'EditIssue']) |
| 186 u, r, ac, n = self.servlet.ParsePersonData(mr, post_data) |
| 187 self.assertEquals(111, u) |
| 188 self.assertEquals('owner', r) |
| 189 self.assertEquals(['ViewQuota', 'EditIssue'], ac) |
| 190 self.assertEquals('', n) |
| 191 |
| 192 post_data = fake.PostData({ |
| 193 'role': ['owner'], |
| 194 'extra_perms': [' ', ' \t'], |
| 195 'notes': [''], |
| 196 }) |
| 197 u, r, ac, n = self.servlet.ParsePersonData(mr, post_data) |
| 198 self.assertEquals(111, u) |
| 199 self.assertEquals('owner', r) |
| 200 self.assertEquals([], ac) |
| 201 self.assertEquals('', n) |
| 202 |
| 203 post_data = fake.PostData({ |
| 204 'username': ['jrobbins'], |
| 205 'role': ['owner'], |
| 206 'extra_perms': ['_ViewQuota', ' __EditIssue'], |
| 207 'notes': [' Our local Python expert '], |
| 208 }) |
| 209 u, r, ac, n = self.servlet.ParsePersonData(mr, post_data) |
| 210 self.assertEquals(111, u) |
| 211 self.assertEquals('owner', r) |
| 212 self.assertEquals(['ViewQuota', 'EditIssue'], ac) |
| 213 self.assertEquals('Our local Python expert', n) |
| 214 |
| 215 def testCanEditMemberNotes(self): |
| 216 """Only owners can edit member notes.""" |
| 217 mr = testing_helpers.MakeMonorailRequest( |
| 218 path='/p/proj/people/detail?u=111', |
| 219 project=self.project, |
| 220 perms=permissions.CONTRIBUTOR_ACTIVE_PERMISSIONSET) |
| 221 result = self.servlet.CanEditMemberNotes(mr, 222) |
| 222 self.assertFalse(result) |
| 223 |
| 224 mr.auth.user_id = 222 |
| 225 result = self.servlet.CanEditMemberNotes(mr, 222) |
| 226 self.assertTrue(result) |
| 227 |
| 228 mr = testing_helpers.MakeMonorailRequest( |
| 229 path='/p/proj/people/detail?u=111', |
| 230 project=self.project, |
| 231 perms=permissions.OWNER_ACTIVE_PERMISSIONSET) |
| 232 result = self.servlet.CanEditMemberNotes(mr, 222) |
| 233 self.assertTrue(result) |
| 234 |
| 235 def testCanEditPerms(self): |
| 236 """Only owners can edit member perms.""" |
| 237 mr = testing_helpers.MakeMonorailRequest( |
| 238 path='/p/proj/people/detail?u=111', |
| 239 project=self.project, |
| 240 perms=permissions.CONTRIBUTOR_ACTIVE_PERMISSIONSET) |
| 241 result = self.servlet.CanEditPerms(mr) |
| 242 self.assertFalse(result) |
| 243 |
| 244 mr = testing_helpers.MakeMonorailRequest( |
| 245 path='/p/proj/people/detail?u=111', |
| 246 project=self.project, |
| 247 perms=permissions.OWNER_ACTIVE_PERMISSIONSET) |
| 248 result = self.servlet.CanEditPerms(mr) |
| 249 self.assertTrue(result) |
| 250 |
| 251 def testCanRemoveRole(self): |
| 252 """Owners can remove members. Users could also remove themselves.""" |
| 253 mr = testing_helpers.MakeMonorailRequest( |
| 254 path='/p/proj/people/detail?u=111', |
| 255 project=self.project, |
| 256 perms=permissions.CONTRIBUTOR_ACTIVE_PERMISSIONSET) |
| 257 result = self.servlet.CanRemoveRole(mr, 222) |
| 258 self.assertFalse(result) |
| 259 |
| 260 mr.auth.user_id = 111 |
| 261 result = self.servlet.CanRemoveRole(mr, 111) |
| 262 self.assertTrue(result) |
| 263 |
| 264 mr = testing_helpers.MakeMonorailRequest( |
| 265 path='/p/proj/people/detail?u=111', |
| 266 project=self.project, |
| 267 perms=permissions.OWNER_ACTIVE_PERMISSIONSET) |
| 268 result = self.servlet.CanRemoveRole(mr, 222) |
| 269 self.assertTrue(result) |
| 270 |
| 271 |
| 272 if __name__ == '__main__': |
| 273 unittest.main() |
OLD | NEW |