def testHandleRequest_IssueHasTwoArriveDates(self): _request, mr = testing_helpers.GetRequestObjects( path=urls.ISSUE_DATE_ACTION_TASK + '.do?issue_id=78901') now = int(time.time()) date_str = timestr.TimestampToDateWidgetStr(now) issue = fake.MakeTestIssue(789, 1, 'summary', 'New', 111L, issue_id=78901) self.services.issue.TestAddIssue(issue) issue.field_values = [ tracker_bizobj.MakeFieldValue(123, None, None, None, now, False), tracker_bizobj.MakeFieldValue(124, None, None, None, now, False), tracker_bizobj.MakeFieldValue(125, None, None, None, now, False), ] self.assertEqual( 1, len(self.services.issue.GetCommentsForIssue(mr.cnxn, 78901))) self.SetUpEnqueueOutboundEmailTask(1) self.mox.ReplayAll() self.servlet.HandleRequest(mr) self.mox.VerifyAll() comments = self.services.issue.GetCommentsForIssue(mr.cnxn, 78901) self.assertEqual(2, len(comments)) self.assertEqual( 'The EoL date has arrived: %s\n' 'The NextAction date has arrived: %s' % (date_str, date_str), comments[1].content)
def testParseFieldValues_Normal(self): fd_int = tracker_bizobj.MakeFieldDef(123, 789, 'CPU', tracker_pb2.FieldTypes.INT_TYPE, None, '', False, False, False, None, None, '', False, '', '', tracker_pb2.NotifyTriggers.NEVER, 'no_action', 'doc', False) fd_date = tracker_bizobj.MakeFieldDef(124, 789, 'Deadline', tracker_pb2.FieldTypes.DATE_TYPE, None, '', False, False, False, None, None, '', False, '', '', tracker_pb2.NotifyTriggers.NEVER, 'no_action', 'doc', False) self.config.field_defs.extend([fd_int, fd_date]) field_val_strs = {123: ['80386', '68040'], 124: ['2009-02-13']} field_values = field_helpers.ParseFieldValues(self.mr.cnxn, self.services.user, field_val_strs, self.config) fv1 = tracker_bizobj.MakeFieldValue(123, 80386, None, None, None, False) fv2 = tracker_bizobj.MakeFieldValue(123, 68040, None, None, None, False) fv3 = tracker_bizobj.MakeFieldValue(124, None, None, None, 1234483200, False) self.assertEqual([fv1, fv2, fv3], field_values)
def testConvertFieldValues_Normal(self): """The client wants to edit a custom field.""" mar = mock.Mock() mar.config = tracker_bizobj.MakeDefaultProjectIssueConfig(789) mar.config.field_defs = [ tracker_bizobj.MakeFieldDef( 1, 789, 'Priority', tracker_pb2.FieldTypes.ENUM_TYPE, None, None, False, False, False, None, None, None, False, None, None, None, None, 'doc', False), tracker_bizobj.MakeFieldDef( 2, 789, 'EstDays', tracker_pb2.FieldTypes.INT_TYPE, None, None, False, False, False, 0, 99, None, False, None, None, None, None, 'doc', False), tracker_bizobj.MakeFieldDef( 3, 789, 'Nickname', tracker_pb2.FieldTypes.STR_TYPE, None, None, False, False, False, None, None, None, False, None, None, None, None, 'doc', False), tracker_bizobj.MakeFieldDef( 4, 789, 'Verifier', tracker_pb2.FieldTypes.USER_TYPE, None, None, False, False, False, None, None, None, False, None, None, None, None, 'doc', False), tracker_bizobj.MakeFieldDef( 5, 789, 'Deadline', tracker_pb2.FieldTypes.DATE_TYPE, None, None, False, False, False, None, None, None, False, None, None, None, None, 'doc', False), tracker_bizobj.MakeFieldDef( 6, 789, 'Homepage', tracker_pb2.FieldTypes.URL_TYPE, None, None, False, False, False, None, None, None, False, None, None, None, None, 'doc', False), ] field_values = [ api_pb2_v1.FieldValue(fieldName='Priority', fieldValue='High'), api_pb2_v1.FieldValue(fieldName='EstDays', fieldValue='4'), api_pb2_v1.FieldValue(fieldName='Nickname', fieldValue='Scout'), api_pb2_v1.FieldValue( fieldName='Verifier', fieldValue='*****@*****.**'), api_pb2_v1.FieldValue(fieldName='Deadline', fieldValue='2017-12-06'), api_pb2_v1.FieldValue( fieldName='Homepage', fieldValue='http://example.com'), ] actual = api_pb2_v1_helpers.convert_field_values( field_values, mar, self.services) (fv_list_add, fv_list_remove, fv_list_clear, label_list_add, label_list_remove) = actual self.assertEquals( [tracker_bizobj.MakeFieldValue(2, 4, None, None, None, None, False), tracker_bizobj.MakeFieldValue(3, None, 'Scout', None, None, None, False), tracker_bizobj.MakeFieldValue(4, None, None, 111, None, None, False), tracker_bizobj.MakeFieldValue( 5, None, None, None, 1512518400, None, False), tracker_bizobj.MakeFieldValue( 6, None, None, None, None, 'http://example.com', False), ], fv_list_add) self.assertEquals([], fv_list_remove) self.assertEquals([], fv_list_clear) self.assertEquals(['Priority-High'], label_list_add) self.assertEquals([], label_list_remove)
def SetUpFieldValues(self, issue, now): issue.field_values = [ tracker_bizobj.MakeFieldValue(123, None, None, None, now, None, False), tracker_bizobj.MakeFieldValue(124, None, None, None, now, None, False), tracker_bizobj.MakeFieldValue(125, None, None, None, now, None, False), ]
def testMergeFields_MultiValued(self): fd = tracker_pb2.FieldDef( field_id=1, field_name='foo', is_multivalued=True) fv1 = tracker_bizobj.MakeFieldValue(1, 42, None, None, None, False) fv2 = tracker_bizobj.MakeFieldValue(1, 43, None, None, None, False) fv3 = tracker_bizobj.MakeFieldValue(1, 44, None, None, None, False) fv4 = tracker_bizobj.MakeFieldValue(1, 42, None, None, None, False) fv5 = tracker_bizobj.MakeFieldValue(1, 99, None, None, None, False) merged_fvs, fvs_added, fvs_removed = tracker_bizobj.MergeFields( [fv1, fv2], [fv2, fv3], [fv4, fv5], [fd]) self.assertEqual([fv2, fv3], merged_fvs) self.assertEqual([fv3], fvs_added) self.assertEqual([fv4], fvs_removed)
def testValidateCustomFields_NoErrors(self): fd = tracker_bizobj.MakeFieldDef(123, 789, 'CPU', tracker_pb2.FieldTypes.INT_TYPE, None, '', False, False, False, None, None, '', False, '', '', tracker_pb2.NotifyTriggers.NEVER, 'no_action', 'doc', False) self.config.field_defs.append(fd) fv1 = tracker_bizobj.MakeFieldValue(123, 8086, None, None, None, False) fv2 = tracker_bizobj.MakeFieldValue(123, 486, None, None, None, False) field_helpers.ValidateCustomFields(self.mr, self.services, [fv1, fv2], self.config, self.errors) self.assertFalse(self.errors.AnyErrors())
def ConvertMLabels(labels, phases, m_target_id, m_approved_id, labels_re, phase_map): field_values = [] for label in labels: match = re.match(labels_re, label) if match: milestone = match.group('m') m_type = match.group('type') channel = match.group('channel') for phase in phases: # We know get(phase) will return something because # we're checking before ConvertMLabels, that all phases # exist in BROWSER_PHASE_MAP or OS_PHASE_MAP if phase_map.get(phase.name.lower()) == channel.lower(): field_id = m_target_id if (m_type.lower() == 'target') else m_approved_id field_values.append( tracker_bizobj.MakeFieldValue(field_id, int(milestone), None, None, None, None, False, phase_id=phase.phase_id)) break # exit phase loop if match is found. return field_values
def test_UrlType(self): fd = tracker_bizobj.MakeFieldDef(123, 789, 'CPU', tracker_pb2.FieldTypes.URL_TYPE, None, '', False, False, False, None, None, '', False, '', '', tracker_pb2.NotifyTriggers.NEVER, 'no_action', 'doc', False) fv = tracker_bizobj.MakeFieldValue(123, None, None, None, None, 'www.google.com', False) msg = field_helpers.ValidateCustomField(self.mr, self.mr.project, self.services, fd, fv) self.assertIsNone(msg) fv.url_value = 'go/puppies' msg = field_helpers.ValidateCustomField(self.mr, self.mr.project, self.services, fd, fv) self.assertIsNone(msg) fv.url_value = 'go/213' msg = field_helpers.ValidateCustomField(self.mr, self.mr.project, self.services, fd, fv) self.assertIsNone(msg) fv.url_value = 'puppies' msg = field_helpers.ValidateCustomField(self.mr, self.mr.project, self.services, fd, fv) self.assertEqual('Value must be a valid url', msg)
def testMergeFields_NoChange(self): fv1 = tracker_bizobj.MakeFieldValue(1, 42, None, None, None, False) merged_fvs, fvs_added, fvs_removed = tracker_bizobj.MergeFields( [fv1], [], [], []) self.assertEqual([fv1], merged_fvs) self.assertEqual([], fvs_added) self.assertEqual([], fvs_removed)
def testIndexOrLexicalList_CustomFields(self): art = fake.MakeTestIssue(789, 1, 'sum 2', 'New', 111) art.labels = ['samename-value1'] art.field_values = [ tracker_bizobj.MakeFieldValue(3, 6078, None, None, None, None, False) ] all_field_defs = [ tracker_bizobj.MakeFieldDef(3, 789, 'samename', tracker_pb2.FieldTypes.INT_TYPE, None, None, False, False, False, None, None, None, False, None, None, None, None, 'cow spots', False), tracker_bizobj.MakeFieldDef(4, 788, 'samename', tracker_pb2.FieldTypes.APPROVAL_TYPE, None, None, False, False, False, None, None, None, False, None, None, None, None, 'cow spots', False), tracker_bizobj.MakeFieldDef(4, 788, 'notsamename', tracker_pb2.FieldTypes.APPROVAL_TYPE, None, None, False, False, False, None, None, None, False, None, None, None, None, 'should get filtered out', False) ] accessor = sorting._IndexOrLexicalList([], all_field_defs, 'samename', {}) self.assertEqual([6078, 'value1'], accessor(art)) neg_accessor = MakeDescending(accessor) self.assertEqual([sorting.DescendingValue('value1'), -6078], neg_accessor(art))
def testPrecomputeInfoForValueViews_SomeValues(self): """We can precompute info needed for an issue with fields and labels.""" labels = [ 'Priority-Low', 'GoodFirstBug', 'Feature-UI', 'Feature-Installer', 'Launch-Milestone-66' ] derived_labels = ['OS-Windows', 'OS-Linux'] field_values = [ tracker_bizobj.MakeFieldValue(1, 5, None, None, None, None, False), ] phase_1 = tracker_pb2.Phase(phase_id=1, name='Stable') phase_2 = tracker_pb2.Phase(phase_id=2, name='Beta') phase_3 = tracker_pb2.Phase(phase_id=3, name='stable') precomp_view_info = tracker_views._PrecomputeInfoForValueViews( labels, derived_labels, field_values, self.config, phases=[phase_1, phase_2, phase_3]) (labels_by_prefix, der_labels_by_prefix, field_values_by_id, _label_docs, phases_by_name) = precomp_view_info self.assertEqual( { 'priority': ['Low'], 'feature': ['UI', 'Installer'], 'launch-milestone': ['66'] }, labels_by_prefix) self.assertEqual({'os': ['Windows', 'Linux']}, der_labels_by_prefix) self.assertEqual({1: field_values}, field_values_by_id) self.assertEqual({ 'stable': [phase_1, phase_3], 'beta': [phase_2] }, phases_by_name)
def setUp(self): self.config = tracker_bizobj.MakeDefaultProjectIssueConfig(789) self.config.field_defs = [ tracker_bizobj.MakeFieldDef( 1, 789, 'Goats', tracker_pb2.FieldTypes.INT_TYPE, None, None, False, False, False, None, None, None, False, None, None, None, None, 'Num of Goats in the season', False, is_phase_field=True), tracker_bizobj.MakeFieldDef( 2, 789, 'DogNames', tracker_pb2.FieldTypes.STR_TYPE, None, None, False, False, False, None, None, None, False, None, None, None, None, 'good dog names', False), tracker_bizobj.MakeFieldDef( 3, 789, 'Approval', tracker_pb2.FieldTypes.APPROVAL_TYPE, None, None, False, False, False, None, None, None, False, None, None, None, None, 'Tracks review from cows', False) ] self.config.approval_defs = [tracker_pb2.ApprovalDef(approval_id=3)] self.issue = MakeTestIssue( local_id=1, issue_id=100001, summary='One') self.issue.field_values = [ tracker_bizobj.MakeFieldValue( 1, 34, None, None, None, None, False, phase_id=23), tracker_bizobj.MakeFieldValue( 1, 35, None, None, None, None, False, phase_id=24), tracker_bizobj.MakeFieldValue( 2, None, 'Waffles', None, None, None, False), ] self.issue.phases = [ tracker_pb2.Phase(phase_id=23, name='winter'), tracker_pb2.Phase(phase_id=24, name='summer')] self.issue.approval_values = [ tracker_pb2.ApprovalValue( approval_id=3, approver_ids=[111, 222, 333])] self.users_by_id = { 111: framework_views.StuffUserView(111, '*****@*****.**', False), 222: framework_views.StuffUserView(222, '*****@*****.**', True), } self.summary_table_cell_kws = { 'col': None, 'users_by_id': {}, 'non_col_labels': [('lab', False)], 'label_values': {}, 'related_issues': {}, 'config': 'fake_config', }
def ParseOneFieldValue(cnxn, user_service, fd, val_str): """Make one FieldValue PB from the given user-supplied string.""" if fd.field_type == tracker_pb2.FieldTypes.INT_TYPE: try: return tracker_bizobj.MakeFieldValue( fd.field_id, int(val_str), None, None, None, None, False) except ValueError: return None # TODO(jrobbins): should bounce elif fd.field_type == tracker_pb2.FieldTypes.STR_TYPE: return tracker_bizobj.MakeFieldValue( fd.field_id, None, val_str, None, None, None, False) elif fd.field_type == tracker_pb2.FieldTypes.USER_TYPE: if val_str: try: user_id = user_service.LookupUserID(cnxn, val_str, autocreate=False) except exceptions.NoSuchUserException: # Set to invalid user ID to display error during the validation step. user_id = INVALID_USER_ID return tracker_bizobj.MakeFieldValue( fd.field_id, None, None, user_id, None, None, False) else: return None elif fd.field_type == tracker_pb2.FieldTypes.DATE_TYPE: try: timestamp = timestr.DateWidgetStrToTimestamp(val_str) return tracker_bizobj.MakeFieldValue( fd.field_id, None, None, None, timestamp, None, False) except ValueError: return None # TODO(jrobbins): should bounce elif fd.field_type == tracker_pb2.FieldTypes.URL_TYPE: val_str = FormatUrlFieldValue(val_str) try: return tracker_bizobj.MakeFieldValue( fd.field_id, None, None, None, None, val_str, False) except ValueError: return None # TODO(jojwang): should bounce else: logging.error('Cant parse field with unexpected type %r', fd.field_type) return None
def testMergeFields_SingleValued(self): fd = tracker_pb2.FieldDef(field_id=1, field_name='foo') fv1 = tracker_bizobj.MakeFieldValue(1, 42, None, None, None, False) fv2 = tracker_bizobj.MakeFieldValue(1, 43, None, None, None, False) fv3 = tracker_bizobj.MakeFieldValue(1, 44, None, None, None, False) # Adding one replaces all values since the field is single-valued. merged_fvs, fvs_added, fvs_removed = tracker_bizobj.MergeFields( [fv1, fv2], [fv3], [], [fd]) self.assertEqual([fv3], merged_fvs) self.assertEqual([fv3], fvs_added) self.assertEqual([], fvs_removed) # Removing one just removes it, does not reset. merged_fvs, fvs_added, fvs_removed = tracker_bizobj.MergeFields( [fv1, fv2], [], [fv2], [fd]) self.assertEqual([fv1], merged_fvs) self.assertEqual([], fvs_added) self.assertEqual([fv2], fvs_removed)
def testValidateCustomFields_SomeErrors(self): fd = tracker_bizobj.MakeFieldDef(123, 789, 'CPU', tracker_pb2.FieldTypes.INT_TYPE, None, '', False, False, False, None, None, '', False, '', '', tracker_pb2.NotifyTriggers.NEVER, 'no_action', 'doc', False) self.config.field_defs.append(fd) fv1 = tracker_bizobj.MakeFieldValue(123, 8086, None, None, None, False) fv2 = tracker_bizobj.MakeFieldValue(123, 486, None, None, None, False) fd.min_value = 1 fd.max_value = 999 field_helpers.ValidateCustomFields(self.mr, self.services, [fv1, fv2], self.config, self.errors) self.assertTrue(self.errors.AnyErrors()) self.assertEqual(1, len(self.errors.custom_fields)) custom_field_error = self.errors.custom_fields[0] self.assertEqual(123, custom_field_error.field_id) self.assertEqual('Value must be <= 999', custom_field_error.message)
def testConvertFieldValues_ClearAndRemove(self): """The client wants to clear and remove some custom fields.""" mar = mock.Mock() mar.config = tracker_bizobj.MakeDefaultProjectIssueConfig(789) mar.config.field_defs = [ tracker_bizobj.MakeFieldDef(1, 789, 'Priority', tracker_pb2.FieldTypes.ENUM_TYPE, None, None, False, False, False, None, None, None, False, None, None, None, None, 'doc', False), tracker_bizobj.MakeFieldDef(11, 789, 'OS', tracker_pb2.FieldTypes.ENUM_TYPE, None, None, False, False, False, None, None, None, False, None, None, None, None, 'doc', False), tracker_bizobj.MakeFieldDef(2, 789, 'EstDays', tracker_pb2.FieldTypes.INT_TYPE, None, None, False, False, False, 0, 99, None, False, None, None, None, None, 'doc', False), tracker_bizobj.MakeFieldDef(3, 789, 'Nickname', tracker_pb2.FieldTypes.STR_TYPE, None, None, False, False, False, None, None, None, False, None, None, None, None, 'doc', False), ] field_values = [ api_pb2_v1.FieldValue( fieldName='Priority', fieldValue='High', operator=api_pb2_v1.FieldValueOperator.remove), api_pb2_v1.FieldValue( fieldName='OS', operator=api_pb2_v1.FieldValueOperator.clear), api_pb2_v1.FieldValue( fieldName='EstDays', operator=api_pb2_v1.FieldValueOperator.clear), api_pb2_v1.FieldValue( fieldName='Nickname', fieldValue='Scout', operator=api_pb2_v1.FieldValueOperator.remove), ] actual = api_pb2_v1_helpers.convert_field_values( field_values, mar, self.services) (fv_list_add, fv_list_remove, fv_list_clear, label_list_add, label_list_remove) = actual self.assertEquals([], fv_list_add) self.assertEquals([ tracker_bizobj.MakeFieldValue(3, None, 'Scout', None, None, None, False) ], fv_list_remove) self.assertEquals([11, 2], fv_list_clear) self.assertEquals([], label_list_add) self.assertEquals(['Priority-High'], label_list_remove)
def testMakeFieldValue(self): # Only the first value counts. fv = tracker_bizobj.MakeFieldValue(1, 42, 'yay', 111L, None, True) self.assertEqual(1, fv.field_id) self.assertEqual(42, fv.int_value) self.assertIsNone(fv.str_value) self.assertEqual(None, fv.user_id) fv = tracker_bizobj.MakeFieldValue(1, None, 'yay', 111L, None, True) self.assertEqual('yay', fv.str_value) self.assertEqual(None, fv.user_id) fv = tracker_bizobj.MakeFieldValue(1, None, None, 111L, None, True) self.assertEqual(111L, fv.user_id) self.assertEqual(True, fv.derived) fv = tracker_bizobj.MakeFieldValue(1, None, None, None, 1234567890, True) self.assertEqual(1234567890, fv.date_value) self.assertEqual(True, fv.derived) with self.assertRaises(ValueError): tracker_bizobj.MakeFieldValue(1, None, None, None, None, True)
def testValidateOneCustomField_OtherType(self): # There are currently no validation options for date-type custom fields. fd = tracker_bizobj.MakeFieldDef(123, 789, 'Deadline', tracker_pb2.FieldTypes.DATE_TYPE, None, '', False, False, False, None, None, '', False, '', '', tracker_pb2.NotifyTriggers.NEVER, 'no_action', 'doc', False) fv = tracker_bizobj.MakeFieldValue(123, None, None, None, 1234567890, False) msg = field_helpers._ValidateOneCustomField(self.mr, self.services, fd, fv) self.assertIsNone(msg)
def testCreateIssueSearchDocuments_CustomFields(self): self.SetUpCreateIssueSearchDocuments() self.mox.ReplayAll() config = tracker_bizobj.MakeDefaultProjectIssueConfig(123) config_dict = {123: tracker_bizobj.MakeDefaultProjectIssueConfig(123)} int_field = tracker_bizobj.MakeFieldDef( 1, 123, 'CustomInt', tracker_pb2.FieldTypes.INT_TYPE, None, False, False, False, None, None, None, None, False, None, None, None, 'no_action', 'A custom int field', False) int_field_value = tracker_bizobj.MakeFieldValue( 1, 42, None, None, False, None, None) str_field = tracker_bizobj.MakeFieldDef( 2, 123, 'CustomStr', tracker_pb2.FieldTypes.STR_TYPE, None, False, False, False, None, None, None, None, False, None, None, None, 'no_action', 'A custom string field', False) str_field_value = tracker_bizobj.MakeFieldValue( 2, None, u'\xf0\x9f\x92\x96\xef\xb8\x8f', None, None, None, False) # TODO(jrobbins): user-type field 3 date_field = tracker_bizobj.MakeFieldDef( 4, 123, 'CustomDate', tracker_pb2.FieldTypes.DATE_TYPE, None, False, False, False, None, None, None, None, False, None, None, None, 'no_action', 'A custom date field', False) date_field_value = tracker_bizobj.MakeFieldValue( 4, None, None, None, 1234567890, None, False) config.field_defs.extend([int_field, str_field, date_field]) self.issue.field_values.extend( [int_field_value, str_field_value, date_field_value]) tracker_fulltext._CreateIssueSearchDocuments( [self.issue], {self.issue.issue_id: [self.comment]}, self.users_by_id, config_dict) self.mox.VerifyAll() self.assertEqual(1, len(self.docs)) issue_doc = self.docs[0] metadata = issue_doc.fields[2] self.assertEqual( u'New [email protected] [] 42 \xf0\x9f\x92\x96\xef\xb8\x8f 2009-02-13 ', metadata.value)
def testMakeEmailTasks(self): issue = fake.MakeTestIssue(789, 1, 'summary', 'New', self.owner.user_id, issue_id=78901) self.services.issue.TestAddIssue(issue) now = int(time.time()) issue.field_values = [ tracker_bizobj.MakeFieldValue(123, None, None, None, now, False), tracker_bizobj.MakeFieldValue(124, None, None, None, now, False), tracker_bizobj.MakeFieldValue(125, None, None, None, now, False), ] issue.project_name = 'proj' comment = tracker_pb2.IssueComment() comment.project_id = self.project.project_id comment.user_id = self.date_action_user.user_id comment.content = 'Some date(s) arrived...' next_action_field_def = self.config.field_defs[0] pings = [(next_action_field_def, now)] users_by_id = framework_views.MakeAllUserViews( 'fake cnxn', self.services.user, [self.owner.user_id, self.date_action_user.user_id]) tasks = self.servlet._MakeEmailTasks('fake cnxn', issue, self.project, self.config, comment, 'example-app.appspot.com', users_by_id, pings) self.assertEqual(1, len(tasks)) notify_owner_task = tasks[0] self.assertEqual('*****@*****.**', notify_owner_task['to']) self.assertEqual('Follow up on issue 1 in proj: summary', notify_owner_task['subject']) body = notify_owner_task['body'] self.assertIn(comment.content, body) self.assertIn(next_action_field_def.docstring, body)
def CreateUserFieldValue(self, mr, ldap, field_id): if ldap is None: return None try: user_id = self.services.user.LookupUserID(mr.cnxn, ldap + '@chromium.org') except exceptions.NoSuchUserException: try: user_id = self.services.user.LookupUserID( mr.cnxn, ldap + '@google.com') except exceptions.NoSuchUserException: logging.info( 'No chromium.org or google.com accound found for %s', ldap) return None return tracker_bizobj.MakeFieldValue(field_id, None, None, user_id, None, None, False)
def testValidateOneCustomField_IntType(self): fd = tracker_bizobj.MakeFieldDef(123, 789, 'CPU', tracker_pb2.FieldTypes.INT_TYPE, None, '', False, False, False, None, None, '', False, '', '', tracker_pb2.NotifyTriggers.NEVER, 'no_action', 'doc', False) fv = tracker_bizobj.MakeFieldValue(123, 8086, None, None, None, False) msg = field_helpers._ValidateOneCustomField(self.mr, self.services, fd, fv) self.assertIsNone(msg) fd.min_value = 1 fd.max_value = 999 msg = field_helpers._ValidateOneCustomField(self.mr, self.services, fd, fv) self.assertEqual('Value must be <= 999', msg) fv.int_value = 0 msg = field_helpers._ValidateOneCustomField(self.mr, self.services, fd, fv) self.assertEqual('Value must be >= 1', msg)
def testValidateOneCustomField_StrType(self): fd = tracker_bizobj.MakeFieldDef(123, 789, 'CPU', tracker_pb2.FieldTypes.STR_TYPE, None, '', False, False, False, None, None, '', False, '', '', tracker_pb2.NotifyTriggers.NEVER, 'no_action', 'doc', False) fv = tracker_bizobj.MakeFieldValue(123, None, 'i386', None, None, False) msg = field_helpers._ValidateOneCustomField(self.mr, self.services, fd, fv) self.assertIsNone(msg) fd.regex = r'^\d*$' msg = field_helpers._ValidateOneCustomField(self.mr, self.services, fd, fv) self.assertEqual(r'Value must match regular expression: ^\d*$', msg) fv.str_value = '386' msg = field_helpers._ValidateOneCustomField(self.mr, self.services, fd, fv) self.assertIsNone(msg)
def testConvertIssue(self): """Convert an internal Issue PB to an IssueWrapper API PB.""" self.services.project.TestAddProject( 'test-project', owner_ids=[2], project_id=12345) self.services.user.TestAddUser('*****@*****.**', 111) mar = mock.Mock() mar.cnxn = None mar.project_name = 'test-project' mar.project_id = 12345 mar.auth.effective_ids = {111} mar.perms = permissions.READ_ONLY_PERMISSIONSET mar.profiler = profiler.Profiler() mar.config = tracker_bizobj.MakeDefaultProjectIssueConfig(12345) mar.config.field_defs = [ tracker_bizobj.MakeFieldDef( 1, 12345, 'EstDays', tracker_pb2.FieldTypes.INT_TYPE, None, None, False, False, False, None, None, None, False, None, None, None, None, 'doc', False, approval_id=2), tracker_bizobj.MakeFieldDef( 2, 12345, 'DesignReview', tracker_pb2.FieldTypes.APPROVAL_TYPE, None, None, False, False, False, None, None, None, False, None, None, None, None, 'doc', False), tracker_bizobj.MakeFieldDef( 3, 12345, 'StringField', tracker_pb2.FieldTypes.STR_TYPE, None, None, False, False, False, None, None, None, False, None, None, None, None, 'doc', False), tracker_bizobj.MakeFieldDef( 4, 12345, 'DressReview', tracker_pb2.FieldTypes.APPROVAL_TYPE, None, None, False, False, False, None, None, None, False, None, None, None, None, 'doc', False), ] self.services.config.StoreConfig(mar.cnxn, mar.config) now = 1472067725 now_dt = datetime.datetime.fromtimestamp(now) fvs = [ tracker_bizobj.MakeFieldValue( 1, 4, None, None, None, None, False, phase_id=4), tracker_bizobj.MakeFieldValue( 3, None, 'string', None, None, None, False, phase_id=4), # missing phase tracker_bizobj.MakeFieldValue( 3, None, u'\xe2\x9d\xa4\xef\xb8\x8f', None, None, None, False, phase_id=2), ] phases = [ tracker_pb2.Phase(phase_id=3, name="JustAPhase", rank=4), tracker_pb2.Phase(phase_id=4, name="NotAPhase", rank=9) ] approval_values = [ tracker_pb2.ApprovalValue( approval_id=2, phase_id=3, approver_ids=[111]), tracker_pb2.ApprovalValue(approval_id=4, approver_ids=[111]) ] issue = fake.MakeTestIssue( 12345, 1, 'one', 'New', 111, field_values=fvs, approval_values=approval_values, phases=phases) issue.opened_timestamp = now issue.owner_modified_timestamp = now issue.status_modified_timestamp = now issue.component_modified_timestamp = now # TODO(jrobbins): set up a lot more fields. for cls in [api_pb2_v1.IssueWrapper, api_pb2_v1.IssuesGetInsertResponse]: result = api_pb2_v1_helpers.convert_issue(cls, issue, mar, self.services) self.assertEquals(1, result.id) self.assertEquals('one', result.title) self.assertEquals('one', result.summary) self.assertEquals(now_dt, result.published) self.assertEquals(now_dt, result.owner_modified) self.assertEquals(now_dt, result.status_modified) self.assertEquals(now_dt, result.component_modified) self.assertEquals( result.fieldValues, [api_pb2_v1.FieldValue( fieldName='EstDays', fieldValue='4', approvalName='DesignReview', derived=False), api_pb2_v1.FieldValue(fieldName='StringField', fieldValue='string', phaseName="NotAPhase", derived=False), api_pb2_v1.FieldValue(fieldName='StringField', fieldValue=u'\xe2\x9d\xa4\xef\xb8\x8f', derived=False), ] ) self.assertEqual( result.approvalValues, [api_pb2_v1.Approval( approvalName="DesignReview", approvers=[self.person_1], status=api_pb2_v1.ApprovalStatus.notSet, phaseName="JustAPhase", ), api_pb2_v1.Approval( approvalName="DressReview", approvers=[self.person_1], status=api_pb2_v1.ApprovalStatus.notSet, )] ) self.assertEqual( result.phases, [api_pb2_v1.Phase(phaseName="JustAPhase", rank=4), api_pb2_v1.Phase(phaseName="NotAPhase", rank=9) ])
def testFetchItems_Normal(self): template_9_row = (9, 1, 'template-9', 'content', 'summary', False, 111, 'status', False, False, False) template_8_row = (8, 1, 'template-8', 'content', 'summary', False, 111, 'status', False, False, False) template_7_row = (7, 2, 'template-7', 'content', 'summary', False, 111, 'status', False, False, False) self.template_def_2lc.template_service.template_tbl.Select\ .return_value = [template_7_row, template_8_row, template_9_row] self.template_def_2lc.template_service.template2label_tbl.Select\ .return_value = [(9, 'label-1'), (7, 'label-2')] self.template_def_2lc.template_service.template2component_tbl.Select\ .return_value = [(9, 13), (7, 14)] self.template_def_2lc.template_service.template2admin_tbl.Select\ .return_value = [(9, 111), (7, 222)] fv1_row = (15, None, 'fv-1', None, None, None, False) fv2_row = (16, None, 'fv-2', None, None, None, False) fv1 = tracker_bizobj.MakeFieldValue(*fv1_row) fv2 = tracker_bizobj.MakeFieldValue(*fv2_row) self.template_def_2lc.template_service.template2fieldvalue_tbl.Select\ .return_value = [((9,) + fv1_row[:-1]), ((7,) + fv2_row[:-1])] av1_row = (17, 9, 19, 'na') av2_row = (18, 7, 20, 'not_set') av1 = tracker_pb2.ApprovalValue( approval_id=17, phase_id=19, status=tracker_pb2.ApprovalStatus('NA')) av2 = tracker_pb2.ApprovalValue( approval_id=18, phase_id=20, status=tracker_pb2.ApprovalStatus('NOT_SET')) phase1_row = (19, 'phase-1', 1) phase2_row = (20, 'phase-2', 2) phase1 = tracker_pb2.Phase(phase_id=19, name='phase-1', rank=1) phase2 = tracker_pb2.Phase(phase_id=20, name='phase-2', rank=2) self.template_def_2lc.template_service.template2approvalvalue_tbl.Select\ .return_value = [av1_row, av2_row] self.template_def_2lc.template_service.issuephasedef_tbl.Select\ .return_value = [phase1_row, phase2_row] actual = self.template_def_2lc.FetchItems(cnxn=None, keys=[7, 8, 9]) self.assertEqual(3, len(list(actual.keys()))) self.assertTrue(isinstance(actual[7], tracker_pb2.TemplateDef)) self.assertTrue(isinstance(actual[8], tracker_pb2.TemplateDef)) self.assertTrue(isinstance(actual[9], tracker_pb2.TemplateDef)) self.assertEqual(7, actual[7].template_id) self.assertEqual(8, actual[8].template_id) self.assertEqual(9, actual[9].template_id) self.assertEqual(['label-2'], actual[7].labels) self.assertEqual([], actual[8].labels) self.assertEqual(['label-1'], actual[9].labels) self.assertEqual([14], actual[7].component_ids) self.assertEqual([], actual[8].component_ids) self.assertEqual([13], actual[9].component_ids) self.assertEqual([222], actual[7].admin_ids) self.assertEqual([], actual[8].admin_ids) self.assertEqual([111], actual[9].admin_ids) self.assertEqual([fv2], actual[7].field_values) self.assertEqual([], actual[8].field_values) self.assertEqual([fv1], actual[9].field_values) self.assertEqual([phase2], actual[7].phases) self.assertEqual([], actual[8].phases) self.assertEqual([phase1], actual[9].phases) self.assertEqual([av2], actual[7].approval_values) self.assertEqual([], actual[8].approval_values) self.assertEqual([av1], actual[9].approval_values)
def testMakeAllFieldValueViews(self): labels = [ 'Priority-Low', 'GoodFirstBug', 'Feature-UI', 'Feature-Installer', 'Launch-Milestone-66' ] derived_labels = ['OS-Windows', 'OS-Linux'] self.config.field_defs.append( tracker_bizobj.MakeFieldDef(4, 789, 'UIMocks', tracker_pb2.FieldTypes.URL_TYPE, 'Enhancement', None, False, False, False, None, None, None, False, None, None, None, 'no_action', 'descriptive docstring', False, approval_id=23, is_phase_field=False)) self.config.field_defs.append( tracker_bizobj.MakeFieldDef(5, 789, 'LegalFAQs', tracker_pb2.FieldTypes.URL_TYPE, 'Enhancement', None, False, False, False, None, None, None, False, None, None, None, 'no_action', 'descriptive docstring', False, approval_id=26, is_phase_field=False)) self.config.field_defs.append( tracker_bizobj.MakeFieldDef(23, 789, 'Legal', tracker_pb2.FieldTypes.APPROVAL_TYPE, 'Enhancement', None, False, False, False, None, None, None, False, None, None, None, 'no_action', 'descriptive docstring', False, approval_id=None, is_phase_field=False)) self.config.field_defs.append( tracker_bizobj.MakeFieldDef(26, 789, 'UI', tracker_pb2.FieldTypes.APPROVAL_TYPE, 'Enhancement', None, False, False, False, None, None, None, False, None, None, None, 'no_action', 'descriptive docstring', False, approval_id=None, is_phase_field=False)) self.config.field_defs.append( tracker_bizobj.MakeFieldDef(27, 789, 'M-Target', tracker_pb2.FieldTypes.INT_TYPE, 'Enhancement', None, False, False, False, None, None, None, False, None, None, None, 'no_action', 'descriptive docstring', False, approval_id=None, is_phase_field=True)) field_values = [ tracker_bizobj.MakeFieldValue(1, 5, None, None, None, None, False), tracker_bizobj.MakeFieldValue(27, 74, None, None, None, None, False, phase_id=3), # phase_id=4 does not belong to any of the phases given below. # this field value should not show up in the views. tracker_bizobj.MakeFieldValue(27, 79, None, None, None, None, False, phase_id=4), ] users_by_id = {} phase_1 = tracker_pb2.Phase(phase_id=1, name='Stable') phase_2 = tracker_pb2.Phase(phase_id=2, name='Beta') phase_3 = tracker_pb2.Phase(phase_id=3, name='stable') fvvs = tracker_views.MakeAllFieldValueViews( self.config, labels, derived_labels, field_values, users_by_id, parent_approval_ids=[23], phases=[phase_1, phase_2, phase_3]) self.assertEqual(9, len(fvvs)) # Values are sorted by (applicable_type, field_name). logging.info([fv.field_name for fv in fvvs]) (estdays_fvv, launch_milestone_fvv, legal_fvv, legal_faq_fvv, beta_mtarget_fvv, stable_mtarget_fvv, os_fvv, ui_fvv, ui_mocks_fvv) = fvvs self.assertEqual('EstDays', estdays_fvv.field_name) self.assertEqual(1, len(estdays_fvv.values)) self.assertEqual(0, len(estdays_fvv.derived_values)) self.assertEqual('Launch-Milestone', launch_milestone_fvv.field_name) self.assertEqual(1, len(launch_milestone_fvv.values)) self.assertEqual(0, len(launch_milestone_fvv.derived_values)) self.assertEqual('OS', os_fvv.field_name) self.assertEqual(0, len(os_fvv.values)) self.assertEqual(2, len(os_fvv.derived_values)) self.assertEqual(ui_mocks_fvv.field_name, 'UIMocks') self.assertEqual(ui_mocks_fvv.phase_name, '') self.assertTrue(ui_mocks_fvv.applicable) self.assertEqual(legal_faq_fvv.field_name, 'LegalFAQs') self.assertFalse(legal_faq_fvv.applicable) self.assertFalse(legal_fvv.applicable) self.assertFalse(ui_fvv.applicable) self.assertEqual('M-Target', stable_mtarget_fvv.field_name) self.assertEqual('stable', stable_mtarget_fvv.phase_name) self.assertEqual(1, len(stable_mtarget_fvv.values)) self.assertEqual(74, stable_mtarget_fvv.values[0].val) self.assertEqual(0, len(stable_mtarget_fvv.derived_values)) self.assertEqual('M-Target', beta_mtarget_fvv.field_name) self.assertEqual('beta', beta_mtarget_fvv.phase_name) self.assertEqual(0, len(beta_mtarget_fvv.values)) self.assertEqual(0, len(beta_mtarget_fvv.values))
def testCreateIssueTemplateDef(self): fv = tracker_bizobj.MakeFieldValue(1, None, 'somestring', None, None, None, False) av_23 = tracker_pb2.ApprovalValue( approval_id=23, phase_id=11, status=tracker_pb2.ApprovalStatus.NEEDS_REVIEW) av_24 = tracker_pb2.ApprovalValue(approval_id=24, phase_id=11) approval_values = [av_23, av_24] phases = [tracker_pb2.Phase(name='Canary', rank=11, phase_id=11)] actual_template_id = self.template_service.CreateIssueTemplateDef( self.cnxn, 789, 'template', 'content', 'summary', True, 'Available', True, True, True, owner_id=111, labels=['label'], component_ids=[3], admin_ids=[222], field_values=[fv], phases=phases, approval_values=approval_values) self.assertEqual(1, actual_template_id) self.template_service.template_tbl.InsertRow\ .assert_called_once_with(self.cnxn, project_id=789, name='template', content='content', summary='summary', summary_must_be_edited=True, owner_id=111, status='Available', members_only=True, owner_defaults_to_member=True, component_required=True, commit=False) self.template_service.template2label_tbl.InsertRows\ .assert_called_once_with(self.cnxn, template_svc.TEMPLATE2LABEL_COLS, [(1, 'label')], commit=False) self.template_service.template2component_tbl.InsertRows\ .assert_called_once_with(self.cnxn, template_svc.TEMPLATE2COMPONENT_COLS, [(1, 3)], commit=False) self.template_service.template2admin_tbl.InsertRows\ .assert_called_once_with(self.cnxn, template_svc.TEMPLATE2ADMIN_COLS, [(1, 222)], commit=False) self.template_service.template2fieldvalue_tbl.InsertRows\ .assert_called_once_with(self.cnxn, template_svc.TEMPLATE2FIELDVALUE_COLS, [(1, 1, None, 'somestring', None, None, None)], commit=False) self.template_service.issuephasedef_tbl.InsertRow\ .assert_called_once_with(self.cnxn, name='Canary', rank=11, commit=False) self.template_service.template2approvalvalue_tbl.InsertRows\ .assert_called_once_with(self.cnxn, template_svc.TEMPLATE2APPROVALVALUE_COLS, [(23, 1, 81, 'needs_review'), (24, 1, 81, 'not_set')], commit=False) self.cnxn.Commit.assert_called_once_with() self.template_service.template_set_2lc.InvalidateKeys\ .assert_called_once_with(self.cnxn, [789])
def FetchItems(self, cnxn, keys): """On RAM and memcache miss, hit the database. Args: cnxn: A MonorailConnection. keys: A list of template IDs (ints). Returns: A dict of {template_id: TemplateDef}. """ template_dict = {} # Fetch template rows and relations. template_rows = self.template_service.template_tbl.Select( cnxn, cols=TEMPLATE_COLS, id=keys, order_by=[('name', [])]) template2label_rows = self.template_service.\ template2label_tbl.Select( cnxn, cols=TEMPLATE2LABEL_COLS, template_id=keys) template2component_rows = self.template_service.\ template2component_tbl.Select( cnxn, cols=TEMPLATE2COMPONENT_COLS, template_id=keys) template2admin_rows = self.template_service.template2admin_tbl.Select( cnxn, cols=TEMPLATE2ADMIN_COLS, template_id=keys) template2fieldvalue_rows = self.template_service.\ template2fieldvalue_tbl.Select( cnxn, cols=TEMPLATE2FIELDVALUE_COLS, template_id=keys) template2approvalvalue_rows = self.template_service.\ template2approvalvalue_tbl.Select( cnxn, cols=TEMPLATE2APPROVALVALUE_COLS, template_id=keys) phase_ids = [av_row[2] for av_row in template2approvalvalue_rows] phase_rows = self.template_service.issuephasedef_tbl.Select( cnxn, cols=ISSUEPHASEDEF_COLS, id=list(set(phase_ids))) # Build TemplateDef with all related data. for template_row in template_rows: template = UnpackTemplate(template_row) template_dict[template.template_id] = template for template2label_row in template2label_rows: template_id, label = template2label_row template = template_dict.get(template_id) if template: template.labels.append(label) for template2component_row in template2component_rows: template_id, component_id = template2component_row template = template_dict.get(template_id) if template: template.component_ids.append(component_id) for template2admin_row in template2admin_rows: template_id, admin_id = template2admin_row template = template_dict.get(template_id) if template: template.admin_ids.append(admin_id) for fv_row in template2fieldvalue_rows: (template_id, field_id, int_value, str_value, user_id, date_value, url_value) = fv_row fv = tracker_bizobj.MakeFieldValue( field_id, int_value, str_value, user_id, date_value, url_value, False) template = template_dict.get(template_id) if template: template.field_values.append(fv) phases_by_id = {} for phase_row in phase_rows: (phase_id, name, rank) = phase_row phase = tracker_pb2.Phase( phase_id=phase_id, name=name, rank=rank) phases_by_id[phase_id] = phase # Note: there is no templateapproval2approver_tbl. for av_row in template2approvalvalue_rows: (approval_id, template_id, phase_id, status) = av_row approval_value = tracker_pb2.ApprovalValue( approval_id=approval_id, phase_id=phase_id, status=tracker_pb2.ApprovalStatus(status.upper())) template = template_dict.get(template_id) if template: template.approval_values.append(approval_value) phase = phases_by_id.get(phase_id) if phase and phase not in template.phases: template_dict.get(template_id).phases.append(phase) return template_dict
def testNotifyApprovalChangeTask_Normal(self): config = self.services.config.GetProjectConfig('cnxn', 12345) config.field_defs = [ # issue's User field with any_comment is notified. tracker_bizobj.MakeFieldDef( 121, 12345, 'TL', tracker_pb2.FieldTypes.USER_TYPE, '', '', False, False, False, None, None, None, False, '', None, tracker_pb2.NotifyTriggers.ANY_COMMENT, 'no_action', 'TL, notified on everything', False), # issue's User field with never is not notified. tracker_bizobj.MakeFieldDef( 122, 12345, 'silentTL', tracker_pb2.FieldTypes.USER_TYPE, '', '', False, False, False, None, None, None, False, '', None, tracker_pb2.NotifyTriggers.NEVER, 'no_action', 'TL, notified on nothing', False), # approval's User field with any_comment is notified. tracker_bizobj.MakeFieldDef(123, 12345, 'otherapprovalTL', tracker_pb2.FieldTypes.USER_TYPE, '', '', False, False, False, None, None, None, False, '', None, tracker_pb2.NotifyTriggers.ANY_COMMENT, 'no_action', 'TL on the approvers team', False, approval_id=3), # another approval's User field with any_comment is not notified. tracker_bizobj.MakeFieldDef(124, 12345, 'otherapprovalTL', tracker_pb2.FieldTypes.USER_TYPE, '', '', False, False, False, None, None, None, False, '', None, tracker_pb2.NotifyTriggers.ANY_COMMENT, 'no_action', 'TL on another approvers team', False, approval_id=4), tracker_bizobj.MakeFieldDef(3, 12345, 'Goat-Approval', tracker_pb2.FieldTypes.APPROVAL_TYPE, '', '', False, False, False, None, None, None, False, '', None, tracker_pb2.NotifyTriggers.NEVER, 'no_action', 'Get Approval from Goats', False) ] self.services.config.StoreConfig('cnxn', config) # Custom user_type field TLs self.services.user.TestAddUser('*****@*****.**', 111) self.services.user.TestAddUser('*****@*****.**', 222) self.services.user.TestAddUser('*****@*****.**', 333) self.services.user.TestAddUser('*****@*****.**', 444) # Approvers self.services.user.TestAddUser('*****@*****.**', 777) self.services.user.TestAddUser('*****@*****.**', 888) self.services.user.TestAddUser('*****@*****.**', 999) self.services.user.TestAddUser('*****@*****.**', 666) self.services.user.TestAddUser('*****@*****.**', 661) self.services.user.TestAddUser('*****@*****.**', 662) self.services.user.TestAddUser('*****@*****.**', 663) self.services.usergroup.TestAddGroupSettings( 666, '*****@*****.**') self.services.usergroup.TestAddMembers(666, [661, 662, 663]) canary_phase = tracker_pb2.Phase(name='Canary', phase_id=1, rank=1) approval_values = [ tracker_pb2.ApprovalValue(approval_id=3, approver_ids=[888, 999, 666, 661]) ] approval_issue = MakeTestIssue(project_id=12345, local_id=2, owner_id=2, reporter_id=1, is_spam=True) approval_issue.phases = [canary_phase] approval_issue.approval_values = approval_values approval_issue.field_values = [ tracker_bizobj.MakeFieldValue(121, None, None, 111, None, None, False), tracker_bizobj.MakeFieldValue(122, None, None, 222, None, None, False), tracker_bizobj.MakeFieldValue(123, None, None, 333, None, None, False), tracker_bizobj.MakeFieldValue(124, None, None, 444, None, None, False), ] self.services.issue.TestAddIssue(approval_issue) amend = tracker_bizobj.MakeApprovalApproversAmendment([888], [777]) comment = tracker_pb2.IssueComment(project_id=12345, user_id=999, issue_id=approval_issue.issue_id, amendments=[amend], timestamp=1234567890, content='just a comment.') attach = tracker_pb2.Attachment(attachment_id=4567, filename='sploot.jpg', mimetype='image/png', gcs_object_id='/pid/attachments/abcd', filesize=(1024 * 1023)) comment.attachments.append(attach) self.services.issue.TestAddComment(comment, approval_issue.local_id) self.services.issue.TestAddAttachment(attach, comment.id, approval_issue.issue_id) task = notify.NotifyApprovalChangeTask(request=None, response=None, services=self.services) params = { 'send_email': 1, 'issue_id': approval_issue.issue_id, 'approval_id': 3, 'comment_id': comment.id, } mr = testing_helpers.MakeMonorailRequest(user_info={'user_id': 1}, params=params, method='POST', services=self.services) result = task.HandleRequest(mr) self.assertTrue('just a comment' in result['tasks'][0]['body']) self.assertTrue('Approvers: -approver' in result['tasks'][0]['body']) self.assertTrue('sploot.jpg' in result['tasks'][0]['body']) self.assertTrue( '/issues/attachment?aid=4567' in result['tasks'][0]['body']) self.assertItemsEqual([ '*****@*****.**', '*****@*****.**', '*****@*****.**', '*****@*****.**', '*****@*****.**', '*****@*****.**', '*****@*****.**', '*****@*****.**' ], result['notified']) # Test no approvers/groups notified # Status change to NEED_INFO does not email approvers. amend2 = tracker_bizobj.MakeApprovalStatusAmendment( tracker_pb2.ApprovalStatus.NEED_INFO) comment2 = tracker_pb2.IssueComment(project_id=12345, user_id=999, issue_id=approval_issue.issue_id, amendments=[amend2], timestamp=1234567891, content='') self.services.issue.TestAddComment(comment2, approval_issue.local_id) task = notify.NotifyApprovalChangeTask(request=None, response=None, services=self.services) params = { 'send_email': 1, 'issue_id': approval_issue.issue_id, 'approval_id': 3, 'comment_id': comment2.id, } mr = testing_helpers.MakeMonorailRequest(user_info={'user_id': 1}, params=params, method='POST', services=self.services) result = task.HandleRequest(mr) self.assertTrue('Status: need_info' in result['tasks'][0]['body']) self.assertItemsEqual( ['*****@*****.**', '*****@*****.**', '*****@*****.**'], result['notified'])
def testComputeUnshownColumns_FieldDefs(self): search_results = [ fake.MakeTestIssue( 789, 1, 'sum 1', 'New', 111, field_values=[ tracker_bizobj.MakeFieldValue( 5, 74, None, None, None, None, False, phase_id=4), tracker_bizobj.MakeFieldValue( 6, 78, None, None, None, None, False, phase_id=5)], phases=[ tracker_pb2.Phase(phase_id=4, name='goats'), tracker_pb2.Phase(phase_id=5, name='sheep')]), fake.MakeTestIssue( 789, 2, 'sum 2', 'New', 111, field_values=[ tracker_bizobj.MakeFieldValue( 5, 74, None, None, None, None, False, phase_id=3), tracker_bizobj.MakeFieldValue( 6, 77, None, None, None, None, False, phase_id=3)], phases=[ tracker_pb2.Phase(phase_id=3, name='Goats'), tracker_pb2.Phase(phase_id=3, name='Goats-Exp')]), ] shown_cols = ['a', 'b', 'a1', 'a2-approver', 'f3', 'goats.g1', 'sheep.g2'] config = tracker_bizobj.MakeDefaultProjectIssueConfig(789) config.default_col_spec = '' config.well_known_labels = [] config.field_defs = [ tracker_bizobj.MakeFieldDef( 1, 789, 'a1', tracker_pb2.FieldTypes.APPROVAL_TYPE, None, None, False, False, False, None, None, None, False, None, None, None, None, 'Tracks review from cows', False), tracker_bizobj.MakeFieldDef( 2, 789, 'a2', tracker_pb2.FieldTypes.APPROVAL_TYPE, None, None, False, False, False, None, None, None, False, None, None, None, None, 'Tracks review from chickens', False), tracker_bizobj.MakeFieldDef( 3, 789, 'f3', tracker_pb2.FieldTypes.STR_TYPE, None, None, False, False, False, None, None, None, False, None, None, None, None, 'cow names', False), tracker_bizobj.MakeFieldDef( 4, 789, 'f4', tracker_pb2.FieldTypes.INT_TYPE, None, None, False, False, False, None, None, None, False, None, None, None, None, 'chicken gobbles', False), tracker_bizobj.MakeFieldDef( 5, 789, 'g1', tracker_pb2.FieldTypes.INT_TYPE, None, None, False, False, False, None, None, None, False, None, None, None, None, 'fluff', False, is_phase_field=True), tracker_bizobj.MakeFieldDef( 6, 789, 'g2', tracker_pb2.FieldTypes.INT_TYPE, None, None, False, False, False, None, None, None, False, None, None, None, None, 'poof', False, is_phase_field=True), ] builtin_cols = [] unshown = table_view_helpers.ComputeUnshownColumns( search_results, shown_cols, config, builtin_cols) self.assertEqual(unshown, [ 'a1-approver', 'a2', 'f4', 'goats-exp.g1', 'goats-exp.g2', 'goats.g2', 'sheep.g1'])