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 features_svc module.""" |
| 7 |
| 8 import unittest |
| 9 |
| 10 import mox |
| 11 |
| 12 from features import filterrules_helpers |
| 13 from framework import sql |
| 14 from services import features_svc |
| 15 from testing import fake |
| 16 from tracker import tracker_bizobj |
| 17 from tracker import tracker_constants |
| 18 |
| 19 |
| 20 class FeaturesServiceTest(unittest.TestCase): |
| 21 |
| 22 def MakeMockTable(self): |
| 23 return self.mox.CreateMock(sql.SQLTableManager) |
| 24 |
| 25 def setUp(self): |
| 26 self.mox = mox.Mox() |
| 27 self.cnxn = self.mox.CreateMock(sql.MonorailConnection) |
| 28 self.cache_manager = fake.CacheManager() |
| 29 |
| 30 self.features_service = features_svc.FeaturesService(self.cache_manager) |
| 31 |
| 32 for table_var in [ |
| 33 'user2savedquery_tbl', 'quickedithistory_tbl', |
| 34 'quickeditmostrecent_tbl', 'savedquery_tbl', |
| 35 'savedqueryexecutesinproject_tbl', 'project2savedquery_tbl', |
| 36 'filterrule_tbl']: |
| 37 setattr(self.features_service, table_var, self.MakeMockTable()) |
| 38 |
| 39 def tearDown(self): |
| 40 self.mox.UnsetStubs() |
| 41 self.mox.ResetAll() |
| 42 |
| 43 ### quickedit command history |
| 44 |
| 45 def testGetRecentCommands(self): |
| 46 self.features_service.quickedithistory_tbl.Select( |
| 47 self.cnxn, cols=['slot_num', 'command', 'comment'], |
| 48 user_id=1, project_id=12345).AndReturn( |
| 49 [(1, 'status=New', 'Brand new issue')]) |
| 50 self.features_service.quickeditmostrecent_tbl.SelectValue( |
| 51 self.cnxn, 'slot_num', default=1, user_id=1, project_id=12345 |
| 52 ).AndReturn(1) |
| 53 self.mox.ReplayAll() |
| 54 slots, recent_slot_num = self.features_service.GetRecentCommands( |
| 55 self.cnxn, 1, 12345) |
| 56 self.mox.VerifyAll() |
| 57 |
| 58 self.assertEqual(1, recent_slot_num) |
| 59 self.assertEqual( |
| 60 len(tracker_constants.DEFAULT_RECENT_COMMANDS), len(slots)) |
| 61 self.assertEqual('status=New', slots[0][1]) |
| 62 |
| 63 def testStoreRecentCommand(self): |
| 64 self.features_service.quickedithistory_tbl.InsertRow( |
| 65 self.cnxn, replace=True, user_id=1, project_id=12345, |
| 66 slot_num=1, command='status=New', comment='Brand new issue') |
| 67 self.features_service.quickeditmostrecent_tbl.InsertRow( |
| 68 self.cnxn, replace=True, user_id=1, project_id=12345, |
| 69 slot_num=1) |
| 70 self.mox.ReplayAll() |
| 71 self.features_service.StoreRecentCommand( |
| 72 self.cnxn, 1, 12345, 1, 'status=New', 'Brand new issue') |
| 73 self.mox.VerifyAll() |
| 74 |
| 75 def testExpungeQuickEditHistory(self): |
| 76 self.features_service.quickeditmostrecent_tbl.Delete( |
| 77 self.cnxn, project_id=12345) |
| 78 self.features_service.quickedithistory_tbl.Delete( |
| 79 self.cnxn, project_id=12345) |
| 80 self.mox.ReplayAll() |
| 81 self.features_service.ExpungeQuickEditHistory( |
| 82 self.cnxn, 12345) |
| 83 self.mox.VerifyAll() |
| 84 |
| 85 ### Saved User and Project Queries |
| 86 |
| 87 def testGetSavedQuery(self): |
| 88 self.features_service.savedquery_tbl.Select( |
| 89 self.cnxn, cols=features_svc.SAVEDQUERY_COLS, id=[1]).AndReturn( |
| 90 [(1, 'query1', 100, 'owner:me')]) |
| 91 self.features_service.savedqueryexecutesinproject_tbl.Select( |
| 92 self.cnxn, cols=features_svc.SAVEDQUERYEXECUTESINPROJECT_COLS, |
| 93 query_id=[1]).AndReturn([(1, 12345)]) |
| 94 self.mox.ReplayAll() |
| 95 saved_query = self.features_service.GetSavedQuery( |
| 96 self.cnxn, 1) |
| 97 self.mox.VerifyAll() |
| 98 self.assertEqual(1, saved_query.query_id) |
| 99 self.assertEqual('query1', saved_query.name) |
| 100 self.assertEqual(100, saved_query.base_query_id) |
| 101 self.assertEqual('owner:me', saved_query.query) |
| 102 self.assertEqual([12345], saved_query.executes_in_project_ids) |
| 103 |
| 104 def SetUpUsersSavedQueries(self): |
| 105 query = tracker_bizobj.MakeSavedQuery(1, 'query1', 100, 'owner:me') |
| 106 self.features_service.saved_query_cache.CacheItem(1, [query]) |
| 107 self.features_service.user2savedquery_tbl.Select( |
| 108 self.cnxn, |
| 109 cols=features_svc.SAVEDQUERY_COLS + ['user_id', 'subscription_mode'], |
| 110 left_joins=[('SavedQuery ON query_id = id', [])], |
| 111 order_by=[('rank', [])], user_id=[2]).AndReturn( |
| 112 [(2, 'query2', 100, 'status:New', 2, 'Sub_Mode')]) |
| 113 self.features_service.savedqueryexecutesinproject_tbl.Select( |
| 114 self.cnxn, cols=features_svc.SAVEDQUERYEXECUTESINPROJECT_COLS, |
| 115 query_id=set([2])).AndReturn([(2, 12345)]) |
| 116 |
| 117 def testGetUsersSavedQueriesDict(self): |
| 118 self.SetUpUsersSavedQueries() |
| 119 self.mox.ReplayAll() |
| 120 results_dict = self.features_service._GetUsersSavedQueriesDict( |
| 121 self.cnxn, [1, 2]) |
| 122 self.mox.VerifyAll() |
| 123 self.assertIn(1, results_dict) |
| 124 self.assertIn(2, results_dict) |
| 125 |
| 126 def testGetSavedQueriesByUserID(self): |
| 127 self.SetUpUsersSavedQueries() |
| 128 self.mox.ReplayAll() |
| 129 saved_queries = self.features_service.GetSavedQueriesByUserID( |
| 130 self.cnxn, 2) |
| 131 self.mox.VerifyAll() |
| 132 self.assertEqual(1, len(saved_queries)) |
| 133 self.assertEqual(2, saved_queries[0].query_id) |
| 134 |
| 135 def SetUpCannedQueriesForProjects(self): |
| 136 self.features_service.project2savedquery_tbl.Select( |
| 137 self.cnxn, cols=['project_id'] + features_svc.SAVEDQUERY_COLS, |
| 138 left_joins=[('SavedQuery ON query_id = id', [])], |
| 139 order_by=[('rank', [])], project_id=[12345]).AndReturn( |
| 140 [(12345, 1, 'query1', 100, 'owner:me')]) |
| 141 |
| 142 def testGetCannedQueriesForProjects(self): |
| 143 self.SetUpCannedQueriesForProjects() |
| 144 self.mox.ReplayAll() |
| 145 results_dict = self.features_service.GetCannedQueriesForProjects( |
| 146 self.cnxn, [12345]) |
| 147 self.mox.VerifyAll() |
| 148 self.assertIn(12345, results_dict) |
| 149 |
| 150 def testGetCannedQueriesByProjectID(self): |
| 151 self.SetUpCannedQueriesForProjects() |
| 152 self.mox.ReplayAll() |
| 153 result = self.features_service.GetCannedQueriesByProjectID( |
| 154 self.cnxn, 12345) |
| 155 self.mox.VerifyAll() |
| 156 self.assertEqual(1, len(result)) |
| 157 self.assertEqual(1, result[0].query_id) |
| 158 |
| 159 def SetUpUpdateSavedQueries(self, commit=True): |
| 160 query1 = tracker_bizobj.MakeSavedQuery(1, 'query1', 100, 'owner:me') |
| 161 query2 = tracker_bizobj.MakeSavedQuery(None, 'query2', 100, 'status:New') |
| 162 saved_queries = [query1, query2] |
| 163 savedquery_rows = [ |
| 164 (sq.query_id or None, sq.name, sq.base_query_id, sq.query) |
| 165 for sq in saved_queries] |
| 166 self.features_service.savedquery_tbl.Delete( |
| 167 self.cnxn, id=[1], commit=commit) |
| 168 self.features_service.savedquery_tbl.InsertRows( |
| 169 self.cnxn, features_svc.SAVEDQUERY_COLS, savedquery_rows, commit=commit, |
| 170 return_generated_ids=True).AndReturn([11, 12]) |
| 171 return saved_queries |
| 172 |
| 173 def testUpdateSavedQueries(self): |
| 174 saved_queries = self.SetUpUpdateSavedQueries() |
| 175 self.mox.ReplayAll() |
| 176 self.features_service._UpdateSavedQueries( |
| 177 self.cnxn, saved_queries, True) |
| 178 self.mox.VerifyAll() |
| 179 |
| 180 def testUpdateCannedQueries(self): |
| 181 self.features_service.project2savedquery_tbl.Delete( |
| 182 self.cnxn, project_id=12345, commit=False) |
| 183 canned_queries = self.SetUpUpdateSavedQueries(False) |
| 184 project2savedquery_rows = [(12345, 0, 1), (12345, 1, 12)] |
| 185 self.features_service.project2savedquery_tbl.InsertRows( |
| 186 self.cnxn, features_svc.PROJECT2SAVEDQUERY_COLS, |
| 187 project2savedquery_rows, commit=False) |
| 188 self.cnxn.Commit() |
| 189 self.mox.ReplayAll() |
| 190 self.features_service.UpdateCannedQueries( |
| 191 self.cnxn, 12345, canned_queries) |
| 192 self.mox.VerifyAll() |
| 193 |
| 194 def testUpdateUserSavedQueries(self): |
| 195 saved_queries = self.SetUpUpdateSavedQueries(False) |
| 196 self.features_service.savedqueryexecutesinproject_tbl.Delete( |
| 197 self.cnxn, query_id=[1], commit=False) |
| 198 self.features_service.user2savedquery_tbl.Delete( |
| 199 self.cnxn, user_id=1, commit=False) |
| 200 user2savedquery_rows = [ |
| 201 (1, 0, 1, 'noemail'), (1, 1, 12, 'noemail')] |
| 202 self.features_service.user2savedquery_tbl.InsertRows( |
| 203 self.cnxn, features_svc.USER2SAVEDQUERY_COLS, |
| 204 user2savedquery_rows, commit=False) |
| 205 self.features_service.savedqueryexecutesinproject_tbl.InsertRows( |
| 206 self.cnxn, features_svc.SAVEDQUERYEXECUTESINPROJECT_COLS, [], |
| 207 commit=False) |
| 208 self.cnxn.Commit() |
| 209 self.mox.ReplayAll() |
| 210 self.features_service.UpdateUserSavedQueries( |
| 211 self.cnxn, 1, saved_queries) |
| 212 self.mox.VerifyAll() |
| 213 |
| 214 ### Subscriptions |
| 215 |
| 216 def testGetSubscriptionsInProjects(self): |
| 217 join_str = ( |
| 218 'SavedQueryExecutesInProject ON ' |
| 219 'SavedQueryExecutesInProject.query_id = User2SavedQuery.query_id') |
| 220 self.features_service.user2savedquery_tbl.Select( |
| 221 self.cnxn, cols=['user_id'], distinct=True, |
| 222 joins=[(join_str, [])], |
| 223 subscription_mode='immediate', project_id=12345).AndReturn( |
| 224 [(1, 'asd'), (2, 'efg')]) |
| 225 self.SetUpUsersSavedQueries() |
| 226 self.mox.ReplayAll() |
| 227 result = self.features_service.GetSubscriptionsInProjects( |
| 228 self.cnxn, 12345) |
| 229 self.mox.VerifyAll() |
| 230 self.assertIn(1, result) |
| 231 self.assertIn(2, result) |
| 232 |
| 233 def testExpungeSavedQueriesExecuteInProject(self): |
| 234 self.features_service.savedqueryexecutesinproject_tbl.Delete( |
| 235 self.cnxn, project_id=12345) |
| 236 self.features_service.project2savedquery_tbl.Select( |
| 237 self.cnxn, cols=['query_id'], project_id=12345).AndReturn( |
| 238 [(1, 'asd'), (2, 'efg')]) |
| 239 self.features_service.project2savedquery_tbl.Delete( |
| 240 self.cnxn, project_id=12345) |
| 241 self.features_service.savedquery_tbl.Delete( |
| 242 self.cnxn, id=[1, 2]) |
| 243 self.mox.ReplayAll() |
| 244 self.features_service.ExpungeSavedQueriesExecuteInProject( |
| 245 self.cnxn, 12345) |
| 246 self.mox.VerifyAll() |
| 247 |
| 248 ### Filter Rules |
| 249 |
| 250 def testDeserializeFilterRules(self): |
| 251 filterrule_rows = [ |
| 252 (12345, 0, 'predicate1', 'default_status:New'), |
| 253 (12345, 1, 'predicate2', 'default_owner_id:1 add_cc_id:2'), |
| 254 ] |
| 255 result_dict = self.features_service._DeserializeFilterRules( |
| 256 filterrule_rows) |
| 257 self.assertIn(12345, result_dict) |
| 258 self.assertEqual(2, len(result_dict[12345])) |
| 259 self.assertEqual('New', result_dict[12345][0].default_status) |
| 260 self.assertEqual(1, result_dict[12345][1].default_owner_id) |
| 261 self.assertEqual([2], result_dict[12345][1].add_cc_ids) |
| 262 |
| 263 def testDeserializeRuleConsequence(self): |
| 264 consequence = ('default_status:New default_owner_id:1 add_cc_id:2' |
| 265 ' add_label:label1 add_label:label2 add_notify:admin') |
| 266 (default_status, default_owner_id, add_cc_ids, add_labels, |
| 267 add_notify) = self.features_service._DeserializeRuleConsequence( |
| 268 consequence) |
| 269 self.assertEqual('New', default_status) |
| 270 self.assertEqual(1, default_owner_id) |
| 271 self.assertEqual([2], add_cc_ids) |
| 272 self.assertEqual(['label1', 'label2'], add_labels) |
| 273 self.assertEqual(['admin'], add_notify) |
| 274 |
| 275 def SetUpGetFilterRulesByProjectIDs(self): |
| 276 filterrule_rows = [ |
| 277 (12345, 0, 'predicate1', 'default_status:New'), |
| 278 (12345, 1, 'predicate2', 'default_owner_id:1 add_cc_id:2'), |
| 279 ] |
| 280 |
| 281 self.features_service.filterrule_tbl.Select( |
| 282 self.cnxn, cols=features_svc.FILTERRULE_COLS, |
| 283 project_id=[12345]).AndReturn(filterrule_rows) |
| 284 |
| 285 def testGetFilterRulesByProjectIDs(self): |
| 286 self.SetUpGetFilterRulesByProjectIDs() |
| 287 self.mox.ReplayAll() |
| 288 result = self.features_service._GetFilterRulesByProjectIDs( |
| 289 self.cnxn, [12345]) |
| 290 self.mox.VerifyAll() |
| 291 self.assertIn(12345, result) |
| 292 self.assertEqual(2, len(result[12345])) |
| 293 |
| 294 def testGetFilterRules(self): |
| 295 self.SetUpGetFilterRulesByProjectIDs() |
| 296 self.mox.ReplayAll() |
| 297 result = self.features_service.GetFilterRules( |
| 298 self.cnxn, 12345) |
| 299 self.mox.VerifyAll() |
| 300 self.assertEqual(2, len(result)) |
| 301 |
| 302 def testSerializeRuleConsequence(self): |
| 303 rule = filterrules_helpers.MakeRule( |
| 304 'predicate', 'New', 1, [1, 2], ['label1', 'label2'], ['admin']) |
| 305 result = self.features_service._SerializeRuleConsequence(rule) |
| 306 self.assertEqual('add_label:label1 add_label:label2 default_status:New' |
| 307 ' default_owner_id:1 add_cc_id:1 add_cc_id:2' |
| 308 ' add_notify:admin', result) |
| 309 |
| 310 def testUpdateFilterRules(self): |
| 311 self.features_service.filterrule_tbl.Delete(self.cnxn, project_id=12345) |
| 312 rows = [ |
| 313 (12345, 0, 'predicate1', 'add_label:label1 add_label:label2' |
| 314 ' default_status:New default_owner_id:1' |
| 315 ' add_cc_id:1 add_cc_id:2 add_notify:admin'), |
| 316 (12345, 1, 'predicate2', 'add_label:label2 add_label:label3' |
| 317 ' default_status:Fixed default_owner_id:2' |
| 318 ' add_cc_id:1 add_cc_id:2 add_notify:admin2') |
| 319 ] |
| 320 self.features_service.filterrule_tbl.InsertRows( |
| 321 self.cnxn, features_svc.FILTERRULE_COLS, rows) |
| 322 rule1 = filterrules_helpers.MakeRule( |
| 323 'predicate1', 'New', 1, [1, 2], ['label1', 'label2'], ['admin']) |
| 324 rule2 = filterrules_helpers.MakeRule( |
| 325 'predicate2', 'Fixed', 2, [1, 2], ['label2', 'label3'], ['admin2']) |
| 326 self.mox.ReplayAll() |
| 327 self.features_service.UpdateFilterRules( |
| 328 self.cnxn, 12345, [rule1, rule2]) |
| 329 self.mox.VerifyAll() |
| 330 |
| 331 def testExpungeFilterRules(self): |
| 332 self.features_service.filterrule_tbl.Delete(self.cnxn, project_id=12345) |
| 333 self.mox.ReplayAll() |
| 334 self.features_service.ExpungeFilterRules( |
| 335 self.cnxn, 12345) |
| 336 self.mox.VerifyAll() |
| 337 |
| 338 |
| 339 if __name__ == '__main__': |
| 340 unittest.main() |
OLD | NEW |