Index: appengine/monorail/tracker/test/issuelist_test.py |
diff --git a/appengine/monorail/tracker/test/issuelist_test.py b/appengine/monorail/tracker/test/issuelist_test.py |
new file mode 100644 |
index 0000000000000000000000000000000000000000..07770c33094b62e28bc9929f33d2216c245418a6 |
--- /dev/null |
+++ b/appengine/monorail/tracker/test/issuelist_test.py |
@@ -0,0 +1,338 @@ |
+# Copyright 2016 The Chromium Authors. All rights reserved. |
+# Use of this source code is govered by a BSD-style |
+# license that can be found in the LICENSE file or at |
+# https://developers.google.com/open-source/licenses/bsd |
+ |
+"""Unit tests for issuelist module.""" |
+ |
+import unittest |
+ |
+import settings |
+from framework import permissions |
+from framework import table_view_helpers |
+from proto import tracker_pb2 |
+from proto import user_pb2 |
+from services import service_manager |
+from testing import fake |
+from testing import testing_helpers |
+from tracker import issuelist |
+from tracker import tablecell |
+from tracker import tracker_bizobj |
+from tracker import tracker_constants |
+ |
+ |
+class DisplayNameMock(object): |
+ |
+ def __init__(self, name): |
+ self.display_name = name |
+ |
+ |
+class IssueListUnitTest(unittest.TestCase): |
+ |
+ def testGatherPageData(self): |
+ # TODO(jrobbins): write tests for this method. |
+ pass |
+ |
+ def testGetGridViewData(self): |
+ # TODO(jrobbins): write tests for this method. |
+ pass |
+ |
+ def testGetTableViewData(self): |
+ # TODO(jrobbins): write tests for this method. |
+ pass |
+ |
+ def testGatherHelpData_GridSwitchesToIDs(self): |
+ services = service_manager.Services() |
+ servlet = issuelist.IssueList('req', 'res', services=services) |
+ mr = testing_helpers.MakeMonorailRequest() |
+ page_data = {'results': [1, 2, 3]} |
+ |
+ # Don't show cue if in issue list mode (the default). |
+ help_data = servlet.GatherHelpData(mr, page_data) |
+ self.assertNotEqual('showing_ids_instead_of_tiles', help_data['cue']) |
+ |
+ mr.mode = 'grid' |
+ # Don't show cue if showing already IDs (the default). |
+ help_data = servlet.GatherHelpData(mr, page_data) |
+ self.assertNotEqual('showing_ids_instead_of_tiles', help_data['cue']) |
+ |
+ mr.cells = 'counts' |
+ # Don't show cue if showing counts. |
+ help_data = servlet.GatherHelpData(mr, page_data) |
+ self.assertNotEqual('showing_ids_instead_of_tiles', help_data['cue']) |
+ |
+ mr.cells = 'tiles' |
+ # Don't show cue if there were <= 1000 results |
+ help_data = servlet.GatherHelpData(mr, page_data) |
+ self.assertNotEqual('showing_ids_instead_of_tiles', help_data['cue']) |
+ |
+ # Show cue if there are more than 1000 results |
+ page_data = {'results': [1] * (settings.max_tiles_in_grid + 1)} |
+ help_data = servlet.GatherHelpData(mr, page_data) |
+ self.assertEqual('showing_ids_instead_of_tiles', help_data['cue']) |
+ |
+ def testGatherHelpData_KeystrokeHelp(self): |
+ services = service_manager.Services() |
+ servlet = issuelist.IssueList('req', 'res', services=services) |
+ mr = testing_helpers.MakeMonorailRequest() |
+ |
+ page_data = {'table_data': []} |
+ |
+ # Owners and members see a cue to try "?" to see keyboard shortcuts. |
+ mr.perms = permissions.OWNER_ACTIVE_PERMISSIONSET |
+ help_data = servlet.GatherHelpData(mr, page_data) |
+ self.assertEqual('dit_keystrokes', help_data['cue']) |
+ mr.perms = permissions.COMMITTER_ACTIVE_PERMISSIONSET |
+ help_data = servlet.GatherHelpData(mr, page_data) |
+ self.assertEqual('dit_keystrokes', help_data['cue']) |
+ |
+ # Non-members do not see the cue. |
+ mr.perms = permissions.USER_PERMISSIONSET |
+ help_data = servlet.GatherHelpData(mr, page_data) |
+ self.assertEqual(None, help_data['cue']) |
+ |
+ def testGatherHelpData_ItalicsMeanDerived(self): |
+ services = service_manager.Services() |
+ servlet = issuelist.IssueList('req', 'res', services=services) |
+ mr = testing_helpers.MakeMonorailRequest() |
+ |
+ page_data = {'table_data': []} |
+ |
+ cell = table_view_helpers.TableCell( |
+ table_view_helpers.CELL_TYPE_ATTR, [1, 2, 3], |
+ derived_values=[4, 5, 6]) |
+ page_data_with_derived = { |
+ 'table_data': [table_view_helpers.TableRow([cell], True)] |
+ } |
+ |
+ # Owners and members see a cue about italics, iff there are any |
+ # derived values shown in the list. |
+ mr.perms = permissions.OWNER_ACTIVE_PERMISSIONSET |
+ help_data = servlet.GatherHelpData(mr, page_data_with_derived) |
+ self.assertEqual('italics_mean_derived', help_data['cue']) |
+ help_data = servlet.GatherHelpData(mr, page_data) |
+ self.assertNotEqual('italics_mean_derived', help_data['cue']) |
+ mr.perms = permissions.COMMITTER_ACTIVE_PERMISSIONSET |
+ help_data = servlet.GatherHelpData(mr, page_data_with_derived) |
+ self.assertEqual('italics_mean_derived', help_data['cue']) |
+ help_data = servlet.GatherHelpData(mr, page_data) |
+ self.assertNotEqual('italics_mean_derived', help_data['cue']) |
+ |
+ # Non-members do not see the cue. |
+ mr.perms = permissions.USER_PERMISSIONSET |
+ help_data = servlet.GatherHelpData(mr, page_data_with_derived) |
+ self.assertNotEqual('italics_mean_derived', help_data['cue']) |
+ |
+ |
+CELL_FACTORIES = { |
+ 'id': tablecell.TableCellID, |
+ 'summary': table_view_helpers.TableCellSummary, |
+ 'status': tablecell.TableCellStatus, |
+ 'owner': tablecell.TableCellOwner, |
+ } |
+ |
+ |
+class IssueListFunctionsTest(unittest.TestCase): |
+ |
+ def setUp(self): |
+ self.config = tracker_bizobj.MakeDefaultProjectIssueConfig(789) |
+ |
+ def testAnyDerivedValues(self): |
+ cell1 = table_view_helpers.TableCell( |
+ table_view_helpers.CELL_TYPE_SUMMARY, ['this is a summary']) |
+ cell2 = table_view_helpers.TableCell( |
+ table_view_helpers.CELL_TYPE_ATTR, ['value'], |
+ derived_values=['derived']) |
+ |
+ table_data = [ |
+ table_view_helpers.TableRow([cell1], False), |
+ table_view_helpers.TableRow([], False)] |
+ self.assertFalse(issuelist._AnyDerivedValues(table_data)) |
+ |
+ table_data = [ |
+ table_view_helpers.TableRow([cell1, cell2], False), |
+ table_view_helpers.TableRow([], False)] |
+ self.assertTrue(issuelist._AnyDerivedValues(table_data)) |
+ |
+ def testMakeTableData_Normal(self): |
+ issue = fake.MakeTestIssue( |
+ 789, 123, 'summary', 'New', 0, |
+ labels=['Type-Defect', 'Priority-Medium']) |
+ issue.project_name = 'proj' |
+ visible_results = [issue] |
+ |
+ # Standard columns |
+ lower_columns = _GetColumns() |
+ table_data = issuelist._MakeTableData( |
+ visible_results, None, [], lower_columns, [], {}, CELL_FACTORIES, {}, |
+ self.config) |
+ self.assertEqual(1, len(table_data)) |
+ row = table_data[0] |
+ self.assertEqual(len(lower_columns), len(row.cells)) |
+ self.assertEqual([], row.group.cells) |
+ |
+ # Also test row info that we pass to JS code. |
+ self.assertEqual(123, row.local_id) |
+ self.assertEqual('proj', row.project_name) |
+ self.assertEqual('proj:123', row.issue_ref) |
+ self.assertEqual('/p/proj/issues/detail?id=123', row.issue_url) |
+ |
+ # 2 columns -> 2 cells with 1 value in each cell. |
+ lower_columns = ['type', 'priority'] |
+ table_data = issuelist._MakeTableData( |
+ visible_results, None, [], lower_columns, [], {}, CELL_FACTORIES, {}, |
+ self.config) |
+ self.assertEqual(1, len(table_data)) |
+ row = table_data[0] |
+ self.assertEqual(len(lower_columns), len(row.cells)) |
+ self.assertEqual(0, row.cells[0].col_index) |
+ self.assertEqual(1, len(row.cells[0].values)) |
+ self.assertEqual('Defect', row.cells[0].values[0].item) |
+ self.assertEqual(1, row.cells[1].col_index) |
+ self.assertEqual(1, len(row.cells[1].values)) |
+ self.assertEqual('Medium', row.cells[1].values[0].item) |
+ self.assertEqual([], row.group.cells) |
+ |
+ def testMakeTableData_Combined(self): |
+ issue = fake.MakeTestIssue( |
+ 789, 1, 'summary', 'New', 0, labels=['Type-Defect', 'Priority-Medium']) |
+ visible_results = [issue] |
+ |
+ # A combined column -> 1 cell with 2 values in it. |
+ lower_columns = ['type/priority'] |
+ table_data = issuelist._MakeTableData( |
+ visible_results, None, [], lower_columns, [], {}, CELL_FACTORIES, {}, |
+ self.config) |
+ self.assertEqual(1, len(table_data)) |
+ row = table_data[0] |
+ self.assertEqual(len(lower_columns), len(row.cells)) |
+ self.assertEqual(0, row.cells[0].col_index) |
+ self.assertEqual(2, len(row.cells[0].values)) |
+ self.assertEqual('Defect', row.cells[0].values[0].item) |
+ self.assertEqual('Medium', row.cells[0].values[1].item) |
+ self.assertEqual([], row.group.cells) |
+ |
+ def testMakeTableData_GroupBy(self): |
+ issue = fake.MakeTestIssue( |
+ 789, 1, 'summary', 'New', 0, labels=['Type-Defect', 'Priority-Medium']) |
+ visible_results = [issue] |
+ |
+ # 2 columns -> 2 cells with 1 value in each cell, row is part of a 1-row |
+ # group of issues with type=defect. |
+ lower_columns = ['type', 'priority'] |
+ table_data = issuelist._MakeTableData( |
+ visible_results, None, [], lower_columns, ['type'], {}, CELL_FACTORIES, |
+ {}, self.config) |
+ self.assertEqual(1, len(table_data)) |
+ row = table_data[0] |
+ self.assertEqual(len(lower_columns), len(row.cells)) |
+ self.assertEqual(0, row.cells[0].col_index) |
+ self.assertEqual(1, len(row.cells[0].values)) |
+ self.assertEqual('Defect', row.cells[0].values[0].item) |
+ self.assertEqual(1, row.cells[1].col_index) |
+ self.assertEqual(1, len(row.cells[1].values)) |
+ self.assertEqual('Medium', row.cells[1].values[0].item) |
+ self.assertEqual(1, len(row.group.cells)) |
+ self.assertEqual('Defect', row.group.cells[0].values[0].item) |
+ |
+ def testGetStarredIssues_Anon(self): |
+ services = service_manager.Services(issue_star=fake.IssueStarService()) |
+ mr = testing_helpers.MakeMonorailRequest() |
+ |
+ self.assertEqual(set(), issuelist._GetStarredIssues( |
+ mr.cnxn, mr.auth.user_id, services)) |
+ |
+ def testGetStarredIssues_SignedIn(self): |
+ services = service_manager.Services( |
+ config=fake.ConfigService(), |
+ issue=fake.IssueService(), |
+ user=fake.UserService(), |
+ issue_star=fake.IssueStarService()) |
+ project = fake.Project(project_name='proj', project_id=789) |
+ mr = testing_helpers.MakeMonorailRequest( |
+ project=project, user_info={'user_id': 111L}) |
+ |
+ # User has not starred anything yet. |
+ self.assertEqual(set(), issuelist._GetStarredIssues( |
+ mr.cnxn, mr.auth.user_id, services)) |
+ |
+ # User starred 2 issues in 1 project. Other users have also starred stuff. |
+ cnxn = 'fake connection' |
+ config = services.config.GetProjectConfig(cnxn, project.project_id) |
+ services.issue_star.SetStar( |
+ cnxn, services, config, 100001, 111L, True) |
+ services.issue_star.SetStar( |
+ cnxn, services, config, 100002, 111L, True) |
+ services.issue_star.SetStar( |
+ cnxn, services, config, 100002, 111L, True) |
+ services.issue_star.SetStar( |
+ cnxn, services, config, 100099, 999L, True) |
+ self.assertEqual( |
+ {100001, 100002}, |
+ issuelist._GetStarredIssues(mr.cnxn, mr.auth.user_id, services)) |
+ |
+ def testGetStarredIssues_CrossProject(self): |
+ services = service_manager.Services( |
+ config=fake.ConfigService(), |
+ issue=fake.IssueService(), |
+ issue_star=fake.IssueStarService()) |
+ project = fake.Project(project_name='proj', project_id=789) |
+ mr = testing_helpers.MakeMonorailRequest( |
+ project=project, user_info={'user_id': 111L}) |
+ mr.query = 'project=proj,otherproj' |
+ |
+ # User has not starred anything yet. |
+ self.assertEqual(set(), issuelist._GetStarredIssues( |
+ mr.cnxn, mr.auth.user_id, services)) |
+ |
+ # User starred 2 issues in 1 project, and 1 in another project. |
+ # Other users have also starred stuff. |
+ cnxn = 'fake connection' |
+ config = services.config.GetProjectConfig(cnxn, project.project_id) |
+ services.issue_star.SetStar( |
+ cnxn, services, config, 100001, 111L, True) |
+ services.issue_star.SetStar( |
+ cnxn, services, config, 100002, 111L, True) |
+ services.issue_star.SetStar( |
+ cnxn, services, config, 100002, 999L, True) |
+ services.issue_star.SetStar( |
+ cnxn, services, config, 100099, 999L, True) |
+ services.issue_star.SetStar( |
+ cnxn, services, config, 200001, 111L, True) |
+ services.issue_star.SetStar( |
+ cnxn, services, config, 200001, 999L, True) |
+ services.issue_star.SetStar( |
+ cnxn, services, config, 200099, 999L, True) |
+ self.assertEqual( |
+ {100001, 100002, 200001}, |
+ issuelist._GetStarredIssues(mr.cnxn, mr.auth.user_id, services)) |
+ |
+ def testShouldPreviewOnHover(self): |
+ saved_flag = settings.enable_quick_edit |
+ user = user_pb2.User() |
+ |
+ settings.enable_quick_edit = True |
+ user.preview_on_hover = True |
+ self.assertTrue(issuelist._ShouldPreviewOnHover(user)) |
+ user.preview_on_hover = False |
+ self.assertFalse(issuelist._ShouldPreviewOnHover(user)) |
+ |
+ settings.enable_quick_edit = False |
+ user.preview_on_hover = True |
+ self.assertFalse(issuelist._ShouldPreviewOnHover(user)) |
+ user.preview_on_hover = False |
+ self.assertFalse(issuelist._ShouldPreviewOnHover(user)) |
+ |
+ settings.enable_quick_edit = saved_flag |
+ |
+ |
+def _GetColumns(): |
+ """Return a list of all well known column names.""" |
+ |
+ columns = tracker_constants.DEFAULT_COL_SPEC.split() |
+ columns.extend(tracker_constants.OTHER_BUILT_IN_COLS) |
+ return [c.lower() for c in columns] |
+ |
+ |
+if __name__ == '__main__': |
+ unittest.main() |