OLD | NEW |
(Empty) | |
| 1 # Copyright 2016 The Chromium Authors. All rights reserved. |
| 2 # Use of this source code is govered by a BSD-style |
| 3 # license that can be found in the LICENSE file or at |
| 4 # https://developers.google.com/open-source/licenses/bsd |
| 5 |
| 6 """Unit tests for issuelist module.""" |
| 7 |
| 8 import unittest |
| 9 |
| 10 import settings |
| 11 from framework import permissions |
| 12 from framework import table_view_helpers |
| 13 from proto import tracker_pb2 |
| 14 from proto import user_pb2 |
| 15 from services import service_manager |
| 16 from testing import fake |
| 17 from testing import testing_helpers |
| 18 from tracker import issuelist |
| 19 from tracker import tablecell |
| 20 from tracker import tracker_bizobj |
| 21 from tracker import tracker_constants |
| 22 |
| 23 |
| 24 class DisplayNameMock(object): |
| 25 |
| 26 def __init__(self, name): |
| 27 self.display_name = name |
| 28 |
| 29 |
| 30 class IssueListUnitTest(unittest.TestCase): |
| 31 |
| 32 def testGatherPageData(self): |
| 33 # TODO(jrobbins): write tests for this method. |
| 34 pass |
| 35 |
| 36 def testGetGridViewData(self): |
| 37 # TODO(jrobbins): write tests for this method. |
| 38 pass |
| 39 |
| 40 def testGetTableViewData(self): |
| 41 # TODO(jrobbins): write tests for this method. |
| 42 pass |
| 43 |
| 44 def testGatherHelpData_GridSwitchesToIDs(self): |
| 45 services = service_manager.Services() |
| 46 servlet = issuelist.IssueList('req', 'res', services=services) |
| 47 mr = testing_helpers.MakeMonorailRequest() |
| 48 page_data = {'results': [1, 2, 3]} |
| 49 |
| 50 # Don't show cue if in issue list mode (the default). |
| 51 help_data = servlet.GatherHelpData(mr, page_data) |
| 52 self.assertNotEqual('showing_ids_instead_of_tiles', help_data['cue']) |
| 53 |
| 54 mr.mode = 'grid' |
| 55 # Don't show cue if showing already IDs (the default). |
| 56 help_data = servlet.GatherHelpData(mr, page_data) |
| 57 self.assertNotEqual('showing_ids_instead_of_tiles', help_data['cue']) |
| 58 |
| 59 mr.cells = 'counts' |
| 60 # Don't show cue if showing counts. |
| 61 help_data = servlet.GatherHelpData(mr, page_data) |
| 62 self.assertNotEqual('showing_ids_instead_of_tiles', help_data['cue']) |
| 63 |
| 64 mr.cells = 'tiles' |
| 65 # Don't show cue if there were <= 1000 results |
| 66 help_data = servlet.GatherHelpData(mr, page_data) |
| 67 self.assertNotEqual('showing_ids_instead_of_tiles', help_data['cue']) |
| 68 |
| 69 # Show cue if there are more than 1000 results |
| 70 page_data = {'results': [1] * (settings.max_tiles_in_grid + 1)} |
| 71 help_data = servlet.GatherHelpData(mr, page_data) |
| 72 self.assertEqual('showing_ids_instead_of_tiles', help_data['cue']) |
| 73 |
| 74 def testGatherHelpData_KeystrokeHelp(self): |
| 75 services = service_manager.Services() |
| 76 servlet = issuelist.IssueList('req', 'res', services=services) |
| 77 mr = testing_helpers.MakeMonorailRequest() |
| 78 |
| 79 page_data = {'table_data': []} |
| 80 |
| 81 # Owners and members see a cue to try "?" to see keyboard shortcuts. |
| 82 mr.perms = permissions.OWNER_ACTIVE_PERMISSIONSET |
| 83 help_data = servlet.GatherHelpData(mr, page_data) |
| 84 self.assertEqual('dit_keystrokes', help_data['cue']) |
| 85 mr.perms = permissions.COMMITTER_ACTIVE_PERMISSIONSET |
| 86 help_data = servlet.GatherHelpData(mr, page_data) |
| 87 self.assertEqual('dit_keystrokes', help_data['cue']) |
| 88 |
| 89 # Non-members do not see the cue. |
| 90 mr.perms = permissions.USER_PERMISSIONSET |
| 91 help_data = servlet.GatherHelpData(mr, page_data) |
| 92 self.assertEqual(None, help_data['cue']) |
| 93 |
| 94 def testGatherHelpData_ItalicsMeanDerived(self): |
| 95 services = service_manager.Services() |
| 96 servlet = issuelist.IssueList('req', 'res', services=services) |
| 97 mr = testing_helpers.MakeMonorailRequest() |
| 98 |
| 99 page_data = {'table_data': []} |
| 100 |
| 101 cell = table_view_helpers.TableCell( |
| 102 table_view_helpers.CELL_TYPE_ATTR, [1, 2, 3], |
| 103 derived_values=[4, 5, 6]) |
| 104 page_data_with_derived = { |
| 105 'table_data': [table_view_helpers.TableRow([cell], True)] |
| 106 } |
| 107 |
| 108 # Owners and members see a cue about italics, iff there are any |
| 109 # derived values shown in the list. |
| 110 mr.perms = permissions.OWNER_ACTIVE_PERMISSIONSET |
| 111 help_data = servlet.GatherHelpData(mr, page_data_with_derived) |
| 112 self.assertEqual('italics_mean_derived', help_data['cue']) |
| 113 help_data = servlet.GatherHelpData(mr, page_data) |
| 114 self.assertNotEqual('italics_mean_derived', help_data['cue']) |
| 115 mr.perms = permissions.COMMITTER_ACTIVE_PERMISSIONSET |
| 116 help_data = servlet.GatherHelpData(mr, page_data_with_derived) |
| 117 self.assertEqual('italics_mean_derived', help_data['cue']) |
| 118 help_data = servlet.GatherHelpData(mr, page_data) |
| 119 self.assertNotEqual('italics_mean_derived', help_data['cue']) |
| 120 |
| 121 # Non-members do not see the cue. |
| 122 mr.perms = permissions.USER_PERMISSIONSET |
| 123 help_data = servlet.GatherHelpData(mr, page_data_with_derived) |
| 124 self.assertNotEqual('italics_mean_derived', help_data['cue']) |
| 125 |
| 126 |
| 127 CELL_FACTORIES = { |
| 128 'id': tablecell.TableCellID, |
| 129 'summary': table_view_helpers.TableCellSummary, |
| 130 'status': tablecell.TableCellStatus, |
| 131 'owner': tablecell.TableCellOwner, |
| 132 } |
| 133 |
| 134 |
| 135 class IssueListFunctionsTest(unittest.TestCase): |
| 136 |
| 137 def setUp(self): |
| 138 self.config = tracker_bizobj.MakeDefaultProjectIssueConfig(789) |
| 139 |
| 140 def testAnyDerivedValues(self): |
| 141 cell1 = table_view_helpers.TableCell( |
| 142 table_view_helpers.CELL_TYPE_SUMMARY, ['this is a summary']) |
| 143 cell2 = table_view_helpers.TableCell( |
| 144 table_view_helpers.CELL_TYPE_ATTR, ['value'], |
| 145 derived_values=['derived']) |
| 146 |
| 147 table_data = [ |
| 148 table_view_helpers.TableRow([cell1], False), |
| 149 table_view_helpers.TableRow([], False)] |
| 150 self.assertFalse(issuelist._AnyDerivedValues(table_data)) |
| 151 |
| 152 table_data = [ |
| 153 table_view_helpers.TableRow([cell1, cell2], False), |
| 154 table_view_helpers.TableRow([], False)] |
| 155 self.assertTrue(issuelist._AnyDerivedValues(table_data)) |
| 156 |
| 157 def testMakeTableData_Normal(self): |
| 158 issue = fake.MakeTestIssue( |
| 159 789, 123, 'summary', 'New', 0, |
| 160 labels=['Type-Defect', 'Priority-Medium']) |
| 161 issue.project_name = 'proj' |
| 162 visible_results = [issue] |
| 163 |
| 164 # Standard columns |
| 165 lower_columns = _GetColumns() |
| 166 table_data = issuelist._MakeTableData( |
| 167 visible_results, None, [], lower_columns, [], {}, CELL_FACTORIES, {}, |
| 168 self.config) |
| 169 self.assertEqual(1, len(table_data)) |
| 170 row = table_data[0] |
| 171 self.assertEqual(len(lower_columns), len(row.cells)) |
| 172 self.assertEqual([], row.group.cells) |
| 173 |
| 174 # Also test row info that we pass to JS code. |
| 175 self.assertEqual(123, row.local_id) |
| 176 self.assertEqual('proj', row.project_name) |
| 177 self.assertEqual('proj:123', row.issue_ref) |
| 178 self.assertEqual('/p/proj/issues/detail?id=123', row.issue_url) |
| 179 |
| 180 # 2 columns -> 2 cells with 1 value in each cell. |
| 181 lower_columns = ['type', 'priority'] |
| 182 table_data = issuelist._MakeTableData( |
| 183 visible_results, None, [], lower_columns, [], {}, CELL_FACTORIES, {}, |
| 184 self.config) |
| 185 self.assertEqual(1, len(table_data)) |
| 186 row = table_data[0] |
| 187 self.assertEqual(len(lower_columns), len(row.cells)) |
| 188 self.assertEqual(0, row.cells[0].col_index) |
| 189 self.assertEqual(1, len(row.cells[0].values)) |
| 190 self.assertEqual('Defect', row.cells[0].values[0].item) |
| 191 self.assertEqual(1, row.cells[1].col_index) |
| 192 self.assertEqual(1, len(row.cells[1].values)) |
| 193 self.assertEqual('Medium', row.cells[1].values[0].item) |
| 194 self.assertEqual([], row.group.cells) |
| 195 |
| 196 def testMakeTableData_Combined(self): |
| 197 issue = fake.MakeTestIssue( |
| 198 789, 1, 'summary', 'New', 0, labels=['Type-Defect', 'Priority-Medium']) |
| 199 visible_results = [issue] |
| 200 |
| 201 # A combined column -> 1 cell with 2 values in it. |
| 202 lower_columns = ['type/priority'] |
| 203 table_data = issuelist._MakeTableData( |
| 204 visible_results, None, [], lower_columns, [], {}, CELL_FACTORIES, {}, |
| 205 self.config) |
| 206 self.assertEqual(1, len(table_data)) |
| 207 row = table_data[0] |
| 208 self.assertEqual(len(lower_columns), len(row.cells)) |
| 209 self.assertEqual(0, row.cells[0].col_index) |
| 210 self.assertEqual(2, len(row.cells[0].values)) |
| 211 self.assertEqual('Defect', row.cells[0].values[0].item) |
| 212 self.assertEqual('Medium', row.cells[0].values[1].item) |
| 213 self.assertEqual([], row.group.cells) |
| 214 |
| 215 def testMakeTableData_GroupBy(self): |
| 216 issue = fake.MakeTestIssue( |
| 217 789, 1, 'summary', 'New', 0, labels=['Type-Defect', 'Priority-Medium']) |
| 218 visible_results = [issue] |
| 219 |
| 220 # 2 columns -> 2 cells with 1 value in each cell, row is part of a 1-row |
| 221 # group of issues with type=defect. |
| 222 lower_columns = ['type', 'priority'] |
| 223 table_data = issuelist._MakeTableData( |
| 224 visible_results, None, [], lower_columns, ['type'], {}, CELL_FACTORIES, |
| 225 {}, self.config) |
| 226 self.assertEqual(1, len(table_data)) |
| 227 row = table_data[0] |
| 228 self.assertEqual(len(lower_columns), len(row.cells)) |
| 229 self.assertEqual(0, row.cells[0].col_index) |
| 230 self.assertEqual(1, len(row.cells[0].values)) |
| 231 self.assertEqual('Defect', row.cells[0].values[0].item) |
| 232 self.assertEqual(1, row.cells[1].col_index) |
| 233 self.assertEqual(1, len(row.cells[1].values)) |
| 234 self.assertEqual('Medium', row.cells[1].values[0].item) |
| 235 self.assertEqual(1, len(row.group.cells)) |
| 236 self.assertEqual('Defect', row.group.cells[0].values[0].item) |
| 237 |
| 238 def testGetStarredIssues_Anon(self): |
| 239 services = service_manager.Services(issue_star=fake.IssueStarService()) |
| 240 mr = testing_helpers.MakeMonorailRequest() |
| 241 |
| 242 self.assertEqual(set(), issuelist._GetStarredIssues( |
| 243 mr.cnxn, mr.auth.user_id, services)) |
| 244 |
| 245 def testGetStarredIssues_SignedIn(self): |
| 246 services = service_manager.Services( |
| 247 config=fake.ConfigService(), |
| 248 issue=fake.IssueService(), |
| 249 user=fake.UserService(), |
| 250 issue_star=fake.IssueStarService()) |
| 251 project = fake.Project(project_name='proj', project_id=789) |
| 252 mr = testing_helpers.MakeMonorailRequest( |
| 253 project=project, user_info={'user_id': 111L}) |
| 254 |
| 255 # User has not starred anything yet. |
| 256 self.assertEqual(set(), issuelist._GetStarredIssues( |
| 257 mr.cnxn, mr.auth.user_id, services)) |
| 258 |
| 259 # User starred 2 issues in 1 project. Other users have also starred stuff. |
| 260 cnxn = 'fake connection' |
| 261 config = services.config.GetProjectConfig(cnxn, project.project_id) |
| 262 services.issue_star.SetStar( |
| 263 cnxn, services, config, 100001, 111L, True) |
| 264 services.issue_star.SetStar( |
| 265 cnxn, services, config, 100002, 111L, True) |
| 266 services.issue_star.SetStar( |
| 267 cnxn, services, config, 100002, 111L, True) |
| 268 services.issue_star.SetStar( |
| 269 cnxn, services, config, 100099, 999L, True) |
| 270 self.assertEqual( |
| 271 {100001, 100002}, |
| 272 issuelist._GetStarredIssues(mr.cnxn, mr.auth.user_id, services)) |
| 273 |
| 274 def testGetStarredIssues_CrossProject(self): |
| 275 services = service_manager.Services( |
| 276 config=fake.ConfigService(), |
| 277 issue=fake.IssueService(), |
| 278 issue_star=fake.IssueStarService()) |
| 279 project = fake.Project(project_name='proj', project_id=789) |
| 280 mr = testing_helpers.MakeMonorailRequest( |
| 281 project=project, user_info={'user_id': 111L}) |
| 282 mr.query = 'project=proj,otherproj' |
| 283 |
| 284 # User has not starred anything yet. |
| 285 self.assertEqual(set(), issuelist._GetStarredIssues( |
| 286 mr.cnxn, mr.auth.user_id, services)) |
| 287 |
| 288 # User starred 2 issues in 1 project, and 1 in another project. |
| 289 # Other users have also starred stuff. |
| 290 cnxn = 'fake connection' |
| 291 config = services.config.GetProjectConfig(cnxn, project.project_id) |
| 292 services.issue_star.SetStar( |
| 293 cnxn, services, config, 100001, 111L, True) |
| 294 services.issue_star.SetStar( |
| 295 cnxn, services, config, 100002, 111L, True) |
| 296 services.issue_star.SetStar( |
| 297 cnxn, services, config, 100002, 999L, True) |
| 298 services.issue_star.SetStar( |
| 299 cnxn, services, config, 100099, 999L, True) |
| 300 services.issue_star.SetStar( |
| 301 cnxn, services, config, 200001, 111L, True) |
| 302 services.issue_star.SetStar( |
| 303 cnxn, services, config, 200001, 999L, True) |
| 304 services.issue_star.SetStar( |
| 305 cnxn, services, config, 200099, 999L, True) |
| 306 self.assertEqual( |
| 307 {100001, 100002, 200001}, |
| 308 issuelist._GetStarredIssues(mr.cnxn, mr.auth.user_id, services)) |
| 309 |
| 310 def testShouldPreviewOnHover(self): |
| 311 saved_flag = settings.enable_quick_edit |
| 312 user = user_pb2.User() |
| 313 |
| 314 settings.enable_quick_edit = True |
| 315 user.preview_on_hover = True |
| 316 self.assertTrue(issuelist._ShouldPreviewOnHover(user)) |
| 317 user.preview_on_hover = False |
| 318 self.assertFalse(issuelist._ShouldPreviewOnHover(user)) |
| 319 |
| 320 settings.enable_quick_edit = False |
| 321 user.preview_on_hover = True |
| 322 self.assertFalse(issuelist._ShouldPreviewOnHover(user)) |
| 323 user.preview_on_hover = False |
| 324 self.assertFalse(issuelist._ShouldPreviewOnHover(user)) |
| 325 |
| 326 settings.enable_quick_edit = saved_flag |
| 327 |
| 328 |
| 329 def _GetColumns(): |
| 330 """Return a list of all well known column names.""" |
| 331 |
| 332 columns = tracker_constants.DEFAULT_COL_SPEC.split() |
| 333 columns.extend(tracker_constants.OTHER_BUILT_IN_COLS) |
| 334 return [c.lower() for c in columns] |
| 335 |
| 336 |
| 337 if __name__ == '__main__': |
| 338 unittest.main() |
OLD | NEW |