| # Copyright 2016 The Chromium Authors |
| # Use of this source code is governed by a BSD-style license that can be |
| # found in the LICENSE file. |
| |
| """Unit tests for framework_views classes.""" |
| from __future__ import print_function |
| from __future__ import division |
| from __future__ import absolute_import |
| |
| import time |
| import unittest |
| |
| from framework import framework_constants |
| from framework import framework_views |
| from framework import monorailrequest |
| from mrproto import project_pb2 |
| from mrproto import tracker_pb2 |
| from mrproto import user_pb2 |
| import settings |
| from services import service_manager |
| from testing import fake |
| |
| |
| LONG_STR = 'VeryLongStringThatCertainlyWillNotFit' |
| LONG_PART_STR = 'OnePartThatWillNotFit-OneShort' |
| |
| |
| class LabelViewTest(unittest.TestCase): |
| |
| def testLabelView(self): |
| view = framework_views.LabelView('', None) |
| self.assertEqual('', view.name) |
| |
| view = framework_views.LabelView('Priority-High', None) |
| self.assertEqual('Priority-High', view.name) |
| self.assertIsNone(view.is_restrict) |
| self.assertEqual('', view.docstring) |
| self.assertEqual('Priority', view.prefix) |
| self.assertEqual('High', view.value) |
| |
| view = framework_views.LabelView('%s-%s' % (LONG_STR, LONG_STR), None) |
| self.assertEqual('%s-%s' % (LONG_STR, LONG_STR), view.name) |
| self.assertEqual('', view.docstring) |
| self.assertEqual(LONG_STR, view.prefix) |
| self.assertEqual(LONG_STR, view.value) |
| |
| view = framework_views.LabelView(LONG_PART_STR, None) |
| self.assertEqual(LONG_PART_STR, view.name) |
| self.assertEqual('', view.docstring) |
| self.assertEqual('OnePartThatWillNotFit', view.prefix) |
| self.assertEqual('OneShort', view.value) |
| |
| config = tracker_pb2.ProjectIssueConfig() |
| config.well_known_labels.append(tracker_pb2.LabelDef( |
| label='Priority-High', label_docstring='Must ship in this milestone')) |
| |
| view = framework_views.LabelView('Priority-High', config) |
| self.assertEqual('Must ship in this milestone', view.docstring) |
| |
| view = framework_views.LabelView('Priority-Foo', config) |
| self.assertEqual('', view.docstring) |
| |
| view = framework_views.LabelView('Restrict-View-Commit', None) |
| self.assertTrue(view.is_restrict) |
| |
| |
| class StatusViewTest(unittest.TestCase): |
| |
| def testStatusView(self): |
| view = framework_views.StatusView('', None) |
| self.assertEqual('', view.name) |
| |
| view = framework_views.StatusView('Accepted', None) |
| self.assertEqual('Accepted', view.name) |
| self.assertEqual('', view.docstring) |
| self.assertEqual('yes', view.means_open) |
| |
| view = framework_views.StatusView(LONG_STR, None) |
| self.assertEqual(LONG_STR, view.name) |
| self.assertEqual('', view.docstring) |
| self.assertEqual('yes', view.means_open) |
| |
| config = tracker_pb2.ProjectIssueConfig() |
| config.well_known_statuses.append(tracker_pb2.StatusDef( |
| status='SlamDunk', status_docstring='Code fixed and taught a lesson', |
| means_open=False)) |
| |
| view = framework_views.StatusView('SlamDunk', config) |
| self.assertEqual('Code fixed and taught a lesson', view.docstring) |
| self.assertFalse(view.means_open) |
| |
| view = framework_views.StatusView('SlammedBack', config) |
| self.assertEqual('', view.docstring) |
| |
| |
| class UserViewTest(unittest.TestCase): |
| |
| def setUp(self): |
| self.user = user_pb2.User(user_id=111) |
| |
| def testGetAvailablity_Anon(self): |
| self.user.user_id = 0 |
| user_view = framework_views.UserView(self.user) |
| self.assertEqual(None, user_view.avail_message) |
| self.assertEqual(None, user_view.avail_state) |
| |
| def testGetAvailablity_Banned(self): |
| self.user.banned = 'spamming' |
| user_view = framework_views.UserView(self.user) |
| self.assertEqual('Banned', user_view.avail_message) |
| self.assertEqual('banned', user_view.avail_state) |
| |
| def testGetAvailablity_Vacation(self): |
| self.user.vacation_message = 'gone fishing' |
| user_view = framework_views.UserView(self.user) |
| self.assertEqual('gone fishing', user_view.avail_message) |
| self.assertEqual('none', user_view.avail_state) |
| |
| self.user.vacation_message = ( |
| 'Gone fishing as really long time with lots of friends and reading ' |
| 'a long novel by a famous author. I wont have internet access but ' |
| 'If you urgently need anything you can call Alice or Bob for most ' |
| 'things otherwise call Charlie. Wish me luck! ') |
| user_view = framework_views.UserView(self.user) |
| self.assertTrue(len(user_view.avail_message) >= 50) |
| self.assertTrue(len(user_view.avail_message_short) < 50) |
| self.assertEqual('none', user_view.avail_state) |
| |
| def testGetAvailablity_Bouncing(self): |
| self.user.email_bounce_timestamp = 1234567890 |
| user_view = framework_views.UserView(self.user) |
| self.assertEqual('Email to this user bounced', user_view.avail_message) |
| self.assertEqual(user_view.avail_message_short, user_view.avail_message) |
| self.assertEqual('none', user_view.avail_state) |
| |
| def testGetAvailablity_Groups(self): |
| user_view = framework_views.UserView(self.user, is_group=True) |
| self.assertEqual(None, user_view.avail_message) |
| self.assertEqual(None, user_view.avail_state) |
| |
| self.user.email = 'likely-user-group@example.com' |
| user_view = framework_views.UserView(self.user) |
| self.assertEqual(None, user_view.avail_message) |
| self.assertEqual(None, user_view.avail_state) |
| |
| def testGetAvailablity_NeverVisitied(self): |
| self.user.last_visit_timestamp = 0 |
| user_view = framework_views.UserView(self.user) |
| self.assertEqual('User never visited', user_view.avail_message) |
| self.assertEqual('never', user_view.avail_state) |
| |
| def testGetAvailablity_NotRecent(self): |
| now = int(time.time()) |
| self.user.last_visit_timestamp = now - 20 * framework_constants.SECS_PER_DAY |
| user_view = framework_views.UserView(self.user) |
| self.assertEqual('Last visit 20 days ago', user_view.avail_message) |
| self.assertEqual('unsure', user_view.avail_state) |
| |
| def testGetAvailablity_ReallyLongTime(self): |
| now = int(time.time()) |
| self.user.last_visit_timestamp = now - 99 * framework_constants.SECS_PER_DAY |
| user_view = framework_views.UserView(self.user) |
| self.assertEqual('Last visit > 30 days ago', user_view.avail_message) |
| self.assertEqual('none', user_view.avail_state) |
| |
| def testDeletedUser(self): |
| deleted_user = user_pb2.User(user_id=1) |
| user_view = framework_views.UserView(deleted_user) |
| self.assertEqual( |
| user_view.display_name, framework_constants.DELETED_USER_NAME) |
| self.assertEqual(user_view.email, '') |
| self.assertEqual(user_view.obscure_email, '') |
| self.assertEqual(user_view.profile_url, '') |
| |
| class RevealEmailsToMembersTest(unittest.TestCase): |
| |
| def setUp(self): |
| self.cnxn = fake.MonorailConnection() |
| self.services = service_manager.Services( |
| project=fake.ProjectService(), |
| user=fake.UserService(), |
| usergroup=fake.UserGroupService()) |
| self.mr = monorailrequest.MonorailRequest(None) |
| self.mr.project = self.services.project.TestAddProject( |
| 'proj', |
| project_id=789, |
| owner_ids=[111], |
| committer_ids=[222], |
| contrib_ids=[333, 888]) |
| user = self.services.user.TestAddUser('test@example.com', 1000) |
| self.mr.auth.user_pb = user |
| |
| def CheckRevealAllToMember( |
| self, logged_in_user_id, expected, viewed_user_id=333, group_id=None): |
| user_view = framework_views.StuffUserView( |
| viewed_user_id, 'user@example.com', True) |
| |
| if group_id: |
| pass # xxx re-implement groups |
| |
| users_by_id = {333: user_view} |
| self.mr.auth.user_id = logged_in_user_id |
| self.mr.auth.effective_ids = {logged_in_user_id} |
| # Assert display name is obscured before the reveal. |
| self.assertEqual('u...@example.com', user_view.display_name) |
| # Assert profile url contains user ID before the reveal. |
| self.assertEqual('/u/%s/' % viewed_user_id, user_view.profile_url) |
| framework_views.RevealAllEmailsToMembers( |
| self.cnxn, self.services, self.mr.auth, users_by_id) |
| self.assertEqual(expected, not user_view.obscure_email) |
| if expected: |
| # Assert display name is now revealed. |
| self.assertEqual('user@example.com', user_view.display_name) |
| # Assert profile url contains the email. |
| self.assertEqual('/u/user@example.com/', user_view.profile_url) |
| else: |
| # Assert display name is still hidden. |
| self.assertEqual('u...@example.com', user_view.display_name) |
| # Assert profile url still contains user ID. |
| self.assertEqual('/u/%s/' % viewed_user_id, user_view.profile_url) |
| |
| # TODO(https://crbug.com/monorail/8192): Remove this method and related test. |
| def DeprecatedCheckRevealAllToMember( |
| self, logged_in_user_id, expected, viewed_user_id=333, group_id=None): |
| user_view = framework_views.StuffUserView( |
| viewed_user_id, 'user@example.com', True) |
| |
| if group_id: |
| pass # xxx re-implement groups |
| |
| users_by_id = {333: user_view} |
| self.mr.auth.user_id = logged_in_user_id |
| self.mr.auth.effective_ids = {logged_in_user_id} |
| # Assert display name is obscured before the reveal. |
| self.assertEqual('u...@example.com', user_view.display_name) |
| # Assert profile url contains user ID before the reveal. |
| self.assertEqual('/u/%s/' % viewed_user_id, user_view.profile_url) |
| framework_views.RevealAllEmailsToMembers( |
| self.cnxn, self.services, self.mr.auth, users_by_id, self.mr.project) |
| self.assertEqual(expected, not user_view.obscure_email) |
| if expected: |
| # Assert display name is now revealed. |
| self.assertEqual('user@example.com', user_view.display_name) |
| # Assert profile url contains the email. |
| self.assertEqual('/u/user@example.com/', user_view.profile_url) |
| else: |
| # Assert display name is still hidden. |
| self.assertEqual('u...@example.com', user_view.display_name) |
| # Assert profile url still contains user ID. |
| self.assertEqual('/u/%s/' % viewed_user_id, user_view.profile_url) |
| |
| def testDontRevealEmailsToPriviledgedDomain(self): |
| """We no longer give this advantage based on email address domain.""" |
| for priviledged_user_domain in settings.priviledged_user_domains: |
| self.mr.auth.user_pb.email = 'test@' + priviledged_user_domain |
| self.CheckRevealAllToMember(100001, False) |
| |
| def testRevealEmailToSelf(self): |
| logged_in_user = self.services.user.TestAddUser('user@example.com', 333) |
| self.mr.auth.user_pb = logged_in_user |
| self.CheckRevealAllToMember(333, True) |
| |
| def testRevealAllEmailsToMembers_Collaborators(self): |
| self.CheckRevealAllToMember(0, False) |
| self.CheckRevealAllToMember(111, True) |
| self.CheckRevealAllToMember(222, True) |
| self.CheckRevealAllToMember(333, True) |
| self.CheckRevealAllToMember(444, False) |
| |
| # Viewed user has indirect role in the project via a group. |
| self.CheckRevealAllToMember(0, False, group_id=888) |
| self.CheckRevealAllToMember(111, True, group_id=888) |
| # xxx re-implement |
| # self.CheckRevealAllToMember( |
| # 111, True, viewed_user_id=444, group_id=888) |
| |
| # Logged in user has indirect role in the project via a group. |
| self.CheckRevealAllToMember(888, True) |
| |
| def testDeprecatedRevealAllEmailsToMembers_Collaborators(self): |
| self.DeprecatedCheckRevealAllToMember(0, False) |
| self.DeprecatedCheckRevealAllToMember(111, True) |
| self.DeprecatedCheckRevealAllToMember(222, True) |
| self.DeprecatedCheckRevealAllToMember(333, True) |
| self.DeprecatedCheckRevealAllToMember(444, False) |
| |
| # Viewed user has indirect role in the project via a group. |
| self.DeprecatedCheckRevealAllToMember(0, False, group_id=888) |
| self.DeprecatedCheckRevealAllToMember(111, True, group_id=888) |
| |
| # Logged in user has indirect role in the project via a group. |
| self.DeprecatedCheckRevealAllToMember(888, True) |
| |
| def testRevealAllEmailsToMembers_Admins(self): |
| self.CheckRevealAllToMember(555, False) |
| self.mr.auth.user_pb.is_site_admin = True |
| self.CheckRevealAllToMember(555, True) |
| |
| |
| class RevealAllEmailsTest(unittest.TestCase): |
| |
| def testRevealAllEmail(self): |
| users_by_id = { |
| 111: framework_views.StuffUserView(111, 'a@a.com', True), |
| 222: framework_views.StuffUserView(222, 'b@b.com', True), |
| 333: framework_views.StuffUserView(333, 'c@c.com', True), |
| 999: framework_views.StuffUserView(999, 'z@z.com', True), |
| } |
| # Assert display names are obscured before the reveal. |
| self.assertEqual('a...@a.com', users_by_id[111].display_name) |
| self.assertEqual('b...@b.com', users_by_id[222].display_name) |
| self.assertEqual('c...@c.com', users_by_id[333].display_name) |
| self.assertEqual('z...@z.com', users_by_id[999].display_name) |
| |
| framework_views.RevealAllEmails(users_by_id) |
| |
| self.assertFalse(users_by_id[111].obscure_email) |
| self.assertFalse(users_by_id[222].obscure_email) |
| self.assertFalse(users_by_id[333].obscure_email) |
| self.assertFalse(users_by_id[999].obscure_email) |
| # Assert display names are now revealed. |
| self.assertEqual('a@a.com', users_by_id[111].display_name) |
| self.assertEqual('b@b.com', users_by_id[222].display_name) |
| self.assertEqual('c@c.com', users_by_id[333].display_name) |
| self.assertEqual('z@z.com', users_by_id[999].display_name) |