blob: 131ebb545254a83147d7d6a06ef1b6b29f15e0a3 [file] [log] [blame]
# Copyright 2016 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style
# license that can be found in the LICENSE file or at
# https://developers.google.com/open-source/licenses/bsd
"""Tests for monorail.framework.framework_bizobj."""
from __future__ import print_function
from __future__ import division
from __future__ import absolute_import
import unittest
import mock
import settings
from framework import authdata
from framework import framework_bizobj
from framework import framework_constants
from proto import project_pb2
from proto import tracker_pb2
from proto import user_pb2
from services import service_manager
from services import client_config_svc
from testing import fake
from testing import testing_helpers
from tracker import tracker_bizobj
class CreateUserDisplayNamesAndEmailsTest(unittest.TestCase):
def setUp(self):
self.cnxn = fake.MonorailConnection()
self.services = service_manager.Services(
project=fake.ProjectService(),
user=fake.UserService(),
usergroup=fake.UserGroupService())
self.user_1 = self.services.user.TestAddUser(
'user_1@test.com', 111, obscure_email=True)
self.user_2 = self.services.user.TestAddUser(
'user_2@test.com', 222, obscure_email=False)
self.user_3 = self.services.user.TestAddUser(
'user_3@test.com', 333, obscure_email=True)
self.user_4 = self.services.user.TestAddUser(
'user_4@test.com', 444, obscure_email=False)
self.service_account = self.services.user.TestAddUser(
'service@account.com', 999, obscure_email=True)
self.user_deleted = self.services.user.TestAddUser(
'', framework_constants.DELETED_USER_ID)
self.requester = self.services.user.TestAddUser('user_5@test.com', 555)
self.user_auth = authdata.AuthData(
user_id=self.requester.user_id, email=self.requester.email)
self.project = self.services.project.TestAddProject(
'proj',
project_id=789,
owner_ids=[self.user_1.user_id],
committer_ids=[self.user_2.user_id, self.service_account.user_id])
@mock.patch('services.client_config_svc.GetServiceAccountMap')
def testUserCreateDisplayNamesAndEmails_NonProjectMembers(
self, fake_account_map):
fake_account_map.return_value = {'service@account.com': 'Service'}
users = [self.user_1, self.user_2, self.user_3, self.user_4,
self.service_account, self.user_deleted]
(display_names_by_id,
display_emails_by_id) = framework_bizobj.CreateUserDisplayNamesAndEmails(
self.cnxn, self.services, self.user_auth, users)
expected_display_names = {
self.user_1.user_id: testing_helpers.ObscuredEmail(self.user_1.email),
self.user_2.user_id: self.user_2.email,
self.user_3.user_id: testing_helpers.ObscuredEmail(self.user_3.email),
self.user_4.user_id: self.user_4.email,
self.service_account.user_id: 'Service',
self.user_deleted.user_id: framework_constants.DELETED_USER_NAME}
expected_display_emails = {
self.user_1.user_id:
testing_helpers.ObscuredEmail(self.user_1.email),
self.user_2.user_id:
self.user_2.email,
self.user_3.user_id:
testing_helpers.ObscuredEmail(self.user_3.email),
self.user_4.user_id:
self.user_4.email,
self.service_account.user_id:
testing_helpers.ObscuredEmail(self.service_account.email),
self.user_deleted.user_id: '',
}
self.assertEqual(display_names_by_id, expected_display_names)
self.assertEqual(display_emails_by_id, expected_display_emails)
@mock.patch('services.client_config_svc.GetServiceAccountMap')
def testUserCreateDisplayNamesAndEmails_ProjectMember(self, fake_account_map):
fake_account_map.return_value = {'service@account.com': 'Service'}
users = [self.user_1, self.user_2, self.user_3, self.user_4,
self.service_account, self.user_deleted]
self.project.committer_ids.append(self.requester.user_id)
(display_names_by_id,
display_emails_by_id) = framework_bizobj.CreateUserDisplayNamesAndEmails(
self.cnxn, self.services, self.user_auth, users)
expected_display_names = {
self.user_1.user_id: self.user_1.email, # Project member
self.user_2.user_id: self.user_2.email, # Project member and unobscured
self.user_3.user_id: testing_helpers.ObscuredEmail(self.user_3.email),
self.user_4.user_id: self.user_4.email, # Unobscured email
self.service_account.user_id: 'Service',
self.user_deleted.user_id: framework_constants.DELETED_USER_NAME
}
expected_display_emails = {
self.user_1.user_id: self.user_1.email, # Project member
self.user_2.user_id: self.user_2.email, # Project member and unobscured
self.user_3.user_id: testing_helpers.ObscuredEmail(self.user_3.email),
self.user_4.user_id: self.user_4.email, # Unobscured email
self.service_account.user_id: self.service_account.email,
self.user_deleted.user_id: ''
}
self.assertEqual(display_names_by_id, expected_display_names)
self.assertEqual(display_emails_by_id, expected_display_emails)
@mock.patch('services.client_config_svc.GetServiceAccountMap')
def testUserCreateDisplayNamesAndEmails_Admin(self, fake_account_map):
fake_account_map.return_value = {'service@account.com': 'Service'}
users = [self.user_1, self.user_2, self.user_3, self.user_4,
self.service_account, self.user_deleted]
self.user_auth.user_pb.is_site_admin = True
(display_names_by_id,
display_emails_by_id) = framework_bizobj.CreateUserDisplayNamesAndEmails(
self.cnxn, self.services, self.user_auth, users)
expected_display_names = {
self.user_1.user_id: self.user_1.email,
self.user_2.user_id: self.user_2.email,
self.user_3.user_id: self.user_3.email,
self.user_4.user_id: self.user_4.email,
self.service_account.user_id: 'Service',
self.user_deleted.user_id: framework_constants.DELETED_USER_NAME}
expected_display_emails = {
self.user_1.user_id: self.user_1.email,
self.user_2.user_id: self.user_2.email,
self.user_3.user_id: self.user_3.email,
self.user_4.user_id: self.user_4.email,
self.service_account.user_id: self.service_account.email,
self.user_deleted.user_id: ''
}
self.assertEqual(display_names_by_id, expected_display_names)
self.assertEqual(display_emails_by_id, expected_display_emails)
class ParseAndObscureAddressTest(unittest.TestCase):
def testParseAndObscureAddress(self):
email = 'sir.chicken@farm.test'
(username, user_domain, obscured_username,
obscured_email) = framework_bizobj.ParseAndObscureAddress(email)
self.assertEqual(username, 'sir.chicken')
self.assertEqual(user_domain, 'farm.test')
self.assertEqual(obscured_username, 'sir.c')
self.assertEqual(obscured_email, 'sir.c...@farm.test')
class FilterViewableEmailsTest(unittest.TestCase):
def setUp(self):
self.cnxn = fake.MonorailConnection()
self.services = service_manager.Services(
project=fake.ProjectService(),
user=fake.UserService(),
usergroup=fake.UserGroupService())
self.user_1 = self.services.user.TestAddUser(
'user_1@test.com', 111, obscure_email=True)
self.user_2 = self.services.user.TestAddUser(
'user_2@test.com', 222, obscure_email=False)
self.requester = self.services.user.TestAddUser(
'user_5@test.com', 555, obscure_email=True)
self.user_auth = authdata.AuthData(
user_id=self.requester.user_id, email=self.requester.email)
self.user_auth.user_pb.email = self.user_auth.email
self.project = self.services.project.TestAddProject(
'proj', project_id=789, owner_ids=[111], committer_ids=[222])
def testFilterViewableEmail_Anon(self):
anon = authdata.AuthData()
other_users = [self.user_1, self.user_2]
filtered_users = framework_bizobj.FilterViewableEmails(
self.cnxn, self.services, anon, other_users)
self.assertEqual(filtered_users, [])
def testFilterViewableEmail_Self(self):
filtered_users = framework_bizobj.FilterViewableEmails(
self.cnxn, self.services, self.user_auth, [self.user_auth.user_pb])
self.assertEqual(filtered_users, [self.user_auth.user_pb])
def testFilterViewableEmail_SiteAdmin(self):
self.user_auth.user_pb.is_site_admin = True
other_users = [self.user_1, self.user_2]
filtered_users = framework_bizobj.FilterViewableEmails(
self.cnxn, self.services, self.user_auth, other_users)
self.assertEqual(filtered_users, other_users)
def testFilterViewableEmail_InDisplayNameGroup(self):
display_name_group_id = 666
self.services.usergroup.TestAddGroupSettings(
display_name_group_id, 'display-perm-perm@email.com')
settings.full_emails_perm_groups = ['display-perm-perm@email.com']
self.user_auth.effective_ids.add(display_name_group_id)
other_users = [self.user_1, self.user_2]
filtered_users = framework_bizobj.FilterViewableEmails(
self.cnxn, self.services, self.user_auth, other_users)
self.assertEqual(filtered_users, other_users)
def testFilterViewableEmail_NonMember(self):
other_users = [self.user_1, self.user_2]
filtered_users = framework_bizobj.FilterViewableEmails(
self.cnxn, self.services, self.user_auth, other_users)
self.assertEqual(filtered_users, [])
def testFilterViewableEmail_ProjectMember(self):
self.project.committer_ids.append(self.requester.user_id)
other_users = [self.user_1, self.user_2]
filtered_users = framework_bizobj.FilterViewableEmails(
self.cnxn, self.services, self.user_auth, other_users)
self.assertEqual(filtered_users, other_users)
# TODO(https://crbug.com/monorail/8192): Remove deprecated tests.
class DeprecatedShouldRevealEmailTest(unittest.TestCase):
def setUp(self):
self.cnxn = fake.MonorailConnection()
self.services = service_manager.Services(
project=fake.ProjectService(),
user=fake.UserService(),
usergroup=fake.UserGroupService())
self.user_1 = self.services.user.TestAddUser(
'user_1@test.com', 111, obscure_email=True)
self.user_2 = self.services.user.TestAddUser(
'user_2@test.com', 222, obscure_email=False)
self.requester = self.services.user.TestAddUser(
'user_5@test.com', 555, obscure_email=True)
self.user_auth = authdata.AuthData(
user_id=self.requester.user_id, email=self.requester.email)
self.user_auth.user_pb.email = self.user_auth.email
self.project = self.services.project.TestAddProject(
'proj', project_id=789, owner_ids=[111], committer_ids=[222])
def testDeprecatedShouldRevealEmail_Anon(self):
anon = authdata.AuthData()
self.assertFalse(
framework_bizobj.DeprecatedShouldRevealEmail(
anon, self.project, self.user_1.email))
self.assertFalse(
framework_bizobj.DeprecatedShouldRevealEmail(
anon, self.project, self.user_2.email))
def testDeprecatedShouldRevealEmail_Self(self):
self.assertTrue(
framework_bizobj.DeprecatedShouldRevealEmail(
self.user_auth, self.project, self.user_auth.user_pb.email))
def testDeprecatedShouldRevealEmail_SiteAdmin(self):
self.user_auth.user_pb.is_site_admin = True
self.assertTrue(
framework_bizobj.DeprecatedShouldRevealEmail(
self.user_auth, self.project, self.user_1.email))
self.assertTrue(
framework_bizobj.DeprecatedShouldRevealEmail(
self.user_auth, self.project, self.user_2.email))
def testDeprecatedShouldRevealEmail_ProjectMember(self):
self.project.committer_ids.append(self.requester.user_id)
self.assertTrue(
framework_bizobj.DeprecatedShouldRevealEmail(
self.user_auth, self.project, self.user_1.email))
self.assertTrue(
framework_bizobj.DeprecatedShouldRevealEmail(
self.user_auth, self.project, self.user_2.email))
def testDeprecatedShouldRevealEmail_NonMember(self):
self.assertFalse(
framework_bizobj.DeprecatedShouldRevealEmail(
self.user_auth, self.project, self.user_1.email))
self.assertFalse(
framework_bizobj.DeprecatedShouldRevealEmail(
self.user_auth, self.project, self.user_2.email))
class ArtifactTest(unittest.TestCase):
def setUp(self):
# No custom fields. Exclusive prefixes: Type, Priority, Milestone.
self.config = tracker_bizobj.MakeDefaultProjectIssueConfig(789)
def testMergeLabels_Labels(self):
# Empty case.
(merged_labels, update_add, update_remove) = framework_bizobj.MergeLabels(
[], [], [], self.config)
self.assertEqual(merged_labels, [])
self.assertEqual(update_add, [])
self.assertEqual(update_remove, [])
# No-op case.
(merged_labels, update_add, update_remove) = framework_bizobj.MergeLabels(
['a', 'b'], [], [], self.config)
self.assertEqual(merged_labels, ['a', 'b'])
self.assertEqual(update_add, [])
self.assertEqual(update_remove, [])
# Adding and removing at the same time.
(merged_labels, update_add, update_remove) = framework_bizobj.MergeLabels(
['a', 'b', 'd'], ['c'], ['d'], self.config)
self.assertEqual(merged_labels, ['a', 'b', 'c'])
self.assertEqual(update_add, ['c'])
self.assertEqual(update_remove, ['d'])
# Removing a non-matching label has no effect.
(merged_labels, update_add, update_remove) = framework_bizobj.MergeLabels(
['a', 'b', 'd'], ['d'], ['e'], self.config)
self.assertEqual(merged_labels, ['a', 'b', 'd'])
self.assertEqual(update_add, []) # d was already there.
self.assertEqual(update_remove, []) # there was no e.
# We can add and remove at the same time.
(merged_labels, update_add, update_remove) = framework_bizobj.MergeLabels(
['Priority-Medium', 'OpSys-OSX'], ['Hot'], ['OpSys-OSX'], self.config)
self.assertEqual(merged_labels, ['Priority-Medium', 'Hot'])
self.assertEqual(update_add, ['Hot'])
self.assertEqual(update_remove, ['OpSys-OSX'])
# Adding Priority-High replaces Priority-Medium.
(merged_labels, update_add, update_remove) = framework_bizobj.MergeLabels(
['Priority-Medium', 'OpSys-OSX'], ['Priority-High', 'OpSys-Win'], [],
self.config)
self.assertEqual(merged_labels, ['OpSys-OSX', 'Priority-High', 'OpSys-Win'])
self.assertEqual(update_add, ['Priority-High', 'OpSys-Win'])
self.assertEqual(update_remove, [])
# Adding Priority-High and Priority-Low replaces with High only.
(merged_labels, update_add, update_remove) = framework_bizobj.MergeLabels(
['Priority-Medium', 'OpSys-OSX'],
['Priority-High', 'Priority-Low'], [], self.config)
self.assertEqual(merged_labels, ['OpSys-OSX', 'Priority-High'])
self.assertEqual(update_add, ['Priority-High'])
self.assertEqual(update_remove, [])
# Removing a mix of matching and non-matching labels only does matching.
(merged_labels, update_add, update_remove) = framework_bizobj.MergeLabels(
['Priority-Medium', 'OpSys-OSX'], [], ['Priority-Medium', 'OpSys-Win'],
self.config)
self.assertEqual(merged_labels, ['OpSys-OSX'])
self.assertEqual(update_add, [])
self.assertEqual(update_remove, ['Priority-Medium'])
# Multi-part labels work as expected.
(merged_labels, update_add, update_remove) = framework_bizobj.MergeLabels(
['Priority-Medium', 'OpSys-OSX-11'],
['Priority-Medium-Rare', 'OpSys-OSX-13'], [], self.config)
self.assertEqual(
merged_labels, ['OpSys-OSX-11', 'Priority-Medium-Rare', 'OpSys-OSX-13'])
self.assertEqual(update_add, ['Priority-Medium-Rare', 'OpSys-OSX-13'])
self.assertEqual(update_remove, [])
# Multi-part exclusive prefixes only filter labels that match whole prefix.
self.config.exclusive_label_prefixes.append('Branch-Name')
(merged_labels, update_add, update_remove) = framework_bizobj.MergeLabels(
['Branch-Name-xyz'],
['Branch-Prediction', 'Branch-Name-Beta'], [], self.config)
self.assertEqual(merged_labels, ['Branch-Prediction', 'Branch-Name-Beta'])
self.assertEqual(update_add, ['Branch-Prediction', 'Branch-Name-Beta'])
self.assertEqual(update_remove, [])
def testMergeLabels_SingleValuedEnums(self):
self.config.field_defs.append(tracker_pb2.FieldDef(
field_id=1, field_name='Size',
field_type=tracker_pb2.FieldTypes.ENUM_TYPE,
is_multivalued=False))
self.config.field_defs.append(tracker_pb2.FieldDef(
field_id=1, field_name='Branch-Name',
field_type=tracker_pb2.FieldTypes.ENUM_TYPE,
is_multivalued=False))
# We can add a label for a single-valued enum.
(merged_labels, update_add, update_remove) = framework_bizobj.MergeLabels(
['Priority-Medium', 'OpSys-OSX'], ['Size-L'], [], self.config)
self.assertEqual(merged_labels, ['Priority-Medium', 'OpSys-OSX', 'Size-L'])
self.assertEqual(update_add, ['Size-L'])
self.assertEqual(update_remove, [])
# Adding and removing the same label adds it.
(merged_labels, update_add, update_remove) = framework_bizobj.MergeLabels(
['Priority-Medium'], ['Size-M'], ['Size-M'], self.config)
self.assertEqual(merged_labels, ['Priority-Medium', 'Size-M'])
self.assertEqual(update_add, ['Size-M'])
self.assertEqual(update_remove, [])
# Adding Size-L replaces Size-M.
(merged_labels, update_add, update_remove) = framework_bizobj.MergeLabels(
['Priority-Medium', 'Size-M'], ['Size-L', 'OpSys-Win'], [],
self.config)
self.assertEqual(merged_labels, ['Priority-Medium', 'Size-L', 'OpSys-Win'])
self.assertEqual(update_add, ['Size-L', 'OpSys-Win'])
self.assertEqual(update_remove, [])
# Adding Size-L and Size-XL replaces with L only.
(merged_labels, update_add, update_remove) = framework_bizobj.MergeLabels(
['Size-M', 'OpSys-OSX'], ['Size-L', 'Size-XL'], [], self.config)
self.assertEqual(merged_labels, ['OpSys-OSX', 'Size-L'])
self.assertEqual(update_add, ['Size-L'])
self.assertEqual(update_remove, [])
# Multi-part labels work as expected.
(merged_labels, update_add, update_remove) = framework_bizobj.MergeLabels(
['Size-M', 'OpSys-OSX'], ['Size-M-USA'], [], self.config)
self.assertEqual(merged_labels, ['OpSys-OSX', 'Size-M-USA'])
self.assertEqual(update_add, ['Size-M-USA'])
self.assertEqual(update_remove, [])
# Multi-part enum names only filter labels that match whole name.
(merged_labels, update_add, update_remove) = framework_bizobj.MergeLabels(
['Branch-Name-xyz'],
['Branch-Prediction', 'Branch-Name-Beta'], [], self.config)
self.assertEqual(merged_labels, ['Branch-Prediction', 'Branch-Name-Beta'])
self.assertEqual(update_add, ['Branch-Prediction', 'Branch-Name-Beta'])
self.assertEqual(update_remove, [])
def testMergeLabels_MultiValuedEnums(self):
self.config.field_defs.append(tracker_pb2.FieldDef(
field_id=1, field_name='OpSys',
field_type=tracker_pb2.FieldTypes.ENUM_TYPE,
is_multivalued=True))
self.config.field_defs.append(tracker_pb2.FieldDef(
field_id=1, field_name='Branch-Name',
field_type=tracker_pb2.FieldTypes.ENUM_TYPE,
is_multivalued=True))
# We can add a label for a multi-valued enum.
(merged_labels, update_add, update_remove) = framework_bizobj.MergeLabels(
['Priority-Medium'], ['OpSys-Win'], [], self.config)
self.assertEqual(merged_labels, ['Priority-Medium', 'OpSys-Win'])
self.assertEqual(update_add, ['OpSys-Win'])
self.assertEqual(update_remove, [])
# We can remove a matching label for a multi-valued enum.
(merged_labels, update_add, update_remove) = framework_bizobj.MergeLabels(
['Priority-Medium', 'OpSys-Win'], [], ['OpSys-Win'], self.config)
self.assertEqual(merged_labels, ['Priority-Medium'])
self.assertEqual(update_add, [])
self.assertEqual(update_remove, ['OpSys-Win'])
# We can remove a non-matching label and it is a no-op.
(merged_labels, update_add, update_remove) = framework_bizobj.MergeLabels(
['Priority-Medium', 'OpSys-OSX'], [], ['OpSys-Win'], self.config)
self.assertEqual(merged_labels, ['Priority-Medium', 'OpSys-OSX'])
self.assertEqual(update_add, [])
self.assertEqual(update_remove, [])
# Adding and removing the same label adds it.
(merged_labels, update_add, update_remove) = framework_bizobj.MergeLabels(
['Priority-Medium'], ['OpSys-Win'], ['OpSys-Win'], self.config)
self.assertEqual(merged_labels, ['Priority-Medium', 'OpSys-Win'])
self.assertEqual(update_add, ['OpSys-Win'])
self.assertEqual(update_remove, [])
# We can add a label for a multi-valued enum, even if matching exists.
(merged_labels, update_add, update_remove) = framework_bizobj.MergeLabels(
['Priority-Medium', 'OpSys-OSX'], ['OpSys-Win'], [], self.config)
self.assertEqual(
merged_labels, ['Priority-Medium', 'OpSys-OSX', 'OpSys-Win'])
self.assertEqual(update_add, ['OpSys-Win'])
self.assertEqual(update_remove, [])
# Adding two at the same time is fine.
(merged_labels, update_add, update_remove) = framework_bizobj.MergeLabels(
['Size-M', 'OpSys-OSX'], ['OpSys-Win', 'OpSys-Vax'], [], self.config)
self.assertEqual(
merged_labels, ['Size-M', 'OpSys-OSX', 'OpSys-Win', 'OpSys-Vax'])
self.assertEqual(update_add, ['OpSys-Win', 'OpSys-Vax'])
self.assertEqual(update_remove, [])
# Multi-part labels work as expected.
(merged_labels, update_add, update_remove) = framework_bizobj.MergeLabels(
['Size-M', 'OpSys-OSX'], ['OpSys-Win-10'], [], self.config)
self.assertEqual(merged_labels, ['Size-M', 'OpSys-OSX', 'OpSys-Win-10'])
self.assertEqual(update_add, ['OpSys-Win-10'])
self.assertEqual(update_remove, [])
# Multi-part enum names don't mess up anything.
(merged_labels, update_add, update_remove) = framework_bizobj.MergeLabels(
['Branch-Name-xyz'],
['Branch-Prediction', 'Branch-Name-Beta'], [], self.config)
self.assertEqual(
merged_labels,
['Branch-Name-xyz', 'Branch-Prediction', 'Branch-Name-Beta'])
self.assertEqual(update_add, ['Branch-Prediction', 'Branch-Name-Beta'])
self.assertEqual(update_remove, [])
class CanonicalizeLabelTest(unittest.TestCase):
def testCanonicalizeLabel(self):
self.assertEqual(None, framework_bizobj.CanonicalizeLabel(None))
self.assertEqual('FooBar', framework_bizobj.CanonicalizeLabel('Foo Bar '))
self.assertEqual('Foo.Bar',
framework_bizobj.CanonicalizeLabel('Foo . Bar '))
self.assertEqual('Foo-Bar',
framework_bizobj.CanonicalizeLabel('Foo - Bar '))
class UserIsInProjectTest(unittest.TestCase):
def testUserIsInProject(self):
p = project_pb2.Project()
self.assertFalse(framework_bizobj.UserIsInProject(p, {10}))
self.assertFalse(framework_bizobj.UserIsInProject(p, set()))
p.owner_ids.extend([1, 2, 3])
p.committer_ids.extend([4, 5, 6])
p.contributor_ids.extend([7, 8, 9])
self.assertTrue(framework_bizobj.UserIsInProject(p, {1}))
self.assertTrue(framework_bizobj.UserIsInProject(p, {4}))
self.assertTrue(framework_bizobj.UserIsInProject(p, {7}))
self.assertFalse(framework_bizobj.UserIsInProject(p, {10}))
# Membership via group membership
self.assertTrue(framework_bizobj.UserIsInProject(p, {10, 4}))
# Membership via several group memberships
self.assertTrue(framework_bizobj.UserIsInProject(p, {1, 4}))
# Several irrelevant group memberships
self.assertFalse(framework_bizobj.UserIsInProject(p, {10, 11, 12}))
class IsValidColumnSpecTest(unittest.TestCase):
def testIsValidColumnSpec(self):
self.assertTrue(
framework_bizobj.IsValidColumnSpec('some columns hey-honk hay.honk'))
self.assertTrue(framework_bizobj.IsValidColumnSpec('some'))
self.assertTrue(framework_bizobj.IsValidColumnSpec(''))
def testIsValidColumnSpec_NotValid(self):
self.assertFalse(
framework_bizobj.IsValidColumnSpec('some columns hey-honk hay.'))
self.assertFalse(framework_bizobj.IsValidColumnSpec('some columns hey-'))
self.assertFalse(framework_bizobj.IsValidColumnSpec('-some columns hey'))
self.assertFalse(framework_bizobj.IsValidColumnSpec('some .columns hey'))
class ValidatePrefTest(unittest.TestCase):
def testUnknown(self):
msg = framework_bizobj.ValidatePref('shoe_size', 'true')
self.assertIn('shoe_size', msg)
self.assertIn('Unknown', msg)
msg = framework_bizobj.ValidatePref('', 'true')
self.assertIn('Unknown', msg)
def testTooLong(self):
msg = framework_bizobj.ValidatePref('code_font', 'x' * 100)
self.assertIn('code_font', msg)
self.assertIn('too long', msg)
def testKnownValid(self):
self.assertIsNone(framework_bizobj.ValidatePref('code_font', 'true'))
self.assertIsNone(framework_bizobj.ValidatePref('code_font', 'false'))
def testKnownInvalid(self):
msg = framework_bizobj.ValidatePref('code_font', '')
self.assertIn('Invalid', msg)
msg = framework_bizobj.ValidatePref('code_font', 'sometimes')
self.assertIn('Invalid', msg)
class IsRestrictNewIssuesUserTest(unittest.TestCase):
def setUp(self):
self.cnxn = fake.MonorailConnection()
self.services = service_manager.Services(
user=fake.UserService(),
usergroup=fake.UserGroupService())
self.services.user.TestAddUser('corp_user@example.com', 111)
self.services.user.TestAddUser('corp_group@example.com', 888)
self.services.usergroup.TestAddGroupSettings(888, 'corp_group@example.com')
@mock.patch(
'settings.restrict_new_issues_user_groups', ['corp_group@example.com'])
def testNonRestrictNewIssuesUser(self):
"""We detect when a user is not part of a corp user group."""
self.assertFalse(
framework_bizobj.IsRestrictNewIssuesUser(self.cnxn, self.services, 111))
@mock.patch(
'settings.restrict_new_issues_user_groups', ['corp_group@example.com'])
def testRestrictNewIssuesUser(self):
"""We detect when a user is a member of such a group."""
self.services.usergroup.TestAddMembers(888, [111, 222])
self.assertTrue(
framework_bizobj.IsRestrictNewIssuesUser(self.cnxn, self.services, 111))
class IsPublicIssueNoticeUserTest(unittest.TestCase):
def setUp(self):
self.cnxn = fake.MonorailConnection()
self.services = service_manager.Services(
user=fake.UserService(), usergroup=fake.UserGroupService())
self.services.user.TestAddUser('corp_user@example.com', 111)
self.services.user.TestAddUser('corp_group@example.com', 888)
self.services.usergroup.TestAddGroupSettings(888, 'corp_group@example.com')
@mock.patch(
'settings.public_issue_notice_user_groups', ['corp_group@example.com'])
def testNonPublicIssueNoticeUser(self):
"""We detect when a user is not part of a corp user group."""
self.assertFalse(
framework_bizobj.IsPublicIssueNoticeUser(self.cnxn, self.services, 111))
@mock.patch(
'settings.public_issue_notice_user_groups', ['corp_group@example.com'])
def testPublicIssueNoticeUser(self):
"""We detect when a user is a member of such a group."""
self.services.usergroup.TestAddMembers(888, [111, 222])
self.assertTrue(
framework_bizobj.IsPublicIssueNoticeUser(self.cnxn, self.services, 111))
class GetEffectiveIdsTest(unittest.TestCase):
def setUp(self):
self.cnxn = fake.MonorailConnection()
self.services = service_manager.Services(
user=fake.UserService(), usergroup=fake.UserGroupService())
self.services.user.TestAddUser('test@example.com', 111)
def testNoMemberships(self):
"""No user groups means effective_ids == {user_id}."""
effective_ids = framework_bizobj.GetEffectiveIds(
self.cnxn, self.services, [111])
self.assertEqual(effective_ids, {111: {111}})
def testNormalMemberships(self):
"""effective_ids should be {user_id, group_id...}."""
self.services.usergroup.TestAddMembers(888, [111])
self.services.usergroup.TestAddMembers(999, [111])
effective_ids = framework_bizobj.GetEffectiveIds(
self.cnxn, self.services, [111])
self.assertEqual(effective_ids, {111: {111, 888, 999}})
def testComputedUserGroup(self):
"""effective_ids should be {user_id, group_id...}."""
self.services.usergroup.TestAddGroupSettings(888, 'everyone@example.com')
effective_ids = framework_bizobj.GetEffectiveIds(
self.cnxn, self.services, [111])
self.assertEqual(effective_ids, {111: {111, 888}})
def testAccountHasParent(self):
"""The parent's effective_ids are added to child's."""
child = self.services.user.TestAddUser('child@example.com', 111)
child.linked_parent_id = 222
parent = self.services.user.TestAddUser('parent@example.com', 222)
parent.linked_child_ids = [111]
effective_ids = framework_bizobj.GetEffectiveIds(
self.cnxn, self.services, [111])
self.assertEqual(effective_ids, {111: {111, 222}})
self.services.usergroup.TestAddMembers(888, [111])
self.services.usergroup.TestAddMembers(999, [222])
effective_ids = framework_bizobj.GetEffectiveIds(
self.cnxn, self.services, [111])
self.assertEqual(effective_ids, {111: {111, 222, 888, 999}})
def testAccountHasChildren(self):
"""All linked child effective_ids are added to parent's."""
child1 = self.services.user.TestAddUser('child1@example.com', 111)
child1.linked_parent_id = 333
child2 = self.services.user.TestAddUser('child3@example.com', 222)
child2.linked_parent_id = 333
parent = self.services.user.TestAddUser('parent@example.com', 333)
parent.linked_child_ids = [111, 222]
effective_ids = framework_bizobj.GetEffectiveIds(
self.cnxn, self.services, [333])
self.assertEqual(effective_ids, {333: {111, 222, 333}})
self.services.usergroup.TestAddMembers(888, [111])
self.services.usergroup.TestAddMembers(999, [222])
effective_ids = framework_bizobj.GetEffectiveIds(
self.cnxn, self.services, [333])
self.assertEqual(effective_ids, {333: {111, 222, 333, 888, 999}})