| # 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 table_view_helpers classes and functions.""" |
| from __future__ import print_function |
| from __future__ import division |
| from __future__ import absolute_import |
| |
| import collections |
| import six |
| import unittest |
| |
| from framework import framework_views |
| from framework import table_view_helpers |
| from mrproto import tracker_pb2 |
| from testing import fake |
| from testing import testing_helpers |
| from tracker import tracker_bizobj |
| |
| |
| EMPTY_SEARCH_RESULTS = [] |
| |
| SEARCH_RESULTS_WITH_LABELS = [ |
| fake.MakeTestIssue( |
| 789, 1, 'sum 1', 'New', 111, labels='Priority-High Mstone-1', |
| merged_into=200001, star_count=1), |
| fake.MakeTestIssue( |
| 789, 2, 'sum 2', 'New', 111, labels='Priority-High Mstone-1', |
| merged_into=1, star_count=1), |
| fake.MakeTestIssue( |
| 789, 3, 'sum 3', 'New', 111, labels='Priority-Low Mstone-1.1', |
| merged_into=1, star_count=1), |
| # 'Visibility-Super-High' tests that only first dash counts |
| fake.MakeTestIssue( |
| 789, 4, 'sum 4', 'New', 111, labels='Visibility-Super-High', |
| star_count=1), |
| ] |
| |
| |
| def MakeTestIssue(local_id, issue_id, summary): |
| issue = tracker_pb2.Issue() |
| issue.local_id = local_id |
| issue.issue_id = issue_id |
| issue.summary = summary |
| return issue |
| |
| |
| class TableCellTest(unittest.TestCase): |
| |
| USERS_BY_ID = {} |
| |
| 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, 'foo@example.com', False), |
| 222: framework_views.StuffUserView(222, 'foo2@example.com', True), |
| } |
| |
| self.summary_table_cell_kws = { |
| 'col': None, |
| 'users_by_id': {}, |
| 'non_col_labels': [('lab', False)], |
| 'label_values': {}, |
| 'related_issues': {}, |
| 'config': 'fake_config', |
| } |
| |
| def testTableCellSummary(self): |
| """TableCellSummary stores the data given to it.""" |
| cell = table_view_helpers.TableCellSummary( |
| MakeTestIssue(4, 4, 'Lame default summary.'), |
| **self.summary_table_cell_kws) |
| self.assertEqual(cell.type, table_view_helpers.CELL_TYPE_SUMMARY) |
| self.assertEqual(cell.values[0].item, 'Lame default summary.') |
| self.assertEqual(cell.non_column_labels[0].value, 'lab') |
| |
| def testTableCellSummary_NoPythonEscaping(self): |
| """TableCellSummary stores the summary without escaping it in python.""" |
| cell = table_view_helpers.TableCellSummary( |
| MakeTestIssue(4, 4, '<b>bold</b> "summary".'), |
| **self.summary_table_cell_kws) |
| self.assertEqual(cell.values[0].item,'<b>bold</b> "summary".') |
| |
| def testTableCellCustom_normal(self): |
| """TableCellCustom stores the value of a custom FieldValue.""" |
| cell_dognames = table_view_helpers.TableCellCustom( |
| self.issue, col='dognames', config=self.config) |
| self.assertEqual(cell_dognames.type, table_view_helpers.CELL_TYPE_ATTR) |
| self.assertEqual(cell_dognames.values[0].item, 'Waffles') |
| |
| def testTableCellCustom_phasefields(self): |
| """TableCellCustom stores the value of a custom FieldValue.""" |
| cell_winter = table_view_helpers.TableCellCustom( |
| self.issue, col='winter.goats', config=self.config) |
| self.assertEqual(cell_winter.type, table_view_helpers.CELL_TYPE_ATTR) |
| self.assertEqual(cell_winter.values[0].item, 34) |
| |
| cell_summer = table_view_helpers.TableCellCustom( |
| self.issue, col='summer.goats', config=self.config) |
| self.assertEqual(cell_summer.type, table_view_helpers.CELL_TYPE_ATTR) |
| self.assertEqual(cell_summer.values[0].item, 35) |
| |
| def testTableCellApprovalStatus(self): |
| """TableCellApprovalStatus stores the status of an ApprovalValue.""" |
| cell = table_view_helpers.TableCellApprovalStatus( |
| self.issue, col='Approval', config=self.config) |
| self.assertEqual(cell.type, table_view_helpers.CELL_TYPE_ATTR) |
| self.assertEqual(cell.values[0].item, 'NOT_SET') |
| |
| def testTableCellApprovalApprover(self): |
| """TableCellApprovalApprover stores the approvers of an ApprovalValue.""" |
| cell = table_view_helpers.TableCellApprovalApprover( |
| self.issue, col='Approval-approver', config=self.config, |
| users_by_id=self.users_by_id) |
| self.assertEqual(cell.type, table_view_helpers.CELL_TYPE_ATTR) |
| self.assertEqual(len(cell.values), 2) |
| six.assertCountEqual( |
| self, [cell.values[0].item, cell.values[1].item], |
| ['foo@example.com', 'f...@example.com']) |
| |
| # TODO(jrobbins): TableCellProject, TableCellStars |
| |
| |
| |
| class TableViewHelpersTest(unittest.TestCase): |
| |
| def setUp(self): |
| self.default_cols = 'a b c' |
| self.builtin_cols = ['a', 'b', 'x', 'y', 'z'] |
| self.config = tracker_bizobj.MakeDefaultProjectIssueConfig(789) |
| |
| def testComputeUnshownColumns_CommonCase(self): |
| shown_cols = ['a', 'b', 'c'] |
| config = tracker_bizobj.MakeDefaultProjectIssueConfig(789) |
| config.default_col_spec = self.default_cols |
| config.well_known_labels = [] |
| |
| unshown = table_view_helpers.ComputeUnshownColumns( |
| EMPTY_SEARCH_RESULTS, shown_cols, config, self.builtin_cols) |
| self.assertEqual(unshown, ['x', 'y', 'z']) |
| |
| unshown = table_view_helpers.ComputeUnshownColumns( |
| SEARCH_RESULTS_WITH_LABELS, shown_cols, config, self.builtin_cols) |
| self.assertEqual( |
| unshown, ['Mstone', 'Priority', 'Visibility', 'x', 'y', 'z']) |
| |
| def testComputeUnshownColumns_MoreBuiltins(self): |
| shown_cols = ['a', 'b', 'c', 'x', 'y'] |
| config = tracker_bizobj.MakeDefaultProjectIssueConfig(789) |
| config.default_col_spec = self.default_cols |
| config.well_known_labels = [] |
| |
| unshown = table_view_helpers.ComputeUnshownColumns( |
| EMPTY_SEARCH_RESULTS, shown_cols, config, self.builtin_cols) |
| self.assertEqual(unshown, ['z']) |
| |
| unshown = table_view_helpers.ComputeUnshownColumns( |
| SEARCH_RESULTS_WITH_LABELS, shown_cols, config, self.builtin_cols) |
| self.assertEqual(unshown, ['Mstone', 'Priority', 'Visibility', 'z']) |
| |
| def testComputeUnshownColumns_NotAllDefaults(self): |
| shown_cols = ['a', 'b'] |
| config = tracker_bizobj.MakeDefaultProjectIssueConfig(789) |
| config.default_col_spec = self.default_cols |
| config.well_known_labels = [] |
| |
| unshown = table_view_helpers.ComputeUnshownColumns( |
| EMPTY_SEARCH_RESULTS, shown_cols, config, self.builtin_cols) |
| self.assertEqual(unshown, ['c', 'x', 'y', 'z']) |
| |
| unshown = table_view_helpers.ComputeUnshownColumns( |
| SEARCH_RESULTS_WITH_LABELS, shown_cols, config, self.builtin_cols) |
| self.assertEqual( |
| unshown, ['Mstone', 'Priority', 'Visibility', 'c', 'x', 'y', 'z']) |
| |
| def testComputeUnshownColumns_ExtraNonDefaults(self): |
| shown_cols = ['a', 'b', 'c', 'd', 'e', 'f'] |
| config = tracker_bizobj.MakeDefaultProjectIssueConfig(789) |
| config.default_col_spec = self.default_cols |
| config.well_known_labels = [] |
| |
| unshown = table_view_helpers.ComputeUnshownColumns( |
| EMPTY_SEARCH_RESULTS, shown_cols, config, self.builtin_cols) |
| self.assertEqual(unshown, ['x', 'y', 'z']) |
| |
| unshown = table_view_helpers.ComputeUnshownColumns( |
| SEARCH_RESULTS_WITH_LABELS, shown_cols, config, self.builtin_cols) |
| self.assertEqual( |
| unshown, ['Mstone', 'Priority', 'Visibility', 'x', 'y', 'z']) |
| |
| def testComputeUnshownColumns_UserColumnsShown(self): |
| shown_cols = ['a', 'b', 'c', 'Priority'] |
| config = tracker_bizobj.MakeDefaultProjectIssueConfig(789) |
| config.default_col_spec = self.default_cols |
| config.well_known_labels = [] |
| |
| unshown = table_view_helpers.ComputeUnshownColumns( |
| EMPTY_SEARCH_RESULTS, shown_cols, config, self.builtin_cols) |
| self.assertEqual(unshown, ['x', 'y', 'z']) |
| |
| unshown = table_view_helpers.ComputeUnshownColumns( |
| SEARCH_RESULTS_WITH_LABELS, shown_cols, config, self.builtin_cols) |
| self.assertEqual(unshown, ['Mstone', 'Visibility', 'x', 'y', 'z']) |
| |
| def testComputeUnshownColumns_EverythingShown(self): |
| shown_cols = [ |
| 'a', 'b', 'c', 'x', 'y', 'z', 'Priority', 'Mstone', 'Visibility'] |
| config = tracker_bizobj.MakeDefaultProjectIssueConfig(789) |
| config.default_col_spec = self.default_cols |
| config.well_known_labels = [] |
| |
| unshown = table_view_helpers.ComputeUnshownColumns( |
| EMPTY_SEARCH_RESULTS, shown_cols, config, self.builtin_cols) |
| self.assertEqual(unshown, []) |
| |
| unshown = table_view_helpers.ComputeUnshownColumns( |
| SEARCH_RESULTS_WITH_LABELS, shown_cols, config, self.builtin_cols) |
| self.assertEqual(unshown, []) |
| |
| def testComputeUnshownColumns_NothingShown(self): |
| shown_cols = [] |
| config = tracker_bizobj.MakeDefaultProjectIssueConfig(789) |
| config.default_col_spec = self.default_cols |
| config.well_known_labels = [] |
| |
| unshown = table_view_helpers.ComputeUnshownColumns( |
| EMPTY_SEARCH_RESULTS, shown_cols, config, self.builtin_cols) |
| self.assertEqual(unshown, ['a', 'b', 'c', 'x', 'y', 'z']) |
| |
| unshown = table_view_helpers.ComputeUnshownColumns( |
| SEARCH_RESULTS_WITH_LABELS, shown_cols, config, self.builtin_cols) |
| self.assertEqual( |
| unshown, |
| ['Mstone', 'Priority', 'Visibility', 'a', 'b', 'c', 'x', 'y', 'z']) |
| |
| def testComputeUnshownColumns_NoBuiltins(self): |
| shown_cols = ['a', 'b', 'c'] |
| config = tracker_bizobj.MakeDefaultProjectIssueConfig(789) |
| config.default_col_spec = '' |
| config.well_known_labels = [] |
| builtin_cols = [] |
| |
| unshown = table_view_helpers.ComputeUnshownColumns( |
| EMPTY_SEARCH_RESULTS, shown_cols, config, builtin_cols) |
| self.assertEqual(unshown, []) |
| |
| unshown = table_view_helpers.ComputeUnshownColumns( |
| SEARCH_RESULTS_WITH_LABELS, shown_cols, config, builtin_cols) |
| self.assertEqual(unshown, ['Mstone', 'Priority', 'Visibility']) |
| |
| 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']) |
| |
| def testExtractUniqueValues_NoColumns(self): |
| column_values = table_view_helpers.ExtractUniqueValues( |
| [], SEARCH_RESULTS_WITH_LABELS, {}, self.config, {}) |
| self.assertEqual([], column_values) |
| |
| def testExtractUniqueValues_NoResults(self): |
| cols = ['type', 'priority', 'owner', 'status', 'stars', 'attachments'] |
| column_values = table_view_helpers.ExtractUniqueValues( |
| cols, EMPTY_SEARCH_RESULTS, {}, self.config, {}) |
| self.assertEqual(6, len(column_values)) |
| for index, col in enumerate(cols): |
| self.assertEqual(index, column_values[index].col_index) |
| self.assertEqual(col, column_values[index].column_name) |
| self.assertEqual([], column_values[index].filter_values) |
| |
| def testExtractUniqueValues_ExplicitResults(self): |
| cols = ['priority', 'owner', 'status', 'stars', 'mstone', 'foo'] |
| users_by_id = { |
| 111: framework_views.StuffUserView(111, 'foo@example.com', True), |
| } |
| column_values = table_view_helpers.ExtractUniqueValues( |
| cols, SEARCH_RESULTS_WITH_LABELS, users_by_id, self.config, {}) |
| self.assertEqual(len(cols), len(column_values)) |
| |
| self.assertEqual('priority', column_values[0].column_name) |
| self.assertEqual(['High', 'Low'], column_values[0].filter_values) |
| |
| self.assertEqual('owner', column_values[1].column_name) |
| self.assertEqual(['f...@example.com'], column_values[1].filter_values) |
| |
| self.assertEqual('status', column_values[2].column_name) |
| self.assertEqual(['New'], column_values[2].filter_values) |
| |
| self.assertEqual('stars', column_values[3].column_name) |
| self.assertEqual([1], column_values[3].filter_values) |
| |
| self.assertEqual('mstone', column_values[4].column_name) |
| self.assertEqual(['1', '1.1'], column_values[4].filter_values) |
| |
| self.assertEqual('foo', column_values[5].column_name) |
| self.assertEqual([], column_values[5].filter_values) |
| |
| # self.assertEquals('mergedinto', column_values[6].column_name) |
| # self.assertEquals( |
| # ['1', 'other-project:1'], column_values[6].filter_values) |
| |
| def testExtractUniqueValues_CombinedColumns(self): |
| cols = ['priority/pri', 'owner', 'status', 'stars', 'mstone/milestone'] |
| users_by_id = { |
| 111: framework_views.StuffUserView(111, 'foo@example.com', True), |
| } |
| issue = fake.MakeTestIssue( |
| 789, 5, 'sum 5', 'New', 111, merged_into=200001, |
| labels='Priority-High Pri-0 Milestone-1.0 mstone-1', |
| star_count=15) |
| |
| column_values = table_view_helpers.ExtractUniqueValues( |
| cols, SEARCH_RESULTS_WITH_LABELS + [issue], users_by_id, |
| self.config, {}) |
| self.assertEqual(5, len(column_values)) |
| |
| self.assertEqual('priority/pri', column_values[0].column_name) |
| self.assertEqual(['0', 'High', 'Low'], column_values[0].filter_values) |
| |
| self.assertEqual('owner', column_values[1].column_name) |
| self.assertEqual(['f...@example.com'], column_values[1].filter_values) |
| |
| self.assertEqual('status', column_values[2].column_name) |
| self.assertEqual(['New'], column_values[2].filter_values) |
| |
| self.assertEqual('stars', column_values[3].column_name) |
| self.assertEqual([1, 15], column_values[3].filter_values) |
| |
| self.assertEqual('mstone/milestone', column_values[4].column_name) |
| self.assertEqual(['1', '1.0', '1.1'], column_values[4].filter_values) |
| |
| def testExtractUniqueValues_DerivedValues(self): |
| cols = ['priority', 'milestone', 'owner', 'status'] |
| users_by_id = { |
| 111: framework_views.StuffUserView(111, 'foo@example.com', True), |
| 222: framework_views.StuffUserView(222, 'bar@example.com', True), |
| 333: framework_views.StuffUserView(333, 'lol@example.com', True), |
| } |
| search_results = [ |
| fake.MakeTestIssue( |
| 789, 1, 'sum 1', '', 111, labels='Priority-High Milestone-1.0', |
| derived_labels='Milestone-2.0 Foo', derived_status='Started'), |
| fake.MakeTestIssue( |
| 789, 2, 'sum 2', 'New', 111, labels='Priority-High Milestone-1.0', |
| derived_owner_id=333), # Not seen because of owner_id |
| fake.MakeTestIssue( |
| 789, 3, 'sum 3', 'New', 0, labels='Priority-Low Milestone-1.1', |
| derived_owner_id=222), |
| ] |
| |
| column_values = table_view_helpers.ExtractUniqueValues( |
| cols, search_results, users_by_id, self.config, {}) |
| self.assertEqual(4, len(column_values)) |
| |
| self.assertEqual('priority', column_values[0].column_name) |
| self.assertEqual(['High', 'Low'], column_values[0].filter_values) |
| |
| self.assertEqual('milestone', column_values[1].column_name) |
| self.assertEqual(['1.0', '1.1', '2.0'], column_values[1].filter_values) |
| |
| self.assertEqual('owner', column_values[2].column_name) |
| self.assertEqual( |
| ['b...@example.com', 'f...@example.com'], |
| column_values[2].filter_values) |
| |
| self.assertEqual('status', column_values[3].column_name) |
| self.assertEqual(['New', 'Started'], column_values[3].filter_values) |
| |
| def testExtractUniqueValues_ColumnsRobustness(self): |
| cols = ['reporter', 'cc', 'owner', 'status', 'attachments'] |
| search_results = [ |
| tracker_pb2.Issue(), |
| ] |
| column_values = table_view_helpers.ExtractUniqueValues( |
| cols, search_results, {}, self.config, {}) |
| |
| self.assertEqual(5, len(column_values)) |
| for col_val in column_values: |
| if col_val.column_name == 'attachments': |
| self.assertEqual([0], col_val.filter_values) |
| else: |
| self.assertEqual([], col_val.filter_values) |
| |
| def testMakeTableData_Empty(self): |
| visible_results = [] |
| lower_columns = [] |
| cell_factories = {} |
| table_data = table_view_helpers.MakeTableData( |
| visible_results, [], lower_columns, lower_columns, |
| cell_factories, [], 'unused function', {}, set(), self.config) |
| self.assertEqual([], table_data) |
| |
| lower_columns = ['type', 'priority', 'summary', 'stars'] |
| cell_factories = { |
| 'summary': table_view_helpers.TableCellSummary, |
| 'stars': table_view_helpers.TableCellStars, |
| } |
| |
| table_data = table_view_helpers.MakeTableData( |
| visible_results, [], lower_columns, [], {}, |
| cell_factories, 'unused function', {}, set(), self.config) |
| self.assertEqual([], table_data) |
| |
| def testMakeTableData_Normal(self): |
| art = fake.MakeTestIssue( |
| 789, 1, 'sum 1', 'New', 111, labels='Type-Defect Priority-Medium') |
| visible_results = [art] |
| lower_columns = ['type', 'priority', 'summary', 'stars'] |
| cell_factories = { |
| 'summary': table_view_helpers.TableCellSummary, |
| 'stars': table_view_helpers.TableCellStars, |
| } |
| |
| table_data = table_view_helpers.MakeTableData( |
| visible_results, [], lower_columns, lower_columns, {}, |
| cell_factories, lambda art: 'id', {}, set(), self.config) |
| self.assertEqual(1, len(table_data)) |
| row = table_data[0] |
| self.assertEqual(4, len(row.cells)) |
| self.assertEqual('Defect', row.cells[0].values[0].item) |
| |
| def testMakeTableData_Groups(self): |
| art = fake.MakeTestIssue( |
| 789, 1, 'sum 1', 'New', 111, labels='Type-Defect Priority-Medium') |
| visible_results = [art] |
| lower_columns = ['type', 'priority', 'summary', 'stars'] |
| lower_group_by = ['priority'] |
| cell_factories = { |
| 'summary': table_view_helpers.TableCellSummary, |
| 'stars': table_view_helpers.TableCellStars, |
| } |
| |
| table_data = table_view_helpers.MakeTableData( |
| visible_results, [], lower_columns, lower_group_by, {}, |
| cell_factories, lambda art: 'id', {}, set(), self.config) |
| self.assertEqual(1, len(table_data)) |
| row = table_data[0] |
| self.assertEqual(1, len(row.group.cells)) |
| self.assertEqual('Medium', row.group.cells[0].values[0].item) |
| |
| def testMakeRowData(self): |
| art = fake.MakeTestIssue( |
| 789, 1, 'sum 1', 'New', 111, labels='Type-Defect Priority-Medium', |
| star_count=1) |
| columns = ['type', 'priority', 'summary', 'stars'] |
| |
| cell_factories = [table_view_helpers.TableCellKeyLabels, |
| table_view_helpers.TableCellKeyLabels, |
| table_view_helpers.TableCellSummary, |
| table_view_helpers.TableCellStars] |
| |
| # a result is an table_view_helpers.TableRow object with a "cells" field |
| # containing a list of table_view_helpers.TableCell objects. |
| result = table_view_helpers.MakeRowData( |
| art, columns, {}, cell_factories, {}, set(), self.config, {}) |
| |
| self.assertEqual(len(columns), len(result.cells)) |
| |
| for i in range(len(columns)): |
| cell = result.cells[i] |
| self.assertEqual(i, cell.col_index) |
| |
| self.assertEqual(table_view_helpers.CELL_TYPE_ATTR, result.cells[0].type) |
| self.assertEqual('Defect', result.cells[0].values[0].item) |
| self.assertFalse(result.cells[0].values[0].is_derived) |
| |
| self.assertEqual(table_view_helpers.CELL_TYPE_ATTR, result.cells[1].type) |
| self.assertEqual('Medium', result.cells[1].values[0].item) |
| self.assertFalse(result.cells[1].values[0].is_derived) |
| |
| self.assertEqual( |
| table_view_helpers.CELL_TYPE_SUMMARY, result.cells[2].type) |
| self.assertEqual('sum 1', result.cells[2].values[0].item) |
| self.assertFalse(result.cells[2].values[0].is_derived) |
| |
| self.assertEqual(table_view_helpers.CELL_TYPE_ATTR, result.cells[3].type) |
| self.assertEqual(1, result.cells[3].values[0].item) |
| self.assertFalse(result.cells[3].values[0].is_derived) |
| |
| def testAccumulateLabelValues_Empty(self): |
| label_values, non_col_labels = collections.defaultdict(list), [] |
| table_view_helpers._AccumulateLabelValues( |
| [], [], label_values, non_col_labels) |
| self.assertEqual({}, label_values) |
| self.assertEqual([], non_col_labels) |
| |
| label_values, non_col_labels = collections.defaultdict(list), [] |
| table_view_helpers._AccumulateLabelValues( |
| [], ['Type', 'Priority'], label_values, non_col_labels) |
| self.assertEqual({}, label_values) |
| self.assertEqual([], non_col_labels) |
| |
| def testAccumulateLabelValues_OneWordLabels(self): |
| label_values, non_col_labels = collections.defaultdict(list), [] |
| table_view_helpers._AccumulateLabelValues( |
| ['HelloThere'], [], label_values, non_col_labels) |
| self.assertEqual({}, label_values) |
| self.assertEqual([('HelloThere', False)], non_col_labels) |
| |
| label_values, non_col_labels = collections.defaultdict(list), [] |
| table_view_helpers._AccumulateLabelValues( |
| ['HelloThere'], [], label_values, non_col_labels, is_derived=True) |
| self.assertEqual({}, label_values) |
| self.assertEqual([('HelloThere', True)], non_col_labels) |
| |
| def testAccumulateLabelValues_KeyValueLabels(self): |
| label_values, non_col_labels = collections.defaultdict(list), [] |
| table_view_helpers._AccumulateLabelValues( |
| ['Type-Defect', 'Milestone-Soon'], ['type', 'milestone'], |
| label_values, non_col_labels) |
| self.assertEqual( |
| {'type': [('Defect', False)], |
| 'milestone': [('Soon', False)]}, |
| label_values) |
| self.assertEqual([], non_col_labels) |
| |
| def testAccumulateLabelValues_MultiValueLabels(self): |
| label_values, non_col_labels = collections.defaultdict(list), [] |
| table_view_helpers._AccumulateLabelValues( |
| ['OS-Mac', 'OS-Linux'], ['os', 'arch'], |
| label_values, non_col_labels) |
| self.assertEqual( |
| {'os': [('Mac', False), ('Linux', False)]}, |
| label_values) |
| self.assertEqual([], non_col_labels) |
| |
| def testAccumulateLabelValues_MultiPartLabels(self): |
| label_values, non_col_labels = collections.defaultdict(list), [] |
| table_view_helpers._AccumulateLabelValues( |
| ['OS-Mac-Server', 'OS-Mac-Laptop'], ['os', 'os-mac'], |
| label_values, non_col_labels) |
| self.assertEqual( |
| {'os': [('Mac-Server', False), ('Mac-Laptop', False)], |
| 'os-mac': [('Server', False), ('Laptop', False)], |
| }, |
| label_values) |
| self.assertEqual([], non_col_labels) |
| |
| def testChooseCellFactory(self): |
| """We choose the right kind of table cell for the specified column.""" |
| cell_factories = { |
| 'summary': table_view_helpers.TableCellSummary, |
| 'stars': table_view_helpers.TableCellStars, |
| } |
| os_fd = tracker_bizobj.MakeFieldDef( |
| 1, 789, 'os', tracker_pb2.FieldTypes.ENUM_TYPE, None, None, False, |
| False, False, None, None, None, False, None, None, None, None, |
| 'Operating system', False) |
| deadline_fd = tracker_bizobj.MakeFieldDef( |
| 2, 789, 'deadline', tracker_pb2.FieldTypes.DATE_TYPE, None, None, False, |
| False, False, None, None, None, False, None, None, None, None, |
| 'Deadline to resolve issue', False) |
| approval_fd = tracker_bizobj.MakeFieldDef( |
| 3, 789, 'CowApproval', tracker_pb2.FieldTypes.APPROVAL_TYPE, |
| None, None, False, |
| False, False, None, None, None, False, None, None, None, None, |
| 'Tracks reviews from cows', False) |
| goats_fd = tracker_bizobj.MakeFieldDef( |
| 4, 789, 'goats', tracker_pb2.FieldTypes.INT_TYPE, None, None, False, |
| False, False, None, None, None, False, None, None, None, None, |
| 'Num goats in each phase', False, is_phase_field=True) |
| self.config.field_defs = [os_fd, deadline_fd, approval_fd, goats_fd] |
| |
| # The column is defined in cell_factories. |
| actual = table_view_helpers.ChooseCellFactory( |
| 'summary', cell_factories, self.config) |
| self.assertEqual(table_view_helpers.TableCellSummary, actual) |
| |
| # The column is a composite column. |
| actual = table_view_helpers.ChooseCellFactory( |
| 'summary/stars', cell_factories, self.config) |
| self.assertEqual('FactoryClass', actual.__name__) |
| |
| # The column is a enum custom field, so it is treated like a label. |
| actual = table_view_helpers.ChooseCellFactory( |
| 'os', cell_factories, self.config) |
| self.assertEqual(table_view_helpers.TableCellKeyLabels, actual) |
| |
| # The column is a non-enum custom field. |
| actual = table_view_helpers.ChooseCellFactory( |
| 'deadline', cell_factories, self.config) |
| self.assertEqual( |
| [(table_view_helpers.TableCellCustom, 'deadline'), |
| (table_view_helpers.TableCellKeyLabels, 'deadline')], |
| actual.factory_col_list) |
| |
| # The column is an approval custom field. |
| actual = table_view_helpers.ChooseCellFactory( |
| 'CowApproval', cell_factories, self.config) |
| self.assertEqual( |
| [(table_view_helpers.TableCellApprovalStatus, 'CowApproval'), |
| (table_view_helpers.TableCellKeyLabels, 'CowApproval')], |
| actual.factory_col_list) |
| |
| # The column is an approval custom field with '-approver'. |
| actual = table_view_helpers.ChooseCellFactory( |
| 'CowApproval-approver', cell_factories, self.config) |
| self.assertEqual( |
| [(table_view_helpers.TableCellApprovalApprover, 'CowApproval-approver'), |
| (table_view_helpers.TableCellKeyLabels, 'CowApproval-approver')], |
| actual.factory_col_list) |
| |
| # The column specifies a phase custom field. |
| actual = table_view_helpers.ChooseCellFactory( |
| 'winter.goats', cell_factories, self.config) |
| self.assertEqual( |
| [(table_view_helpers.TableCellCustom, 'winter.goats'), |
| (table_view_helpers.TableCellKeyLabels, 'winter.goats')], |
| actual.factory_col_list) |
| |
| |
| # Column that don't match one of the other cases is assumed to be a label. |
| actual = table_view_helpers.ChooseCellFactory( |
| 'reward', cell_factories, self.config) |
| self.assertEqual(table_view_helpers.TableCellKeyLabels, actual) |
| |
| def testCompositeFactoryTableCell_Empty(self): |
| """If we made a composite of zero columns, it would have no values.""" |
| composite = table_view_helpers.CompositeFactoryTableCell([]) |
| cell = composite('artifact') |
| self.assertEqual([], cell.values) |
| |
| def testCompositeFactoryTableCell_Normal(self): |
| """If we make a composite, it has values from each of the sub cells.""" |
| composite = table_view_helpers.CompositeFactoryTableCell( |
| [(sub_factory_1, 'col1'), |
| (sub_factory_2, 'col2')]) |
| |
| cell = composite('artifact') |
| self.assertEqual( |
| ['sub_cell_1_col1', |
| 'sub_cell_2_col2'], |
| cell.values) |
| |
| def testCompositeColTableCell_Empty(self): |
| """If we made a composite of zero columns, it would have no values.""" |
| composite = table_view_helpers.CompositeColTableCell([], {}, self.config) |
| cell = composite('artifact') |
| self.assertEqual([], cell.values) |
| |
| |
| def testCompositeColTableCell_Normal(self): |
| """If we make a composite, it has values from each of the sub cells.""" |
| composite = table_view_helpers.CompositeColTableCell( |
| ['col1', 'col2'], |
| {'col1': sub_factory_1, 'col2': sub_factory_2}, |
| self.config) |
| cell = composite('artifact') |
| self.assertEqual( |
| ['sub_cell_1_col1', |
| 'sub_cell_2_col2'], |
| cell.values) |
| |
| |
| def sub_factory_1(_art, **kw): |
| return testing_helpers.Blank( |
| values=['sub_cell_1_%s' % kw['col']], |
| non_column_labels=[]) |
| |
| |
| def sub_factory_2(_art, **kw): |
| return testing_helpers.Blank( |
| values=['sub_cell_2_%s' % kw['col']], |
| non_column_labels=[]) |