OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 // TODO(robliao,vadimt): Determine the granularity of testing to perform. | 5 // TODO(robliao,vadimt): Determine the granularity of testing to perform. |
6 | 6 |
7 /** | 7 /** |
8 * Test fixture for background.js. | 8 * Test fixture for background.js. |
9 * @constructor | 9 * @constructor |
10 * @extends {testing.Test} | 10 * @extends {testing.Test} |
11 */ | 11 */ |
12 function GoogleNowBackgroundUnitTest () { | 12 function GoogleNowBackgroundUnitTest () { |
13 testing.Test.call(this); | 13 testing.Test.call(this); |
14 } | 14 } |
15 | 15 |
16 GoogleNowBackgroundUnitTest.prototype = { | 16 GoogleNowBackgroundUnitTest.prototype = { |
17 __proto__: testing.Test.prototype, | 17 __proto__: testing.Test.prototype, |
18 | 18 |
19 /** @override */ | 19 /** @override */ |
20 extraLibraries: [ | 20 extraLibraries: [ |
21 'common_test_util.js', | 21 'common_test_util.js', |
22 'background_test_util.js', | 22 'background_test_util.js', |
23 'background.js' | 23 'background.js' |
24 ] | 24 ] |
25 }; | 25 }; |
26 | 26 |
27 TEST_F('GoogleNowBackgroundUnitTest', 'AreTasksConflicting', function() { | 27 var TEST_NAME = 'GoogleNowBackgroundUnitTest'; |
| 28 |
| 29 /** |
| 30 * Tasks Conflict Test |
| 31 */ |
| 32 TEST_F(TEST_NAME, 'AreTasksConflicting', function() { |
28 function testTaskPair(newTaskName, scheduledTaskName, expected) { | 33 function testTaskPair(newTaskName, scheduledTaskName, expected) { |
29 assertTrue(areTasksConflicting(newTaskName, scheduledTaskName) == expected, | 34 assertTrue(areTasksConflicting(newTaskName, scheduledTaskName) == expected, |
30 '(' + newTaskName + ', ' + scheduledTaskName + ')'); | 35 '(' + newTaskName + ', ' + scheduledTaskName + ')'); |
31 } | 36 } |
32 | 37 |
33 testTaskPair(UPDATE_CARDS_TASK_NAME, UPDATE_CARDS_TASK_NAME, true); | 38 testTaskPair(UPDATE_CARDS_TASK_NAME, UPDATE_CARDS_TASK_NAME, true); |
34 testTaskPair(UPDATE_CARDS_TASK_NAME, DISMISS_CARD_TASK_NAME, false); | 39 testTaskPair(UPDATE_CARDS_TASK_NAME, DISMISS_CARD_TASK_NAME, false); |
35 testTaskPair(UPDATE_CARDS_TASK_NAME, RETRY_DISMISS_TASK_NAME, false); | 40 testTaskPair(UPDATE_CARDS_TASK_NAME, RETRY_DISMISS_TASK_NAME, false); |
36 testTaskPair(UPDATE_CARDS_TASK_NAME, STATE_CHANGED_TASK_NAME, false); | 41 testTaskPair(UPDATE_CARDS_TASK_NAME, STATE_CHANGED_TASK_NAME, false); |
37 | 42 |
38 testTaskPair(DISMISS_CARD_TASK_NAME, UPDATE_CARDS_TASK_NAME, false); | 43 testTaskPair(DISMISS_CARD_TASK_NAME, UPDATE_CARDS_TASK_NAME, false); |
39 testTaskPair(DISMISS_CARD_TASK_NAME, DISMISS_CARD_TASK_NAME, false); | 44 testTaskPair(DISMISS_CARD_TASK_NAME, DISMISS_CARD_TASK_NAME, false); |
40 testTaskPair(DISMISS_CARD_TASK_NAME, RETRY_DISMISS_TASK_NAME, false); | 45 testTaskPair(DISMISS_CARD_TASK_NAME, RETRY_DISMISS_TASK_NAME, false); |
41 testTaskPair(DISMISS_CARD_TASK_NAME, STATE_CHANGED_TASK_NAME, false); | 46 testTaskPair(DISMISS_CARD_TASK_NAME, STATE_CHANGED_TASK_NAME, false); |
42 | 47 |
43 testTaskPair(RETRY_DISMISS_TASK_NAME, UPDATE_CARDS_TASK_NAME, true); | 48 testTaskPair(RETRY_DISMISS_TASK_NAME, UPDATE_CARDS_TASK_NAME, true); |
44 testTaskPair(RETRY_DISMISS_TASK_NAME, DISMISS_CARD_TASK_NAME, true); | 49 testTaskPair(RETRY_DISMISS_TASK_NAME, DISMISS_CARD_TASK_NAME, true); |
45 testTaskPair(RETRY_DISMISS_TASK_NAME, RETRY_DISMISS_TASK_NAME, true); | 50 testTaskPair(RETRY_DISMISS_TASK_NAME, RETRY_DISMISS_TASK_NAME, true); |
46 testTaskPair(RETRY_DISMISS_TASK_NAME, STATE_CHANGED_TASK_NAME, false); | 51 testTaskPair(RETRY_DISMISS_TASK_NAME, STATE_CHANGED_TASK_NAME, false); |
47 | 52 |
48 testTaskPair(STATE_CHANGED_TASK_NAME, UPDATE_CARDS_TASK_NAME, false); | 53 testTaskPair(STATE_CHANGED_TASK_NAME, UPDATE_CARDS_TASK_NAME, false); |
49 testTaskPair(STATE_CHANGED_TASK_NAME, DISMISS_CARD_TASK_NAME, false); | 54 testTaskPair(STATE_CHANGED_TASK_NAME, DISMISS_CARD_TASK_NAME, false); |
50 testTaskPair(STATE_CHANGED_TASK_NAME, RETRY_DISMISS_TASK_NAME, false); | 55 testTaskPair(STATE_CHANGED_TASK_NAME, RETRY_DISMISS_TASK_NAME, false); |
51 testTaskPair(STATE_CHANGED_TASK_NAME, STATE_CHANGED_TASK_NAME, false); | 56 testTaskPair(STATE_CHANGED_TASK_NAME, STATE_CHANGED_TASK_NAME, false); |
52 }); | 57 }); |
53 | 58 |
54 /** | 59 /** |
55 * Server Request Tests | 60 * Server Request Tests |
56 */ | 61 */ |
57 TEST_F('GoogleNowBackgroundUnitTest', 'AuthServerRequestSuccess', function() { | 62 TEST_F(TEST_NAME, 'AuthServerRequestSuccess', function() { |
58 expectServerRequests(this, 200, '{}'); | 63 expectServerRequests(this, 200, '{}'); |
59 var callbackCalled = false; | 64 var callbackCalled = false; |
60 requestFromServer('GET', 'test/target').then(function(request) { | 65 requestFromServer('GET', 'test/target').then(function(request) { |
61 callbackCalled = true; | 66 callbackCalled = true; |
62 assertTrue(request.status === 200); | 67 assertTrue(request.status === 200); |
63 assertTrue(request.responseText === '{}'); | 68 assertTrue(request.responseText === '{}'); |
64 }); | 69 }); |
65 assertTrue(callbackCalled); | 70 assertTrue(callbackCalled); |
66 }); | 71 }); |
67 | 72 |
68 TEST_F('GoogleNowBackgroundUnitTest', 'AuthServerRequestForbidden', function() { | 73 TEST_F(TEST_NAME, 'AuthServerRequestForbidden', function() { |
69 this.makeAndRegisterMockApis(['authenticationManager.removeToken']); | 74 this.makeAndRegisterMockApis(['authenticationManager.removeToken']); |
70 this.mockApis.expects(once()).authenticationManager_removeToken(ANYTHING); | 75 this.mockApis.expects(once()).authenticationManager_removeToken(ANYTHING); |
71 | 76 |
72 expectServerRequests(this, 403, ''); | 77 expectServerRequests(this, 403, ''); |
73 | 78 |
74 var callbackCalled = false; | 79 var callbackCalled = false; |
75 requestFromServer('GET', 'test/target').then(function(request) { | 80 requestFromServer('GET', 'test/target').then(function(request) { |
76 // The promise is resolved even on HTTP failures. | 81 // The promise is resolved even on HTTP failures. |
77 callbackCalled = true; | 82 callbackCalled = true; |
78 assertTrue(request.status === 403); | 83 assertTrue(request.status === 403); |
79 }); | 84 }); |
80 assertTrue(callbackCalled); | 85 assertTrue(callbackCalled); |
81 }); | 86 }); |
82 | 87 |
83 TEST_F('GoogleNowBackgroundUnitTest', 'AuthServerRequestNoAuth', function() { | 88 TEST_F(TEST_NAME, 'AuthServerRequestNoAuth', function() { |
84 this.makeAndRegisterMockApis(['authenticationManager.removeToken']); | 89 this.makeAndRegisterMockApis(['authenticationManager.removeToken']); |
85 this.mockApis.expects(once()).authenticationManager_removeToken(ANYTHING); | 90 this.mockApis.expects(once()).authenticationManager_removeToken(ANYTHING); |
86 | 91 |
87 expectServerRequests(this, 401, ''); | 92 expectServerRequests(this, 401, ''); |
88 | 93 |
89 var callbackCalled = false; | 94 var callbackCalled = false; |
90 requestFromServer('GET', 'test/target').then(function(request) { | 95 requestFromServer('GET', 'test/target').then(function(request) { |
91 // The promise is resolved even on HTTP failures. | 96 // The promise is resolved even on HTTP failures. |
92 callbackCalled = true; | 97 callbackCalled = true; |
93 assertTrue(request.status === 401); | 98 assertTrue(request.status === 401); |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
129 loadEndSavedArgs.match(eq(false))); | 134 loadEndSavedArgs.match(eq(false))); |
130 | 135 |
131 mockXMLHttpRequestProxy.status = httpStatus; | 136 mockXMLHttpRequestProxy.status = httpStatus; |
132 mockXMLHttpRequestProxy.response = responseText; | 137 mockXMLHttpRequestProxy.response = responseText; |
133 mockXMLHttpRequestProxy.responseText = responseText; | 138 mockXMLHttpRequestProxy.responseText = responseText; |
134 | 139 |
135 mockXMLHttpRequest.expects(once()).send() | 140 mockXMLHttpRequest.expects(once()).send() |
136 .will(invokeCallback(loadEndSavedArgs, 1, mockXMLHttpRequestProxy)); | 141 .will(invokeCallback(loadEndSavedArgs, 1, mockXMLHttpRequestProxy)); |
137 } | 142 } |
138 | 143 |
139 TEST_F('GoogleNowBackgroundUnitTest', 'AuthServerRequestNoToken', function() { | 144 TEST_F(TEST_NAME, 'AuthServerRequestNoToken', function() { |
140 this.makeAndRegisterMockApis([ | 145 this.makeAndRegisterMockApis([ |
141 'authenticationManager.getAuthToken', | 146 'authenticationManager.getAuthToken', |
142 'buildServerRequest' | 147 'buildServerRequest' |
143 ]); | 148 ]); |
144 | 149 |
145 this.mockApis.expects(once()).authenticationManager_getAuthToken() | 150 this.mockApis.expects(once()).authenticationManager_getAuthToken() |
146 .will(returnValue(Promise.reject())); | 151 .will(returnValue(Promise.reject())); |
147 this.mockApis.expects(never()).buildServerRequest() | 152 this.mockApis.expects(never()).buildServerRequest() |
148 | 153 |
149 var thenCalled = false; | 154 var thenCalled = false; |
150 var catchCalled = false; | 155 var catchCalled = false; |
151 requestFromServer('GET', 'test/target').then(function(request) { | 156 requestFromServer('GET', 'test/target').then(function(request) { |
152 thenCalled = true; | 157 thenCalled = true; |
153 }).catch(function() { | 158 }).catch(function() { |
154 catchCalled = true; | 159 catchCalled = true; |
155 }); | 160 }); |
156 assertFalse(thenCalled); | 161 assertFalse(thenCalled); |
157 assertTrue(catchCalled); | 162 assertTrue(catchCalled); |
158 }) | 163 }) |
159 | 164 |
160 /** | 165 /** |
| 166 * requestNotificationGroupsFromServer Tests |
| 167 */ |
| 168 TEST_F(TEST_NAME, 'RequestNotificationGroupsFromServerEmpty', function() { |
| 169 this.makeAndRegisterMockGlobals([ |
| 170 'shouldShowExplanatoryCard', |
| 171 'recordEvent', |
| 172 'requestFromServer' |
| 173 ]); |
| 174 |
| 175 this.mockGlobals.expects(once()).shouldShowExplanatoryCard() |
| 176 .will(returnValue(false)); |
| 177 |
| 178 this.mockGlobals.expects(once()).recordEvent( |
| 179 GoogleNowEvent.REQUEST_FOR_CARDS_TOTAL); |
| 180 |
| 181 this.mockGlobals.expects(once()).recordEvent( |
| 182 GoogleNowEvent.REQUEST_FOR_CARDS_SUCCESS); |
| 183 |
| 184 var requestFromServerArgs = new SaveMockArguments(); |
| 185 this.mockGlobals.expects(once()).requestFromServer( |
| 186 requestFromServerArgs.match(eq('GET')), |
| 187 requestFromServerArgs.match(ANYTHING)) |
| 188 .will(returnValue( |
| 189 Promise.resolve({status: 200, responseText: "{}"}))); |
| 190 |
| 191 requestNotificationGroupsFromServer([]); |
| 192 |
| 193 var pathAndQuery = requestFromServerArgs.arguments[1]; |
| 194 var query = pathAndQuery.split('?')[1]; |
| 195 assertTrue(query.search('timeZoneOffsetMs') >= 0); |
| 196 assertTrue(query.search('uiLocale') >= 0); |
| 197 assertFalse(query.search('cardExplanation') >= 0); |
| 198 }); |
| 199 |
| 200 TEST_F(TEST_NAME, 'RequestNotificationGroupsFromServerWithGroups', function() { |
| 201 this.makeAndRegisterMockGlobals([ |
| 202 'shouldShowExplanatoryCard', |
| 203 'recordEvent', |
| 204 'requestFromServer' |
| 205 ]); |
| 206 |
| 207 this.mockGlobals.expects(once()).shouldShowExplanatoryCard() |
| 208 .will(returnValue(false)); |
| 209 |
| 210 this.mockGlobals.expects(once()).recordEvent( |
| 211 GoogleNowEvent.REQUEST_FOR_CARDS_TOTAL); |
| 212 |
| 213 this.mockGlobals.expects(once()).recordEvent( |
| 214 GoogleNowEvent.REQUEST_FOR_CARDS_SUCCESS); |
| 215 |
| 216 var requestFromServerArgs = new SaveMockArguments(); |
| 217 this.mockGlobals.expects(once()).requestFromServer( |
| 218 requestFromServerArgs.match(eq('GET')), |
| 219 requestFromServerArgs.match(ANYTHING)) |
| 220 .will(returnValue( |
| 221 Promise.resolve({status: 200, responseText: "{}"}))); |
| 222 |
| 223 requestNotificationGroupsFromServer(['A', 'B', 'C']); |
| 224 |
| 225 var pathAndQuery = requestFromServerArgs.arguments[1]; |
| 226 var query = pathAndQuery.split('?')[1]; |
| 227 assertTrue(query.search('timeZoneOffsetMs') >= 0); |
| 228 assertTrue(query.search('uiLocale') >= 0); |
| 229 assertFalse(query.search('cardExplanation') >= 0); |
| 230 assertTrue(query.search('requestTypes=A') >= 0); |
| 231 assertTrue(query.search('requestTypes=B') >= 0); |
| 232 assertTrue(query.search('requestTypes=C') >= 0); |
| 233 }); |
| 234 |
| 235 TEST_F(TEST_NAME, 'RequestNotificationGroupsFromServerExplanatory', function() { |
| 236 this.makeAndRegisterMockGlobals([ |
| 237 'shouldShowExplanatoryCard', |
| 238 'recordEvent', |
| 239 'requestFromServer' |
| 240 ]); |
| 241 |
| 242 this.mockGlobals.expects(once()).shouldShowExplanatoryCard() |
| 243 .will(returnValue(true)); |
| 244 |
| 245 this.mockGlobals.expects(once()).recordEvent( |
| 246 GoogleNowEvent.REQUEST_FOR_CARDS_TOTAL); |
| 247 |
| 248 this.mockGlobals.expects(once()).recordEvent( |
| 249 GoogleNowEvent.REQUEST_FOR_CARDS_SUCCESS); |
| 250 |
| 251 var requestFromServerArgs = new SaveMockArguments(); |
| 252 this.mockGlobals.expects(once()).requestFromServer( |
| 253 requestFromServerArgs.match(eq('GET')), |
| 254 requestFromServerArgs.match(ANYTHING)) |
| 255 .will(returnValue( |
| 256 Promise.resolve({status: 200, responseText: "{}"}))); |
| 257 |
| 258 requestNotificationGroupsFromServer([]); |
| 259 |
| 260 var pathAndQuery = requestFromServerArgs.arguments[1]; |
| 261 var query = pathAndQuery.split('?')[1]; |
| 262 assertTrue(query.search('timeZoneOffsetMs') >= 0); |
| 263 assertTrue(query.search('uiLocale') >= 0); |
| 264 assertTrue(query.search('cardExplanation=true') >= 0); |
| 265 }); |
| 266 |
| 267 TEST_F(TEST_NAME, 'RequestNotificationGroupsFromServerFailure', function() { |
| 268 this.makeAndRegisterMockGlobals([ |
| 269 'shouldShowExplanatoryCard', |
| 270 'recordEvent', |
| 271 'requestFromServer' |
| 272 ]); |
| 273 |
| 274 this.mockGlobals.expects(once()).shouldShowExplanatoryCard() |
| 275 .will(returnValue(false)); |
| 276 |
| 277 this.mockGlobals.expects(once()).recordEvent( |
| 278 GoogleNowEvent.REQUEST_FOR_CARDS_TOTAL); |
| 279 |
| 280 this.mockGlobals.expects(never()).recordEvent( |
| 281 GoogleNowEvent.REQUEST_FOR_CARDS_SUCCESS); |
| 282 |
| 283 var requestFromServerArgs = new SaveMockArguments(); |
| 284 this.mockGlobals.expects(once()).requestFromServer( |
| 285 requestFromServerArgs.match(eq('GET')), |
| 286 requestFromServerArgs.match(ANYTHING)) |
| 287 .will(returnValue( |
| 288 Promise.resolve({status: 401}))); |
| 289 |
| 290 requestNotificationGroupsFromServer([]); |
| 291 }); |
| 292 |
| 293 /** |
| 294 * requestAndUpdateOptIn Tests |
| 295 */ |
| 296 TEST_F(TEST_NAME, 'RequestAndUpdateOptInOptedIn', function() { |
| 297 this.makeAndRegisterMockApis([ |
| 298 'chrome.storage.local.set', |
| 299 'onStateChange', |
| 300 'requestFromServer', |
| 301 'scheduleNextPoll' |
| 302 ]); |
| 303 |
| 304 this.mockApis.expects(once()).requestFromServer('GET', 'settings/optin') |
| 305 .will(returnValue(Promise.resolve({ |
| 306 status: 200, |
| 307 responseText: '{"value": true}'}))); |
| 308 |
| 309 this.mockApis.expects(once()) |
| 310 .chrome_storage_local_set(eqJSON({googleNowEnabled: true})); |
| 311 |
| 312 this.mockApis.expects(once()).onStateChange(); |
| 313 |
| 314 this.mockApis.expects(never()).scheduleNextPoll(); |
| 315 |
| 316 var thenCalled = false; |
| 317 var catchCalled = false; |
| 318 requestAndUpdateOptedIn().then(function() { |
| 319 thenCalled = true; |
| 320 }).catch(function() { |
| 321 catchCalled = true; |
| 322 }); |
| 323 assertTrue(thenCalled); |
| 324 assertFalse(catchCalled); |
| 325 }); |
| 326 |
| 327 TEST_F(TEST_NAME, 'RequestAndUpdateOptInOptedOut', function() { |
| 328 this.makeAndRegisterMockApis([ |
| 329 'chrome.storage.local.set', |
| 330 'onStateChange', |
| 331 'requestFromServer', |
| 332 'scheduleNextPoll' |
| 333 ]); |
| 334 |
| 335 this.mockApis.expects(once()).requestFromServer('GET', 'settings/optin') |
| 336 .will(returnValue(Promise.resolve({ |
| 337 status: 200, |
| 338 responseText: '{"value": false}'}))); |
| 339 |
| 340 this.mockApis.expects(never()).chrome_storage_local_set(); |
| 341 |
| 342 this.mockApis.expects(never()).onStateChange(); |
| 343 |
| 344 this.mockApis.expects(once()).scheduleNextPoll(eqJSON({}), false); |
| 345 |
| 346 var thenCalled = false; |
| 347 var catchCalled = false; |
| 348 requestAndUpdateOptedIn().then(function() { |
| 349 thenCalled = true; |
| 350 }).catch(function() { |
| 351 catchCalled = true; |
| 352 }); |
| 353 assertFalse(thenCalled); |
| 354 assertTrue(catchCalled); |
| 355 }); |
| 356 |
| 357 TEST_F(TEST_NAME, 'RequestAndUpdateOptInFailure', function() { |
| 358 this.makeAndRegisterMockApis([ |
| 359 'chrome.storage.local.set', |
| 360 'onStateChange', |
| 361 'requestFromServer', |
| 362 'scheduleNextPoll' |
| 363 ]); |
| 364 |
| 365 this.mockApis.expects(once()).requestFromServer('GET', 'settings/optin') |
| 366 .will(returnValue(Promise.resolve({status: 404}))); |
| 367 |
| 368 this.mockApis.expects(never()).chrome_storage_local_set(); |
| 369 |
| 370 this.mockApis.expects(never()).onStateChange(); |
| 371 |
| 372 this.mockApis.expects(never()).scheduleNextPoll(); |
| 373 |
| 374 var thenCalled = false; |
| 375 var catchCalled = false; |
| 376 requestAndUpdateOptedIn().then(function() { |
| 377 thenCalled = true; |
| 378 }).catch(function() { |
| 379 catchCalled = true; |
| 380 }); |
| 381 assertFalse(thenCalled); |
| 382 assertTrue(catchCalled); |
| 383 }); |
| 384 |
| 385 /** |
| 386 * getGroupsToRequest Tests |
| 387 */ |
| 388 TEST_F(TEST_NAME, 'GetGroupsToRequestNone', function() { |
| 389 this.makeAndRegisterMockApis([ |
| 390 'fillFromChromeLocalStorage', |
| 391 'Date.now' |
| 392 ]); |
| 393 |
| 394 this.mockApis.expects(once()) |
| 395 .fillFromChromeLocalStorage(eqJSON({notificationGroups: {}})) |
| 396 .will(returnValue(Promise.resolve({notificationGroups: {}}))); |
| 397 |
| 398 this.mockApis.expects(once()).Date_now().will(returnValue(20)); |
| 399 |
| 400 getGroupsToRequest().then(function(groupsToRequest) { |
| 401 assertTrue(JSON.stringify(groupsToRequest) === '[]'); |
| 402 }); |
| 403 }); |
| 404 |
| 405 TEST_F(TEST_NAME, 'GetGroupsToRequestWithGroups', function() { |
| 406 this.makeAndRegisterMockApis([ |
| 407 'fillFromChromeLocalStorage', |
| 408 'Date.now' |
| 409 ]); |
| 410 |
| 411 this.mockApis.expects(once()) |
| 412 .fillFromChromeLocalStorage(eqJSON({notificationGroups: {}})) |
| 413 .will(returnValue(Promise.resolve({notificationGroups: { |
| 414 TIME18: {nextPollTime: 18}, |
| 415 TIME19: {nextPollTime: 19}, |
| 416 TIME20: {nextPollTime: 20}, |
| 417 TIME21: {nextPollTime: 21}, |
| 418 TIME22: {nextPollTime: 22}, |
| 419 TIMEUNDEF: {} |
| 420 }}))); |
| 421 |
| 422 this.mockApis.expects(once()).Date_now().will(returnValue(20)); |
| 423 |
| 424 getGroupsToRequest().then(function(groupsToRequest) { |
| 425 assertTrue(groupsToRequest.length == 3); |
| 426 assertTrue(groupsToRequest.indexOf('TIME18') >= 0); |
| 427 assertTrue(groupsToRequest.indexOf('TIME19') >= 0); |
| 428 assertTrue(groupsToRequest.indexOf('TIME20') >= 0); |
| 429 }); |
| 430 }); |
| 431 |
| 432 /** |
| 433 * combineGroup Tests |
| 434 */ |
| 435 TEST_F(TEST_NAME, 'CombineGroup', function() { |
| 436 // Tests combineGroup function. Verifies that both notifications with and |
| 437 // without show time are handled correctly and that cards are correctly |
| 438 // added to existing cards with same ID or start a new combined card. |
| 439 |
| 440 // Setup and expectations. |
| 441 var combinedCards = { |
| 442 'EXISTING CARD': [1] |
| 443 }; |
| 444 |
| 445 var receivedNotificationNoShowTime = { |
| 446 chromeNotificationId: 'EXISTING CARD', |
| 447 trigger: {hideTimeSec: 1} |
| 448 }; |
| 449 var receivedNotificationWithShowTime = { |
| 450 chromeNotificationId: 'NEW CARD', |
| 451 trigger: {showTimeSec: 2, hideTimeSec: 3} |
| 452 } |
| 453 |
| 454 var storedGroup = { |
| 455 cardsTimestamp: 10000, |
| 456 cards: [ |
| 457 receivedNotificationNoShowTime, |
| 458 receivedNotificationWithShowTime |
| 459 ] |
| 460 }; |
| 461 |
| 462 // Invoking the tested function. |
| 463 combineGroup(combinedCards, storedGroup); |
| 464 |
| 465 // Check the output value. |
| 466 var expectedCombinedCards = { |
| 467 'EXISTING CARD': [ |
| 468 1, |
| 469 { |
| 470 receivedNotification: receivedNotificationNoShowTime, |
| 471 hideTime: 11000 |
| 472 } |
| 473 ], |
| 474 'NEW CARD': [ |
| 475 { |
| 476 receivedNotification: receivedNotificationWithShowTime, |
| 477 showTime: 12000, |
| 478 hideTime: 13000 |
| 479 } |
| 480 ] |
| 481 }; |
| 482 |
| 483 assertEquals( |
| 484 JSON.stringify(expectedCombinedCards), |
| 485 JSON.stringify(combinedCards)); |
| 486 }); |
| 487 |
| 488 /** |
161 * Mocks global functions and APIs that initialize() depends upon. | 489 * Mocks global functions and APIs that initialize() depends upon. |
162 * @param {Test} fixture Test fixture. | 490 * @param {Test} fixture Test fixture. |
163 */ | 491 */ |
164 function mockInitializeDependencies(fixture) { | 492 function mockInitializeDependencies(fixture) { |
165 fixture.makeAndRegisterMockGlobals([ | 493 fixture.makeAndRegisterMockGlobals([ |
166 'recordEvent', | 494 'recordEvent', |
167 'setBackgroundEnable', | 495 'setBackgroundEnable', |
168 'startPollingCards' | 496 'startPollingCards' |
169 ]); | 497 ]); |
170 fixture.makeAndRegisterMockApis([ | 498 fixture.makeAndRegisterMockApis([ |
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
250 will(invokeCallback(tasksAddSavedArgs, 1, function() {})); | 578 will(invokeCallback(tasksAddSavedArgs, 1, function() {})); |
251 var updateCardsAttemptsIsRunningSavedArgs = new SaveMockArguments(); | 579 var updateCardsAttemptsIsRunningSavedArgs = new SaveMockArguments(); |
252 mockApisObj.expects(once()). | 580 mockApisObj.expects(once()). |
253 updateCardsAttempts_isRunning( | 581 updateCardsAttempts_isRunning( |
254 updateCardsAttemptsIsRunningSavedArgs.match(ANYTHING)). | 582 updateCardsAttemptsIsRunningSavedArgs.match(ANYTHING)). |
255 will( | 583 will( |
256 invokeCallback( | 584 invokeCallback( |
257 updateCardsAttemptsIsRunningSavedArgs, 0, false)); | 585 updateCardsAttemptsIsRunningSavedArgs, 0, false)); |
258 } | 586 } |
259 | 587 |
260 TEST_F( | 588 TEST_F(TEST_NAME,'Initialize_ToastStateEmpty', function() { |
261 'GoogleNowBackgroundUnitTest', | 589 // Tests the case when getAuthToken fails most likely because the user is |
262 'Initialize_ToastStateEmpty', | 590 // not signed in. In this case, the function should quietly exit after |
263 function() { | 591 // finding out that getAuthToken fails. |
264 // Tests the case when getAuthToken fails most likely because the user is | |
265 // not signed in. In this case, the function should quietly exit after | |
266 // finding out that getAuthToken fails. | |
267 | 592 |
268 // Setup and expectations. | 593 // Setup and expectations. |
269 var testIdentityToken = undefined; | 594 var testIdentityToken = undefined; |
270 var testExperimentVariationParams = {}; | 595 var testExperimentVariationParams = {}; |
271 var testNotificationPermissionLevel = 'denied'; | 596 var testNotificationPermissionLevel = 'denied'; |
272 var testGoogleNowEnabled = undefined; | 597 var testGoogleNowEnabled = undefined; |
273 | 598 |
274 mockInitializeDependencies(this); | 599 mockInitializeDependencies(this); |
275 | 600 |
276 this.mockGlobals.expects(once()).recordEvent( | 601 this.mockGlobals.expects(once()).recordEvent(GoogleNowEvent.EXTENSION_START); |
277 GoogleNowEvent.EXTENSION_START); | |
278 | 602 |
279 this.mockGlobals.expects(once()).recordEvent( | 603 this.mockGlobals.expects(once()).recordEvent(GoogleNowEvent.STOPPED); |
280 GoogleNowEvent.STOPPED); | |
281 | 604 |
282 this.mockGlobals.expects(once()).recordEvent( | 605 this.mockGlobals.expects(once()).recordEvent( |
283 GoogleNowEvent.SIGNED_OUT); | 606 GoogleNowEvent.SIGNED_OUT); |
284 | 607 |
285 expectInitialization(this.mockApis); | 608 expectInitialization(this.mockApis); |
286 | 609 |
287 expectStateMachineCalls( | 610 expectStateMachineCalls( |
288 this, | 611 this, |
289 testIdentityToken, | 612 testIdentityToken, |
290 testExperimentVariationParams, | 613 testExperimentVariationParams, |
291 testNotificationPermissionLevel, | 614 testNotificationPermissionLevel, |
292 testGoogleNowEnabled); | 615 testGoogleNowEnabled); |
293 | 616 |
294 // Invoking the tested function. | 617 // Invoking the tested function. |
295 initialize(); | 618 initialize(); |
296 }); | 619 }); |
297 | 620 |
298 TEST_F('GoogleNowBackgroundUnitTest', 'Initialize_RunGoogleNow', function() { | 621 TEST_F(TEST_NAME, 'Initialize_RunGoogleNow', function() { |
299 // Tests if Google Now will invoke startPollingCards when all | 622 // Tests if Google Now will invoke startPollingCards when all |
300 // of the required state is fulfilled. | 623 // of the required state is fulfilled. |
301 | 624 |
302 // Setup and expectations. | 625 // Setup and expectations. |
303 var testIdentityToken = 'some identity token'; | 626 var testIdentityToken = 'some identity token'; |
304 var testExperimentVariationParams = {}; | 627 var testExperimentVariationParams = {}; |
305 var testNotificationPermissionLevel = 'granted'; | 628 var testNotificationPermissionLevel = 'granted'; |
306 var testGoogleNowEnabled = true; | 629 var testGoogleNowEnabled = true; |
307 | 630 |
308 mockInitializeDependencies(this); | 631 mockInitializeDependencies(this); |
309 | 632 |
310 this.mockGlobals.expects(once()).recordEvent( | 633 this.mockGlobals.expects(once()).recordEvent(GoogleNowEvent.EXTENSION_START); |
311 GoogleNowEvent.EXTENSION_START); | |
312 | 634 |
313 expectInitialization(this.mockApis); | 635 expectInitialization(this.mockApis); |
314 | 636 |
315 expectStateMachineCalls( | 637 expectStateMachineCalls( |
316 this, | 638 this, |
317 testIdentityToken, | 639 testIdentityToken, |
318 testExperimentVariationParams, | 640 testExperimentVariationParams, |
319 testNotificationPermissionLevel, | 641 testNotificationPermissionLevel, |
320 testGoogleNowEnabled); | 642 testGoogleNowEnabled); |
321 | 643 |
322 this.mockGlobals.expects(once()).startPollingCards(); | 644 this.mockGlobals.expects(once()).startPollingCards(); |
323 | 645 |
324 // Invoking the tested function. | 646 // Invoking the tested function. |
325 initialize(); | 647 initialize(); |
326 }); | 648 }); |
327 | 649 |
328 /** | 650 /** |
329 * No Cards Event Recording Tests | 651 * No Cards Event Recording Tests |
330 */ | 652 */ |
331 TEST_F('GoogleNowBackgroundUnitTest', 'NoCardsSignedOut', function() { | 653 TEST_F(TEST_NAME, 'NoCardsSignedOut', function() { |
332 var signedIn = false; | 654 var signedIn = false; |
333 var notificationEnabled = false; | 655 var notificationEnabled = false; |
334 var googleNowEnabled = false; | 656 var googleNowEnabled = false; |
335 this.makeAndRegisterMockGlobals([ | 657 this.makeAndRegisterMockGlobals([ |
336 'recordEvent', | 658 'recordEvent', |
337 'setBackgroundEnable', | 659 'setBackgroundEnable', |
338 'setShouldPollCards']); | 660 'setShouldPollCards']); |
339 | 661 |
340 this.mockGlobals.stubs().setBackgroundEnable(ANYTHING); | 662 this.mockGlobals.stubs().setBackgroundEnable(ANYTHING); |
341 this.mockGlobals.stubs().setShouldPollCards(ANYTHING); | 663 this.mockGlobals.stubs().setShouldPollCards(ANYTHING); |
342 | 664 |
343 this.mockGlobals.expects(once()).recordEvent( | 665 this.mockGlobals.expects(once()).recordEvent( |
344 GoogleNowEvent.STOPPED); | 666 GoogleNowEvent.STOPPED); |
345 this.mockGlobals.expects(once()).recordEvent( | 667 this.mockGlobals.expects(once()).recordEvent( |
346 GoogleNowEvent.SIGNED_OUT); | 668 GoogleNowEvent.SIGNED_OUT); |
347 this.mockGlobals.expects(never()).recordEvent( | 669 this.mockGlobals.expects(never()).recordEvent( |
348 GoogleNowEvent.NOTIFICATION_DISABLED); | 670 GoogleNowEvent.NOTIFICATION_DISABLED); |
349 this.mockGlobals.expects(never()).recordEvent( | 671 this.mockGlobals.expects(never()).recordEvent( |
350 GoogleNowEvent.GOOGLE_NOW_DISABLED); | 672 GoogleNowEvent.GOOGLE_NOW_DISABLED); |
351 updateRunningState(signedIn, true, notificationEnabled, googleNowEnabled); | 673 updateRunningState(signedIn, true, notificationEnabled, googleNowEnabled); |
352 }); | 674 }); |
353 | 675 |
354 TEST_F( | 676 TEST_F(TEST_NAME, 'NoCardsNotificationsDisabled', function() { |
355 'GoogleNowBackgroundUnitTest', | 677 var signedIn = true; |
356 'NoCardsNotificationsDisabled', | 678 var notificationEnabled = false; |
357 function() { | 679 var googleNowEnabled = false; |
358 var signedIn = true; | 680 this.makeAndRegisterMockGlobals([ |
359 var notificationEnabled = false; | 681 'recordEvent', |
360 var googleNowEnabled = false; | 682 'setBackgroundEnable', |
361 this.makeAndRegisterMockGlobals([ | 683 'setShouldPollCards']); |
362 'recordEvent', | |
363 'setBackgroundEnable', | |
364 'setShouldPollCards']); | |
365 | 684 |
366 this.mockGlobals.stubs().setBackgroundEnable(ANYTHING); | 685 this.mockGlobals.stubs().setBackgroundEnable(ANYTHING); |
367 this.mockGlobals.stubs().setShouldPollCards(ANYTHING); | 686 this.mockGlobals.stubs().setShouldPollCards(ANYTHING); |
368 | 687 |
369 this.mockGlobals.expects(once()).recordEvent( | 688 this.mockGlobals.expects(once()).recordEvent( |
370 GoogleNowEvent.STOPPED); | 689 GoogleNowEvent.STOPPED); |
371 this.mockGlobals.expects(never()).recordEvent( | 690 this.mockGlobals.expects(never()).recordEvent( |
372 GoogleNowEvent.SIGNED_OUT); | 691 GoogleNowEvent.SIGNED_OUT); |
373 this.mockGlobals.expects(once()).recordEvent( | 692 this.mockGlobals.expects(once()).recordEvent( |
374 GoogleNowEvent.NOTIFICATION_DISABLED); | 693 GoogleNowEvent.NOTIFICATION_DISABLED); |
375 this.mockGlobals.expects(never()).recordEvent( | 694 this.mockGlobals.expects(never()).recordEvent( |
376 GoogleNowEvent.GOOGLE_NOW_DISABLED); | 695 GoogleNowEvent.GOOGLE_NOW_DISABLED); |
377 updateRunningState(signedIn, true, notificationEnabled, googleNowEnabled); | 696 updateRunningState(signedIn, true, notificationEnabled, googleNowEnabled); |
378 }); | 697 }); |
379 | 698 |
380 TEST_F('GoogleNowBackgroundUnitTest', 'NoCardsGoogleNowDisabled', function() { | 699 TEST_F(TEST_NAME, 'NoCardsGoogleNowDisabled', function() { |
381 var signedIn = true; | 700 var signedIn = true; |
382 var notificationEnabled = true; | 701 var notificationEnabled = true; |
383 var googleNowEnabled = false; | 702 var googleNowEnabled = false; |
384 this.makeAndRegisterMockGlobals([ | 703 this.makeAndRegisterMockGlobals([ |
385 'recordEvent', | 704 'recordEvent', |
386 'setBackgroundEnable', | 705 'setBackgroundEnable', |
387 'setShouldPollCards']); | 706 'setShouldPollCards']); |
388 | 707 |
389 this.mockGlobals.stubs().setBackgroundEnable(ANYTHING); | 708 this.mockGlobals.stubs().setBackgroundEnable(ANYTHING); |
390 this.mockGlobals.stubs().setShouldPollCards(ANYTHING); | 709 this.mockGlobals.stubs().setShouldPollCards(ANYTHING); |
391 | 710 |
392 this.mockGlobals.expects(never()).recordEvent( | 711 this.mockGlobals.expects(never()).recordEvent( |
393 GoogleNowEvent.STOPPED); | 712 GoogleNowEvent.STOPPED); |
394 this.mockGlobals.expects(never()).recordEvent( | 713 this.mockGlobals.expects(never()).recordEvent( |
395 GoogleNowEvent.SIGNED_OUT); | 714 GoogleNowEvent.SIGNED_OUT); |
396 this.mockGlobals.expects(never()).recordEvent( | 715 this.mockGlobals.expects(never()).recordEvent( |
397 GoogleNowEvent.NOTIFICATION_DISABLED); | 716 GoogleNowEvent.NOTIFICATION_DISABLED); |
398 this.mockGlobals.expects(once()).recordEvent( | 717 this.mockGlobals.expects(once()).recordEvent( |
399 GoogleNowEvent.GOOGLE_NOW_DISABLED); | 718 GoogleNowEvent.GOOGLE_NOW_DISABLED); |
400 updateRunningState(signedIn, true, notificationEnabled, googleNowEnabled); | 719 updateRunningState(signedIn, true, notificationEnabled, googleNowEnabled); |
401 }); | 720 }); |
402 | 721 |
403 TEST_F('GoogleNowBackgroundUnitTest', 'NoCardsEverythingEnabled', function() { | 722 TEST_F(TEST_NAME, 'NoCardsEverythingEnabled', function() { |
404 var signedIn = true; | 723 var signedIn = true; |
405 var notificationEnabled = true; | 724 var notificationEnabled = true; |
406 var googleNowEnabled = true; | 725 var googleNowEnabled = true; |
407 this.makeAndRegisterMockGlobals([ | 726 this.makeAndRegisterMockGlobals([ |
408 'recordEvent', | 727 'recordEvent', |
409 'setBackgroundEnable', | 728 'setBackgroundEnable', |
410 'setShouldPollCards']); | 729 'setShouldPollCards']); |
411 | 730 |
412 this.mockGlobals.stubs().setBackgroundEnable(ANYTHING); | 731 this.mockGlobals.stubs().setBackgroundEnable(ANYTHING); |
413 this.mockGlobals.stubs().setShouldPollCards(ANYTHING); | 732 this.mockGlobals.stubs().setShouldPollCards(ANYTHING); |
414 | 733 |
415 this.mockGlobals.expects(never()).recordEvent( | 734 this.mockGlobals.expects(never()).recordEvent( |
416 GoogleNowEvent.STOPPED); | 735 GoogleNowEvent.STOPPED); |
417 this.mockGlobals.expects(never()).recordEvent( | 736 this.mockGlobals.expects(never()).recordEvent( |
418 GoogleNowEvent.SIGNED_OUT); | 737 GoogleNowEvent.SIGNED_OUT); |
419 this.mockGlobals.expects(never()).recordEvent( | 738 this.mockGlobals.expects(never()).recordEvent( |
420 GoogleNowEvent.NOTIFICATION_DISABLED); | 739 GoogleNowEvent.NOTIFICATION_DISABLED); |
421 this.mockGlobals.expects(never()).recordEvent( | 740 this.mockGlobals.expects(never()).recordEvent( |
422 GoogleNowEvent.GOOGLE_NOW_DISABLED); | 741 GoogleNowEvent.GOOGLE_NOW_DISABLED); |
423 updateRunningState(signedIn, true, notificationEnabled, googleNowEnabled); | 742 updateRunningState(signedIn, true, notificationEnabled, googleNowEnabled); |
424 }); | 743 }); |
425 | 744 |
426 /** | 745 /** |
427 * Mocks global functions and APIs that onNotificationClicked() depends upon. | 746 * Mocks global functions and APIs that onNotificationClicked() depends upon. |
428 * @param {Test} fixture Test fixture. | 747 * @param {Test} fixture Test fixture. |
429 */ | 748 */ |
430 function mockOnNotificationClickedDependencies(fixture) { | 749 function mockOnNotificationClickedDependencies(fixture) { |
431 fixture.makeAndRegisterMockApis([ | 750 fixture.makeAndRegisterMockApis([ |
432 'chrome.windows.create', | 751 'chrome.windows.create', |
433 'chrome.windows.update', | 752 'chrome.windows.update', |
434 'fillFromChromeLocalStorage', | 753 'fillFromChromeLocalStorage', |
435 'instrumented.tabs.create']); | 754 'instrumented.tabs.create']); |
436 } | 755 } |
437 | 756 |
438 TEST_F( | 757 TEST_F(TEST_NAME, 'OnNotificationClicked_NoData', function() { |
439 'GoogleNowBackgroundUnitTest', | 758 // Tests the case when there is no data associated with notification id. |
440 'OnNotificationClicked_NoData', | 759 // In this case, the function should do nothing. |
441 function() { | 760 |
442 // Tests the case when there is no data associated with notification id. | 761 // Setup and expectations. |
443 // In this case, the function should do nothing. | 762 var testNotificationId = 'TEST_ID'; |
444 | 763 var testNotificationDataRequest = {notificationsData: {}}; |
445 // Setup and expectations. | 764 var testNotificationData = {notificationsData: {}}; |
446 var testNotificationId = 'TEST_ID'; | 765 |
447 var testNotificationDataRequest = {notificationsData: {}}; | 766 mockOnNotificationClickedDependencies(this); |
448 var testNotificationData = {notificationsData: {}}; | 767 this.makeMockLocalFunctions(['selector']); |
449 | 768 |
450 mockOnNotificationClickedDependencies(this); | 769 expectChromeLocalStorageGet( |
451 this.makeMockLocalFunctions(['selector']); | 770 this, testNotificationDataRequest, testNotificationData); |
452 | 771 |
453 expectChromeLocalStorageGet( | 772 // Invoking the tested function. |
454 this, testNotificationDataRequest, testNotificationData); | 773 onNotificationClicked( |
455 | 774 testNotificationId, this.mockLocalFunctions.functions().selector); |
456 // Invoking the tested function. | 775 }); |
457 onNotificationClicked( | 776 |
458 testNotificationId, this.mockLocalFunctions.functions().selector); | 777 TEST_F(TEST_NAME, 'OnNotificationClicked_ActionUrlsUndefined', function() { |
459 }); | 778 // Tests the case when the data associated with notification id is |
460 | 779 // 'undefined'. |
461 TEST_F( | 780 // In this case, the function should do nothing. |
462 'GoogleNowBackgroundUnitTest', | 781 |
463 'OnNotificationClicked_ActionUrlsUndefined', | 782 // Setup and expectations. |
464 function() { | 783 var testActionUrls = undefined; |
465 // Tests the case when the data associated with notification id is | 784 var testNotificationId = 'TEST_ID'; |
466 // 'undefined'. | 785 var testNotificationDataRequest = {notificationsData: {}}; |
467 // In this case, the function should do nothing. | 786 var testNotificationData = { |
468 | 787 notificationsData: {'TEST_ID': {actionUrls: testActionUrls}} |
469 // Setup and expectations. | 788 }; |
470 var testActionUrls = undefined; | 789 |
471 var testNotificationId = 'TEST_ID'; | 790 mockOnNotificationClickedDependencies(this); |
472 var testNotificationDataRequest = {notificationsData: {}}; | 791 this.makeMockLocalFunctions(['selector']); |
473 var testNotificationData = { | 792 |
474 notificationsData: {'TEST_ID': {actionUrls: testActionUrls}} | 793 expectChromeLocalStorageGet( |
475 }; | 794 this, testNotificationDataRequest, testNotificationData); |
476 | 795 |
477 mockOnNotificationClickedDependencies(this); | 796 this.mockLocalFunctions.expects(once()) |
478 this.makeMockLocalFunctions(['selector']); | 797 .selector(eqJSON( |
479 | 798 testNotificationData.notificationsData[testNotificationId])) |
480 expectChromeLocalStorageGet( | 799 .will(returnValue(undefined)); |
481 this, testNotificationDataRequest, testNotificationData); | 800 |
482 | 801 // Invoking the tested function. |
483 this.mockLocalFunctions.expects(once()) | 802 onNotificationClicked( |
484 .selector(eqJSON( | 803 testNotificationId, this.mockLocalFunctions.functions().selector); |
485 testNotificationData.notificationsData[testNotificationId])) | 804 }); |
486 .will(returnValue(undefined)); | 805 |
487 | 806 TEST_F(TEST_NAME, 'OnNotificationClicked_TabCreateSuccess', function() { |
488 // Invoking the tested function. | 807 // Tests the selected URL is OK and crome.tabs.create suceeds. |
489 onNotificationClicked( | 808 |
490 testNotificationId, this.mockLocalFunctions.functions().selector); | 809 // Setup and expectations. |
491 }); | 810 var testActionUrls = {testField: 'TEST VALUE'}; |
492 | 811 var testNotificationId = 'TEST_ID'; |
493 TEST_F( | 812 var testNotificationDataRequest = {notificationsData: {}}; |
494 'GoogleNowBackgroundUnitTest', | 813 var testNotificationData = { |
495 'OnNotificationClicked_TabCreateSuccess', | 814 notificationsData: {'TEST_ID': {actionUrls: testActionUrls}} |
496 function() { | 815 }; |
497 // Tests the selected URL is OK and crome.tabs.create suceeds. | 816 var testActionUrl = 'http://testurl.com'; |
498 | 817 var testCreatedTab = {windowId: 239}; |
499 // Setup and expectations. | 818 |
500 var testActionUrls = {testField: 'TEST VALUE'}; | 819 mockOnNotificationClickedDependencies(this); |
501 var testNotificationId = 'TEST_ID'; | 820 this.makeMockLocalFunctions(['selector']); |
502 var testNotificationDataRequest = {notificationsData: {}}; | 821 |
503 var testNotificationData = { | 822 expectChromeLocalStorageGet( |
504 notificationsData: {'TEST_ID': {actionUrls: testActionUrls}} | 823 this, testNotificationDataRequest, testNotificationData); |
505 }; | 824 this.mockLocalFunctions.expects(once()) |
506 var testActionUrl = 'http://testurl.com'; | 825 .selector(eqJSON( |
507 var testCreatedTab = {windowId: 239}; | 826 testNotificationData.notificationsData[testNotificationId])) |
508 | 827 .will(returnValue(testActionUrl)); |
509 mockOnNotificationClickedDependencies(this); | 828 var chromeTabsCreateSavedArgs = new SaveMockArguments(); |
510 this.makeMockLocalFunctions(['selector']); | 829 this.mockApis.expects(once()). |
511 | 830 instrumented_tabs_create( |
512 expectChromeLocalStorageGet( | 831 chromeTabsCreateSavedArgs.match(eqJSON({url: testActionUrl})), |
513 this, testNotificationDataRequest, testNotificationData); | 832 chromeTabsCreateSavedArgs.match(ANYTHING)). |
514 this.mockLocalFunctions.expects(once()) | 833 will(invokeCallback(chromeTabsCreateSavedArgs, 1, testCreatedTab)); |
515 .selector(eqJSON( | 834 this.mockApis.expects(once()).chrome_windows_update( |
516 testNotificationData.notificationsData[testNotificationId])) | 835 testCreatedTab.windowId, |
517 .will(returnValue(testActionUrl)); | 836 eqJSON({focused: true})); |
518 var chromeTabsCreateSavedArgs = new SaveMockArguments(); | 837 |
519 this.mockApis.expects(once()). | 838 // Invoking the tested function. |
520 instrumented_tabs_create( | 839 onNotificationClicked( |
521 chromeTabsCreateSavedArgs.match(eqJSON({url: testActionUrl})), | 840 testNotificationId, this.mockLocalFunctions.functions().selector); |
522 chromeTabsCreateSavedArgs.match(ANYTHING)). | 841 }); |
523 will(invokeCallback(chromeTabsCreateSavedArgs, 1, testCreatedTab)); | 842 |
524 this.mockApis.expects(once()).chrome_windows_update( | 843 TEST_F(TEST_NAME, 'OnNotificationClicked_TabCreateFail', function() { |
525 testCreatedTab.windowId, | 844 // Tests the selected URL is OK and crome.tabs.create fails. |
526 eqJSON({focused: true})); | 845 // In this case, the function should invoke chrome.windows.create as a |
527 | 846 // second attempt. |
528 // Invoking the tested function. | 847 |
529 onNotificationClicked( | 848 // Setup and expectations. |
530 testNotificationId, this.mockLocalFunctions.functions().selector); | 849 var testActionUrls = {testField: 'TEST VALUE'}; |
531 }); | 850 var testNotificationId = 'TEST_ID'; |
532 | 851 var testNotificationDataRequest = {notificationsData: {}}; |
533 TEST_F( | 852 var testNotificationData = { |
534 'GoogleNowBackgroundUnitTest', | 853 notificationsData: {'TEST_ID': {actionUrls: testActionUrls}} |
535 'OnNotificationClicked_TabCreateFail', | 854 }; |
536 function() { | 855 var testActionUrl = 'http://testurl.com'; |
537 // Tests the selected URL is OK and crome.tabs.create fails. | 856 var testCreatedTab = undefined; // chrome.tabs.create fails |
538 // In this case, the function should invoke chrome.windows.create as a | 857 |
539 // second attempt. | 858 mockOnNotificationClickedDependencies(this); |
540 | 859 this.makeMockLocalFunctions(['selector']); |
541 // Setup and expectations. | 860 |
542 var testActionUrls = {testField: 'TEST VALUE'}; | 861 expectChromeLocalStorageGet( |
543 var testNotificationId = 'TEST_ID'; | 862 this, testNotificationDataRequest, testNotificationData); |
544 var testNotificationDataRequest = {notificationsData: {}}; | 863 this.mockLocalFunctions.expects(once()) |
545 var testNotificationData = { | 864 .selector(eqJSON( |
546 notificationsData: {'TEST_ID': {actionUrls: testActionUrls}} | 865 testNotificationData.notificationsData[testNotificationId])) |
547 }; | 866 .will(returnValue(testActionUrl)); |
548 var testActionUrl = 'http://testurl.com'; | 867 var chromeTabsCreateSavedArgs = new SaveMockArguments(); |
549 var testCreatedTab = undefined; // chrome.tabs.create fails | 868 this.mockApis.expects(once()). |
550 | 869 instrumented_tabs_create( |
551 mockOnNotificationClickedDependencies(this); | 870 chromeTabsCreateSavedArgs.match(eqJSON({url: testActionUrl})), |
552 this.makeMockLocalFunctions(['selector']); | 871 chromeTabsCreateSavedArgs.match(ANYTHING)). |
553 | 872 will(invokeCallback(chromeTabsCreateSavedArgs, 1, testCreatedTab)); |
554 expectChromeLocalStorageGet( | 873 this.mockApis.expects(once()).chrome_windows_create( |
555 this, testNotificationDataRequest, testNotificationData); | 874 eqJSON({url: testActionUrl, focused: true})); |
556 this.mockLocalFunctions.expects(once()) | 875 |
557 .selector(eqJSON( | 876 // Invoking the tested function. |
558 testNotificationData.notificationsData[testNotificationId])) | 877 onNotificationClicked( |
559 .will(returnValue(testActionUrl)); | 878 testNotificationId, this.mockLocalFunctions.functions().selector); |
560 var chromeTabsCreateSavedArgs = new SaveMockArguments(); | 879 }); |
561 this.mockApis.expects(once()). | 880 |
562 instrumented_tabs_create( | 881 TEST_F(TEST_NAME, 'ShowNotificationGroups', function() { |
563 chromeTabsCreateSavedArgs.match(eqJSON({url: testActionUrl})), | 882 // Tests showNotificationGroups function. Checks that the function properly |
564 chromeTabsCreateSavedArgs.match(ANYTHING)). | 883 // deletes the card that didn't get an update, updates existing card and |
565 will(invokeCallback(chromeTabsCreateSavedArgs, 1, testCreatedTab)); | 884 // creates a new card that previously didn't exist. |
566 this.mockApis.expects(once()).chrome_windows_create( | 885 |
567 eqJSON({url: testActionUrl, focused: true})); | 886 // Setup and expectations. |
568 | 887 var existingNotifications = { |
569 // Invoking the tested function. | 888 'SHOULD BE DELETED': 'SOMETHING', |
570 onNotificationClicked( | 889 'SHOULD BE KEPT': 'SOMETHING' |
571 testNotificationId, this.mockLocalFunctions.functions().selector); | 890 }; |
572 }); | 891 |
573 | 892 var keptCard = { |
574 TEST_F( | 893 chromeNotificationId: 'SHOULD BE KEPT', |
575 'GoogleNowBackgroundUnitTest', | 894 trigger: {showTimeSec: 0, hideTimeSec: 0} |
576 'ShowNotificationCards', | 895 }; |
577 function() { | 896 |
578 // Tests showNotificationCards function. Checks that the function properly | 897 var keptNotification = { |
579 // deletes the card that didn't get an update, updates existing card and | 898 receivedNotification: keptCard, |
580 // creates a new card that previously didn't exist. | 899 showTime: 0, |
581 | 900 hideTime: 0 |
582 // Setup and expectations. | 901 }; |
583 var existingNotifications = { | 902 |
584 'SHOULD BE DELETED': 'SOMETHING', | 903 var newCard = { |
585 'SHOULD BE KEPT': 'SOMETHING' | 904 chromeNotificationId: 'NEW CARD', |
586 }; | 905 trigger: {showTimeSec: 0, hideTimeSec: 0} |
587 | 906 }; |
588 var notificationGroups = { | 907 |
589 TEST_FIELD: 'TEST VALUE' | 908 var newNotification = { |
590 }; | 909 receivedNotification: newCard, |
591 | 910 showTime: 0, |
592 var cards = { | 911 hideTime: 0 |
593 'SHOULD BE KEPT': [1], | 912 }; |
594 'NEW CARD': [2] | 913 |
595 }; | 914 var notificationGroups = { |
596 | 915 'TEST GROUP 1': {cards: [keptCard], cardsTimestamp: 0}, |
597 var fakeOnCardShownFunction = 'FAKE ON CARD SHOWN FUNCTION'; | 916 'TEST GROUP 2': {cards: [newCard], cardsTimestamp: 0} |
598 | 917 }; |
599 var expectedUpdatedNotifications = { | 918 |
600 'SHOULD BE KEPT': 'KEPT CARD NOTIFICATION DATA', | 919 var fakeOnCardShownFunction = 'FAKE ON CARD SHOWN FUNCTION'; |
601 'NEW CARD': 'NEW CARD NOTIFICATION DATA' | 920 |
602 }; | 921 var expectedUpdatedNotifications = { |
603 | 922 'SHOULD BE KEPT': 'KEPT CARD NOTIFICATION DATA', |
604 this.makeAndRegisterMockApis([ | 923 'NEW CARD': 'NEW CARD NOTIFICATION DATA' |
605 'cardSet.update', | 924 }; |
606 'chrome.storage.local.set', | 925 |
607 'instrumented.notifications.getAll' | 926 this.makeAndRegisterMockApis([ |
608 ]); | 927 'cardSet.update', |
609 this.makeMockLocalFunctions([ | 928 'chrome.storage.local.set', |
610 'onSuccess' | 929 'instrumented.notifications.getAll' |
611 ]); | 930 ]); |
612 | 931 this.makeMockLocalFunctions([ |
613 var notificationsGetAllSavedArgs = new SaveMockArguments(); | 932 'onSuccess' |
614 this.mockApis.expects(once()). | 933 ]); |
615 instrumented_notifications_getAll( | 934 |
616 notificationsGetAllSavedArgs.match(ANYTHING)). | 935 var notificationsGetAllSavedArgs = new SaveMockArguments(); |
617 will(invokeCallback( | 936 this.mockApis.expects(once()). |
618 notificationsGetAllSavedArgs, 0, existingNotifications)); | 937 instrumented_notifications_getAll( |
619 | 938 notificationsGetAllSavedArgs.match(ANYTHING)). |
620 this.mockApis.expects(once()). | 939 will(invokeCallback( |
621 cardSet_update( | 940 notificationsGetAllSavedArgs, 0, existingNotifications)); |
622 'SHOULD BE KEPT', | 941 |
623 [1], | 942 this.mockApis.expects(once()). |
624 eqJSON(notificationGroups), | 943 cardSet_update( |
625 fakeOnCardShownFunction). | 944 'SHOULD BE KEPT', |
626 will(returnValue('KEPT CARD NOTIFICATION DATA')); | 945 eqJSON([keptNotification]), |
627 this.mockApis.expects(once()). | 946 eqJSON(notificationGroups), |
628 cardSet_update( | 947 fakeOnCardShownFunction). |
629 'NEW CARD', | 948 will(returnValue('KEPT CARD NOTIFICATION DATA')); |
630 [2], | 949 this.mockApis.expects(once()). |
631 eqJSON(notificationGroups), | 950 cardSet_update( |
632 fakeOnCardShownFunction). | 951 'NEW CARD', |
633 will(returnValue('NEW CARD NOTIFICATION DATA')); | 952 eqJSON([newNotification]), |
634 this.mockApis.expects(once()). | 953 eqJSON(notificationGroups), |
635 cardSet_update( | 954 fakeOnCardShownFunction). |
636 'SHOULD BE DELETED', | 955 will(returnValue('NEW CARD NOTIFICATION DATA')); |
637 [], | 956 this.mockApis.expects(once()). |
638 eqJSON(notificationGroups), | 957 cardSet_update( |
639 fakeOnCardShownFunction). | 958 'SHOULD BE DELETED', |
640 will(returnValue(undefined)); | 959 [], |
641 | 960 eqJSON(notificationGroups), |
642 this.mockApis.expects(once()). | 961 fakeOnCardShownFunction). |
643 chrome_storage_local_set( | 962 will(returnValue(undefined)); |
644 eqJSON({notificationsData: expectedUpdatedNotifications})); | 963 |
645 | 964 this.mockApis.expects(once()). |
646 this.mockLocalFunctions.expects(once()). | 965 chrome_storage_local_set( |
647 onSuccess(); | 966 eqJSON({notificationsData: expectedUpdatedNotifications})); |
648 | 967 |
649 // Invoking the tested function. | 968 this.mockLocalFunctions.expects(once()). |
650 showNotificationCards( | 969 onSuccess(undefined); |
651 notificationGroups, | 970 |
652 cards, | 971 // Invoking the tested function. |
653 this.mockLocalFunctions.functions().onSuccess, | 972 showNotificationGroups(notificationGroups, fakeOnCardShownFunction) |
654 fakeOnCardShownFunction); | 973 .then(this.mockLocalFunctions.functions().onSuccess); |
655 }); | 974 }); |
656 | 975 |
657 TEST_F( | 976 TEST_F(TEST_NAME, 'ProcessServerResponse', function() { |
658 'GoogleNowBackgroundUnitTest', | 977 // Tests processServerResponse function. |
659 'CombineGroup', | 978 |
660 function() { | 979 // Setup and expectations. |
661 // Tests combineGroup function. Verifies that both notifications with and | 980 Date.now = function() { return 3000000; }; |
662 // without show time are handled correctly and that cards are correctly | 981 |
663 // added to existing cards with same ID or start a new combined card. | 982 // GROUP1 was requested and contains cards c4 and c5. For c5, there is a |
664 | 983 // non-expired dismissal, so it will be ignored. |
665 // Setup and expectations. | 984 // GROUP2 was not requested, but is contained in server response to |
666 var combinedCards = { | 985 // indicate that the group still exists. Stored group GROUP2 won't change. |
667 'EXISTING CARD': [1] | 986 // GROUP3 is stored, but is not present in server's response, which means |
668 }; | 987 // it doesn't exist anymore. This group will be deleted. |
669 | 988 // GROUP4 doesn't contain cards, but it was requested. This is treated as |
670 var receivedNotificationNoShowTime = { | 989 // if it had an empty array of cards. Cards in the stored group will be |
671 chromeNotificationId: 'EXISTING CARD', | 990 // replaced with an empty array. |
672 trigger: {hideTimeSec: 1} | 991 // GROUP5 doesn't have next poll time, and it will be stored without next |
673 }; | 992 // poll time. |
674 var receivedNotificationWithShowTime = { | 993 var serverResponse = { |
675 chromeNotificationId: 'NEW CARD', | 994 groups: { |
676 trigger: {showTimeSec: 2, hideTimeSec: 3} | 995 GROUP1: {requested: true, nextPollSeconds: 46}, |
677 } | 996 GROUP2: {requested: false}, |
678 | 997 GROUP4: {requested: true, nextPollSeconds: 45}, |
679 var storedGroup = { | 998 GROUP5: {requested: true} |
680 cardsTimestamp: 10000, | 999 }, |
681 cards: [ | 1000 notifications: [ |
682 receivedNotificationNoShowTime, | 1001 {notificationId: 'c4', groupName: 'GROUP1'}, |
683 receivedNotificationWithShowTime | 1002 {notificationId: 'c5', groupName: 'GROUP1'} |
684 ] | 1003 ] |
685 }; | 1004 }; |
686 | 1005 |
687 // Invoking the tested function. | 1006 var recentDismissals = { |
688 combineGroup(combinedCards, storedGroup); | 1007 c4: 1800000, // expired dismissal |
689 | 1008 c5: 1800001 // non-expired dismissal |
690 // Check the output value. | 1009 }; |
691 var expectedCombinedCards = { | 1010 |
692 'EXISTING CARD': [ | 1011 var storedGroups = { |
693 1, | 1012 GROUP2: { |
694 { | 1013 cards: [{notificationId: 'c2'}], |
695 receivedNotification: receivedNotificationNoShowTime, | 1014 cardsTimestamp: 239, |
696 hideTime: 11000 | 1015 nextPollTime: 10000 |
697 } | 1016 }, |
698 ], | 1017 GROUP3: { |
699 'NEW CARD': [ | 1018 cards: [{notificationId: 'c3'}], |
700 { | 1019 cardsTimestamp: 240, |
701 receivedNotification: receivedNotificationWithShowTime, | 1020 nextPollTime: 10001 |
702 showTime: 12000, | 1021 }, |
703 hideTime: 13000 | 1022 GROUP4: { |
704 } | 1023 cards: [{notificationId: 'c6'}], |
705 ] | 1024 cardsTimestamp: 241, |
706 }; | 1025 nextPollTime: 10002 |
707 | 1026 } |
708 assertEquals( | 1027 }; |
709 JSON.stringify(expectedCombinedCards), | 1028 |
710 JSON.stringify(combinedCards)); | 1029 var expectedUpdatedGroups = { |
711 }); | 1030 GROUP1: { |
712 | 1031 cards: [{notificationId: 'c4', groupName: 'GROUP1'}], |
713 TEST_F( | 1032 cardsTimestamp: 3000000, |
714 'GoogleNowBackgroundUnitTest', | 1033 nextPollTime: 3046000 |
715 'CombineAndShowNotificationCards', | 1034 }, |
716 function() { | 1035 GROUP2: { |
717 // Tests combineAndShowNotificationCards function. | 1036 cards: [{notificationId: 'c2'}], |
718 // The test passes 2 groups to combineAndShowNotificationCards, checks | 1037 cardsTimestamp: 239, |
719 // that it calls combineGroup() for each of these groups and calls | 1038 nextPollTime: 10000 |
720 // showNotificationCards() with the results of these combineGroup() calls. | 1039 }, |
721 | 1040 GROUP4: { |
722 // Setup and expectations. | 1041 cards: [], |
723 var testGroups = { | 1042 cardsTimestamp: 3000000, |
724 'TEST GROUP 1': {testField: 'TEST VALUE 1'}, | 1043 nextPollTime: 3045000 |
725 'TEST GROUP 2': {testField: 'TEST VALUE 2'} | 1044 }, |
726 }; | 1045 GROUP5: { |
727 | 1046 cards: [], |
728 var fakeOnSuccessFunction = 'FAKE ON SUCCESS FUNCTION'; | 1047 cardsTimestamp: 3000000 |
729 var fakeOnCardShownFunction = 'FAKE ON CARD SHOWN FUNCTION'; | 1048 } |
730 | 1049 }; |
731 this.makeAndRegisterMockGlobals( | 1050 |
732 ['combineGroup', 'showNotificationCards']); | 1051 var expectedUpdatedRecentDismissals = { |
733 | 1052 c5: 1800001 |
734 var combineGroupSavedArgs = new SaveMockArguments(); | 1053 }; |
735 this.mockGlobals.expects(once()). | 1054 |
736 combineGroup( | 1055 this.makeAndRegisterMockGlobals([ |
737 combineGroupSavedArgs.match(eqJSON({})), | 1056 'scheduleNextPoll' |
738 combineGroupSavedArgs.match(eqJSON({testField: 'TEST VALUE 1'}))). | 1057 ]); |
739 will(callFunction(function() { | 1058 |
740 combineGroupSavedArgs.arguments[0].card1 = { | 1059 this.makeAndRegisterMockApis([ |
741 testValue: 'TEST CARD VALUE 1' | 1060 'fillFromChromeLocalStorage', |
742 }; | 1061 ]); |
743 })); | 1062 |
744 this.mockGlobals.expects(once()). | 1063 expectChromeLocalStorageGet( |
745 combineGroup( | 1064 this, |
746 combineGroupSavedArgs.match( | 1065 { |
747 eqJSON({card1: {testValue: 'TEST CARD VALUE 1'}})), | 1066 notificationGroups: {}, |
748 combineGroupSavedArgs.match( | 1067 recentDismissals: {} |
749 eqJSON({testField: 'TEST VALUE 2'}))). | 1068 }, |
750 will(callFunction(function() { | 1069 { |
751 combineGroupSavedArgs.arguments[0].card2 = { | 1070 notificationGroups: storedGroups, |
752 testValue: 'TEST CARD VALUE 2' | 1071 recentDismissals: recentDismissals |
753 }; | 1072 }); |
754 })); | 1073 |
755 this.mockGlobals.expects(once()). | 1074 this.mockGlobals.expects(once()). |
756 showNotificationCards( | 1075 scheduleNextPoll(eqJSON(expectedUpdatedGroups), true); |
757 eqJSON(testGroups), | 1076 |
758 eqJSON({ | 1077 // Invoking the tested function. |
759 card1: {testValue: 'TEST CARD VALUE 1'}, | 1078 processServerResponse(serverResponse); |
760 card2: {testValue: 'TEST CARD VALUE 2'} | 1079 }); |
761 }), | 1080 |
762 fakeOnSuccessFunction, | 1081 TEST_F(TEST_NAME, 'ProcessServerResponseGoogleNowDisabled', function() { |
763 fakeOnCardShownFunction); | 1082 // Tests processServerResponse function for the case when the response |
764 | 1083 // indicates that Google Now is disabled. |
765 // Invoking the tested function. | 1084 |
766 combineAndShowNotificationCards( | 1085 // Setup and expectations. |
767 testGroups, fakeOnSuccessFunction, fakeOnCardShownFunction); | 1086 var serverResponse = { |
768 }); | 1087 googleNowDisabled: true, |
769 | 1088 groups: {} |
770 TEST_F( | 1089 }; |
771 'GoogleNowBackgroundUnitTest', | 1090 |
772 'ProcessServerResponse', | 1091 this.makeAndRegisterMockGlobals([ |
773 function() { | 1092 'onStateChange', |
774 // Tests processServerResponse function. | 1093 'scheduleNextPoll', |
775 | 1094 ]); |
776 // Setup and expectations. | 1095 |
777 Date.now = function() { return 3000000; }; | 1096 this.makeAndRegisterMockApis([ |
778 | 1097 'chrome.storage.local.set', |
779 // GROUP1 was requested and contains cards c4 and c5. For c5, there is a | 1098 'fillFromChromeLocalStorage' |
780 // non-expired dismissal, so it will be ignored. | 1099 ]); |
781 // GROUP2 was not requested, but is contained in server response to | 1100 |
782 // indicate that the group still exists. Stored group GROUP2 won't change. | 1101 this.mockApis.expects(once()). |
783 // GROUP3 is stored, but is not present in server's response, which means | 1102 chrome_storage_local_set(eqJSON({googleNowEnabled: false})); |
784 // it doesn't exist anymore. This group will be deleted. | 1103 |
785 // GROUP4 doesn't contain cards, but it was requested. This is treated as | 1104 this.mockGlobals.expects(once()).onStateChange(); |
786 // if it had an empty array of cards. Cards in the stored group will be | 1105 |
787 // replaced with an empty array. | 1106 expectChromeLocalStorageGet( |
788 // GROUP5 doesn't have next poll time, and it will be stored without next | 1107 this, |
789 // poll time. | 1108 { |
790 var serverResponse = { | 1109 notificationGroups: {}, |
791 groups: { | 1110 recentDismissals: {} |
792 GROUP1: {requested: true, nextPollSeconds: 46}, | 1111 }, |
793 GROUP2: {requested: false}, | 1112 { |
794 GROUP4: {requested: true, nextPollSeconds: 45}, | 1113 notificationGroups: {}, |
795 GROUP5: {requested: true} | 1114 recentDismissals: {} |
796 }, | 1115 }); |
797 notifications: [ | 1116 |
798 {notificationId: 'c4', groupName: 'GROUP1'}, | 1117 this.mockGlobals.expects(once()).scheduleNextPoll(eqJSON({}), false); |
799 {notificationId: 'c5', groupName: 'GROUP1'} | 1118 |
800 ] | 1119 // Invoking the tested function. |
801 }; | 1120 processServerResponse(serverResponse); |
802 | 1121 }); |
803 var recentDismissals = { | 1122 |
804 c4: 1800000, // expired dismissal | |
805 c5: 1800001 // non-expired dismissal | |
806 }; | |
807 | |
808 var storedGroups = { | |
809 GROUP2: { | |
810 cards: [{notificationId: 'c2'}], | |
811 cardsTimestamp: 239, | |
812 nextPollTime: 10000 | |
813 }, | |
814 GROUP3: { | |
815 cards: [{notificationId: 'c3'}], | |
816 cardsTimestamp: 240, | |
817 nextPollTime: 10001 | |
818 }, | |
819 GROUP4: { | |
820 cards: [{notificationId: 'c6'}], | |
821 cardsTimestamp: 241, | |
822 nextPollTime: 10002 | |
823 } | |
824 }; | |
825 | |
826 var expectedUpdatedGroups = { | |
827 GROUP1: { | |
828 cards: [{notificationId: 'c4', groupName: 'GROUP1'}], | |
829 cardsTimestamp: 3000000, | |
830 nextPollTime: 3046000 | |
831 }, | |
832 GROUP2: { | |
833 cards: [{notificationId: 'c2'}], | |
834 cardsTimestamp: 239, | |
835 nextPollTime: 10000 | |
836 }, | |
837 GROUP4: { | |
838 cards: [], | |
839 cardsTimestamp: 3000000, | |
840 nextPollTime: 3045000 | |
841 }, | |
842 GROUP5: { | |
843 cards: [], | |
844 cardsTimestamp: 3000000 | |
845 } | |
846 }; | |
847 | |
848 var expectedUpdatedRecentDismissals = { | |
849 c5: 1800001 | |
850 }; | |
851 | |
852 var fakeOnCardShownFunction = 'FAKE ON CARD SHOWN FUNCTION'; | |
853 | |
854 this.makeAndRegisterMockGlobals([ | |
855 'combineAndShowNotificationCards', | |
856 'recordEvent', | |
857 'scheduleNextPoll' | |
858 ]); | |
859 | |
860 this.makeAndRegisterMockApis([ | |
861 'chrome.storage.local.set', | |
862 'fillFromChromeLocalStorage' | |
863 ]); | |
864 | |
865 expectChromeLocalStorageGet( | |
866 this, | |
867 { | |
868 notificationGroups: {}, | |
869 recentDismissals: {} | |
870 }, | |
871 { | |
872 notificationGroups: storedGroups, | |
873 recentDismissals: recentDismissals | |
874 }); | |
875 | |
876 this.mockGlobals.expects(once()). | |
877 scheduleNextPoll(eqJSON(expectedUpdatedGroups), true); | |
878 | |
879 var combineAndShowNotificationCardsSavedArgs = new SaveMockArguments(); | |
880 this.mockGlobals.expects(once()). | |
881 combineAndShowNotificationCards( | |
882 combineAndShowNotificationCardsSavedArgs.match( | |
883 eqJSON(expectedUpdatedGroups)), | |
884 combineAndShowNotificationCardsSavedArgs.match( | |
885 ANYTHING), | |
886 combineAndShowNotificationCardsSavedArgs.match( | |
887 eq(fakeOnCardShownFunction))). | |
888 will(invokeCallback(combineAndShowNotificationCardsSavedArgs, 1)); | |
889 | |
890 this.mockApis.expects(once()). | |
891 chrome_storage_local_set( | |
892 eqJSON({ | |
893 notificationGroups: expectedUpdatedGroups, | |
894 recentDismissals: expectedUpdatedRecentDismissals})); | |
895 | |
896 this.mockGlobals.expects(once()). | |
897 recordEvent(GoogleNowEvent.CARDS_PARSE_SUCCESS); | |
898 | |
899 // Invoking the tested function. | |
900 processServerResponse(serverResponse, fakeOnCardShownFunction); | |
901 }); | |
902 | |
903 TEST_F( | |
904 'GoogleNowBackgroundUnitTest', | |
905 'ProcessServerResponseGoogleNowDisabled', | |
906 function() { | |
907 // Tests processServerResponse function for the case when the response | |
908 // indicates that Google Now is disabled. | |
909 | |
910 // Setup and expectations. | |
911 var serverResponse = { | |
912 googleNowDisabled: true, | |
913 groups: { | |
914 GROUP1: {nextPollTimeSeconds: 200} | |
915 } | |
916 }; | |
917 | |
918 var storedGroups = { | |
919 GROUP2: { | |
920 cards: [{notificationId: 'c2'}], | |
921 cardsTimestamp: 239, | |
922 nextPollTime: 10000 | |
923 }, | |
924 GROUP3: { | |
925 cards: [{notificationId: 'c3'}], | |
926 cardsTimestamp: 240, | |
927 nextPollTime: 10001 | |
928 } | |
929 }; | |
930 | |
931 var expectedUpdatedGroups = { | |
932 }; | |
933 | |
934 var fakeOnCardShownFunction = 'FAKE ON CARD SHOWN FUNCTION'; | |
935 | |
936 this.makeAndRegisterMockGlobals([ | |
937 'combineAndShowNotificationCards', | |
938 'onStateChange', | |
939 'recordEvent', | |
940 'scheduleNextPoll' | |
941 ]); | |
942 | |
943 this.makeAndRegisterMockApis([ | |
944 'chrome.storage.local.set', | |
945 'fillFromChromeLocalStorage' | |
946 ]); | |
947 | |
948 this.mockApis.expects(once()). | |
949 chrome_storage_local_set( | |
950 eqJSON({googleNowEnabled: false})); | |
951 | |
952 this.mockGlobals.expects(once()).onStateChange(); | |
953 | |
954 expectChromeLocalStorageGet( | |
955 this, | |
956 { | |
957 notificationGroups: {}, | |
958 recentDismissals: {} | |
959 }, | |
960 { | |
961 notificationGroups: storedGroups, | |
962 recentDismissals: {} | |
963 }); | |
964 | |
965 this.mockGlobals.expects(once()). | |
966 scheduleNextPoll(eqJSON(expectedUpdatedGroups), false); | |
967 | |
968 var combineAndShowNotificationCardsSavedArgs = new SaveMockArguments(); | |
969 this.mockGlobals.expects(once()). | |
970 combineAndShowNotificationCards( | |
971 combineAndShowNotificationCardsSavedArgs.match( | |
972 eqJSON(expectedUpdatedGroups)), | |
973 combineAndShowNotificationCardsSavedArgs.match( | |
974 ANYTHING), | |
975 combineAndShowNotificationCardsSavedArgs.match( | |
976 eq(fakeOnCardShownFunction))). | |
977 will(invokeCallback(combineAndShowNotificationCardsSavedArgs, 1)); | |
978 | |
979 this.mockApis.expects(once()). | |
980 chrome_storage_local_set( | |
981 eqJSON({ | |
982 notificationGroups: expectedUpdatedGroups, | |
983 recentDismissals: {}})); | |
984 | |
985 this.mockGlobals.expects(once()). | |
986 recordEvent(GoogleNowEvent.CARDS_PARSE_SUCCESS); | |
987 | |
988 // Invoking the tested function. | |
989 processServerResponse(serverResponse, fakeOnCardShownFunction); | |
990 }); | |
OLD | NEW |