Chromium Code Reviews| 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 |
| (...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 422 GoogleNowEvent.GOOGLE_NOW_DISABLED); | 744 GoogleNowEvent.GOOGLE_NOW_DISABLED); |
| 423 updateRunningState(signedIn, true, notificationEnabled, googleNowEnabled); | 745 updateRunningState(signedIn, true, notificationEnabled, googleNowEnabled); |
| 424 }); | 746 }); |
| 425 | 747 |
| 426 /** | 748 /** |
| 427 * Mocks global functions and APIs that onNotificationClicked() depends upon. | 749 * Mocks global functions and APIs that onNotificationClicked() depends upon. |
| 428 * @param {Test} fixture Test fixture. | 750 * @param {Test} fixture Test fixture. |
| 429 */ | 751 */ |
| 430 function mockOnNotificationClickedDependencies(fixture) { | 752 function mockOnNotificationClickedDependencies(fixture) { |
| 431 fixture.makeAndRegisterMockApis([ | 753 fixture.makeAndRegisterMockApis([ |
| 432 'chrome.windows.create', | 754 'chrome.windows.create', |
| 433 'chrome.windows.update', | 755 'chrome.windows.update', |
| 434 'fillFromChromeLocalStorage', | 756 'fillFromChromeLocalStorage', |
| 435 'instrumented.tabs.create']); | 757 'instrumented.tabs.create']); |
| 436 } | 758 } |
| 437 | 759 |
| 438 TEST_F( | 760 TEST_F(TEST_NAME, 'OnNotificationClicked_NoData', function() { |
| 439 'GoogleNowBackgroundUnitTest', | 761 // Tests the case when there is no data associated with notification id. |
| 440 'OnNotificationClicked_NoData', | 762 // In this case, the function should do nothing. |
| 441 function() { | 763 |
| 442 // Tests the case when there is no data associated with notification id. | 764 // Setup and expectations. |
| 443 // In this case, the function should do nothing. | 765 var testNotificationId = 'TEST_ID'; |
| 444 | 766 var testNotificationDataRequest = {notificationsData: {}}; |
| 445 // Setup and expectations. | 767 var testNotificationData = {notificationsData: {}}; |
| 446 var testNotificationId = 'TEST_ID'; | 768 |
| 447 var testNotificationDataRequest = {notificationsData: {}}; | 769 mockOnNotificationClickedDependencies(this); |
| 448 var testNotificationData = {notificationsData: {}}; | 770 this.makeMockLocalFunctions(['selector']); |
| 449 | 771 |
| 450 mockOnNotificationClickedDependencies(this); | 772 expectChromeLocalStorageGet( |
| 451 this.makeMockLocalFunctions(['selector']); | 773 this, testNotificationDataRequest, testNotificationData); |
| 452 | 774 |
| 453 expectChromeLocalStorageGet( | 775 // Invoking the tested function. |
| 454 this, testNotificationDataRequest, testNotificationData); | 776 onNotificationClicked( |
| 455 | 777 testNotificationId, this.mockLocalFunctions.functions().selector); |
| 456 // Invoking the tested function. | 778 }); |
| 457 onNotificationClicked( | 779 |
| 458 testNotificationId, this.mockLocalFunctions.functions().selector); | 780 TEST_F(TEST_NAME, 'OnNotificationClicked_ActionUrlsUndefined', function() { |
| 459 }); | 781 // Tests the case when the data associated with notification id is |
| 460 | 782 // 'undefined'. |
| 461 TEST_F( | 783 // In this case, the function should do nothing. |
| 462 'GoogleNowBackgroundUnitTest', | 784 |
| 463 'OnNotificationClicked_ActionUrlsUndefined', | 785 // Setup and expectations. |
| 464 function() { | 786 var testActionUrls = undefined; |
| 465 // Tests the case when the data associated with notification id is | 787 var testNotificationId = 'TEST_ID'; |
| 466 // 'undefined'. | 788 var testNotificationDataRequest = {notificationsData: {}}; |
| 467 // In this case, the function should do nothing. | 789 var testNotificationData = { |
| 468 | 790 notificationsData: {'TEST_ID': {actionUrls: testActionUrls}} |
| 469 // Setup and expectations. | 791 }; |
| 470 var testActionUrls = undefined; | 792 |
| 471 var testNotificationId = 'TEST_ID'; | 793 mockOnNotificationClickedDependencies(this); |
| 472 var testNotificationDataRequest = {notificationsData: {}}; | 794 this.makeMockLocalFunctions(['selector']); |
| 473 var testNotificationData = { | 795 |
| 474 notificationsData: {'TEST_ID': {actionUrls: testActionUrls}} | 796 expectChromeLocalStorageGet( |
| 475 }; | 797 this, testNotificationDataRequest, testNotificationData); |
| 476 | 798 |
| 477 mockOnNotificationClickedDependencies(this); | 799 this.mockLocalFunctions.expects(once()) |
| 478 this.makeMockLocalFunctions(['selector']); | 800 .selector(eqJSON( |
| 479 | 801 testNotificationData.notificationsData[testNotificationId])) |
| 480 expectChromeLocalStorageGet( | 802 .will(returnValue(undefined)); |
| 481 this, testNotificationDataRequest, testNotificationData); | 803 |
| 482 | 804 // Invoking the tested function. |
| 483 this.mockLocalFunctions.expects(once()) | 805 onNotificationClicked( |
| 484 .selector(eqJSON( | 806 testNotificationId, this.mockLocalFunctions.functions().selector); |
| 485 testNotificationData.notificationsData[testNotificationId])) | 807 }); |
| 486 .will(returnValue(undefined)); | 808 |
| 487 | 809 TEST_F(TEST_NAME, 'OnNotificationClicked_TabCreateSuccess', function() { |
| 488 // Invoking the tested function. | 810 // Tests the selected URL is OK and crome.tabs.create suceeds. |
| 489 onNotificationClicked( | 811 |
| 490 testNotificationId, this.mockLocalFunctions.functions().selector); | 812 // Setup and expectations. |
| 491 }); | 813 var testActionUrls = {testField: 'TEST VALUE'}; |
| 492 | 814 var testNotificationId = 'TEST_ID'; |
| 493 TEST_F( | 815 var testNotificationDataRequest = {notificationsData: {}}; |
| 494 'GoogleNowBackgroundUnitTest', | 816 var testNotificationData = { |
| 495 'OnNotificationClicked_TabCreateSuccess', | 817 notificationsData: {'TEST_ID': {actionUrls: testActionUrls}} |
| 496 function() { | 818 }; |
| 497 // Tests the selected URL is OK and crome.tabs.create suceeds. | 819 var testActionUrl = 'http://testurl.com'; |
| 498 | 820 var testCreatedTab = {windowId: 239}; |
| 499 // Setup and expectations. | 821 |
| 500 var testActionUrls = {testField: 'TEST VALUE'}; | 822 mockOnNotificationClickedDependencies(this); |
| 501 var testNotificationId = 'TEST_ID'; | 823 this.makeMockLocalFunctions(['selector']); |
| 502 var testNotificationDataRequest = {notificationsData: {}}; | 824 |
| 503 var testNotificationData = { | 825 expectChromeLocalStorageGet( |
| 504 notificationsData: {'TEST_ID': {actionUrls: testActionUrls}} | 826 this, testNotificationDataRequest, testNotificationData); |
| 505 }; | 827 this.mockLocalFunctions.expects(once()) |
| 506 var testActionUrl = 'http://testurl.com'; | 828 .selector(eqJSON( |
| 507 var testCreatedTab = {windowId: 239}; | 829 testNotificationData.notificationsData[testNotificationId])) |
| 508 | 830 .will(returnValue(testActionUrl)); |
| 509 mockOnNotificationClickedDependencies(this); | 831 var chromeTabsCreateSavedArgs = new SaveMockArguments(); |
| 510 this.makeMockLocalFunctions(['selector']); | 832 this.mockApis.expects(once()). |
| 511 | 833 instrumented_tabs_create( |
| 512 expectChromeLocalStorageGet( | 834 chromeTabsCreateSavedArgs.match(eqJSON({url: testActionUrl})), |
| 513 this, testNotificationDataRequest, testNotificationData); | 835 chromeTabsCreateSavedArgs.match(ANYTHING)). |
| 514 this.mockLocalFunctions.expects(once()) | 836 will(invokeCallback(chromeTabsCreateSavedArgs, 1, testCreatedTab)); |
| 515 .selector(eqJSON( | 837 this.mockApis.expects(once()).chrome_windows_update( |
| 516 testNotificationData.notificationsData[testNotificationId])) | 838 testCreatedTab.windowId, |
| 517 .will(returnValue(testActionUrl)); | 839 eqJSON({focused: true})); |
| 518 var chromeTabsCreateSavedArgs = new SaveMockArguments(); | 840 |
| 519 this.mockApis.expects(once()). | 841 // Invoking the tested function. |
| 520 instrumented_tabs_create( | 842 onNotificationClicked( |
| 521 chromeTabsCreateSavedArgs.match(eqJSON({url: testActionUrl})), | 843 testNotificationId, this.mockLocalFunctions.functions().selector); |
| 522 chromeTabsCreateSavedArgs.match(ANYTHING)). | 844 }); |
| 523 will(invokeCallback(chromeTabsCreateSavedArgs, 1, testCreatedTab)); | 845 |
| 524 this.mockApis.expects(once()).chrome_windows_update( | 846 TEST_F(TEST_NAME, 'OnNotificationClicked_TabCreateFail', function() { |
| 525 testCreatedTab.windowId, | 847 // Tests the selected URL is OK and crome.tabs.create fails. |
| 526 eqJSON({focused: true})); | 848 // In this case, the function should invoke chrome.windows.create as a |
| 527 | 849 // second attempt. |
| 528 // Invoking the tested function. | 850 |
| 529 onNotificationClicked( | 851 // Setup and expectations. |
| 530 testNotificationId, this.mockLocalFunctions.functions().selector); | 852 var testActionUrls = {testField: 'TEST VALUE'}; |
| 531 }); | 853 var testNotificationId = 'TEST_ID'; |
| 532 | 854 var testNotificationDataRequest = {notificationsData: {}}; |
| 533 TEST_F( | 855 var testNotificationData = { |
| 534 'GoogleNowBackgroundUnitTest', | 856 notificationsData: {'TEST_ID': {actionUrls: testActionUrls}} |
| 535 'OnNotificationClicked_TabCreateFail', | 857 }; |
| 536 function() { | 858 var testActionUrl = 'http://testurl.com'; |
| 537 // Tests the selected URL is OK and crome.tabs.create fails. | 859 var testCreatedTab = undefined; // chrome.tabs.create fails |
| 538 // In this case, the function should invoke chrome.windows.create as a | 860 |
| 539 // second attempt. | 861 mockOnNotificationClickedDependencies(this); |
| 540 | 862 this.makeMockLocalFunctions(['selector']); |
| 541 // Setup and expectations. | 863 |
| 542 var testActionUrls = {testField: 'TEST VALUE'}; | 864 expectChromeLocalStorageGet( |
| 543 var testNotificationId = 'TEST_ID'; | 865 this, testNotificationDataRequest, testNotificationData); |
| 544 var testNotificationDataRequest = {notificationsData: {}}; | 866 this.mockLocalFunctions.expects(once()) |
| 545 var testNotificationData = { | 867 .selector(eqJSON( |
| 546 notificationsData: {'TEST_ID': {actionUrls: testActionUrls}} | 868 testNotificationData.notificationsData[testNotificationId])) |
| 547 }; | 869 .will(returnValue(testActionUrl)); |
| 548 var testActionUrl = 'http://testurl.com'; | 870 var chromeTabsCreateSavedArgs = new SaveMockArguments(); |
| 549 var testCreatedTab = undefined; // chrome.tabs.create fails | 871 this.mockApis.expects(once()). |
| 550 | 872 instrumented_tabs_create( |
| 551 mockOnNotificationClickedDependencies(this); | 873 chromeTabsCreateSavedArgs.match(eqJSON({url: testActionUrl})), |
| 552 this.makeMockLocalFunctions(['selector']); | 874 chromeTabsCreateSavedArgs.match(ANYTHING)). |
| 553 | 875 will(invokeCallback(chromeTabsCreateSavedArgs, 1, testCreatedTab)); |
| 554 expectChromeLocalStorageGet( | 876 this.mockApis.expects(once()).chrome_windows_create( |
| 555 this, testNotificationDataRequest, testNotificationData); | 877 eqJSON({url: testActionUrl, focused: true})); |
| 556 this.mockLocalFunctions.expects(once()) | 878 |
| 557 .selector(eqJSON( | 879 // Invoking the tested function. |
| 558 testNotificationData.notificationsData[testNotificationId])) | 880 onNotificationClicked( |
| 559 .will(returnValue(testActionUrl)); | 881 testNotificationId, this.mockLocalFunctions.functions().selector); |
| 560 var chromeTabsCreateSavedArgs = new SaveMockArguments(); | 882 }); |
| 561 this.mockApis.expects(once()). | 883 |
| 562 instrumented_tabs_create( | 884 TEST_F(TEST_NAME, 'showNotificationGroups', function() { |
|
rgustafson
2014/04/02 18:14:06
show -> Show
robliao
2014/04/02 21:53:20
Done.
| |
| 563 chromeTabsCreateSavedArgs.match(eqJSON({url: testActionUrl})), | 885 // Tests showNotificationGroups function. Checks that the function properly |
| 564 chromeTabsCreateSavedArgs.match(ANYTHING)). | 886 // deletes the card that didn't get an update, updates existing card and |
| 565 will(invokeCallback(chromeTabsCreateSavedArgs, 1, testCreatedTab)); | 887 // creates a new card that previously didn't exist. |
| 566 this.mockApis.expects(once()).chrome_windows_create( | 888 |
| 567 eqJSON({url: testActionUrl, focused: true})); | 889 // Setup and expectations. |
| 568 | 890 var existingNotifications = { |
| 569 // Invoking the tested function. | 891 'SHOULD BE DELETED': 'SOMETHING', |
| 570 onNotificationClicked( | 892 'SHOULD BE KEPT': 'SOMETHING' |
| 571 testNotificationId, this.mockLocalFunctions.functions().selector); | 893 }; |
| 572 }); | 894 |
| 573 | 895 var keptCard = { |
| 574 TEST_F( | 896 chromeNotificationId: 'SHOULD BE KEPT', |
| 575 'GoogleNowBackgroundUnitTest', | 897 trigger: {showTimeSec: 0, hideTimeSec: 0} |
| 576 'ShowNotificationCards', | 898 }; |
| 577 function() { | 899 |
| 578 // Tests showNotificationCards function. Checks that the function properly | 900 var keptNotification = { |
| 579 // deletes the card that didn't get an update, updates existing card and | 901 receivedNotification: keptCard, |
| 580 // creates a new card that previously didn't exist. | 902 showTime: 0, |
| 581 | 903 hideTime: 0 |
| 582 // Setup and expectations. | 904 }; |
| 583 var existingNotifications = { | 905 |
| 584 'SHOULD BE DELETED': 'SOMETHING', | 906 var newCard = { |
| 585 'SHOULD BE KEPT': 'SOMETHING' | 907 chromeNotificationId: 'NEW CARD', |
| 586 }; | 908 trigger: {showTimeSec: 0, hideTimeSec: 0} |
| 587 | 909 }; |
| 588 var notificationGroups = { | 910 |
| 589 TEST_FIELD: 'TEST VALUE' | 911 var newNotification = { |
| 590 }; | 912 receivedNotification: newCard, |
| 591 | 913 showTime: 0, |
| 592 var cards = { | 914 hideTime: 0 |
| 593 'SHOULD BE KEPT': [1], | 915 }; |
| 594 'NEW CARD': [2] | 916 |
| 595 }; | 917 var notificationGroups = { |
| 596 | 918 'TEST GROUP 1': {cards: [keptCard], cardsTimestamp: 0}, |
| 597 var fakeOnCardShownFunction = 'FAKE ON CARD SHOWN FUNCTION'; | 919 'TEST GROUP 2': {cards: [newCard], cardsTimestamp: 0} |
| 598 | 920 }; |
| 599 var expectedUpdatedNotifications = { | 921 |
| 600 'SHOULD BE KEPT': 'KEPT CARD NOTIFICATION DATA', | 922 var fakeOnCardShownFunction = 'FAKE ON CARD SHOWN FUNCTION'; |
| 601 'NEW CARD': 'NEW CARD NOTIFICATION DATA' | 923 |
| 602 }; | 924 var expectedUpdatedNotifications = { |
| 603 | 925 'SHOULD BE KEPT': 'KEPT CARD NOTIFICATION DATA', |
| 604 this.makeAndRegisterMockApis([ | 926 'NEW CARD': 'NEW CARD NOTIFICATION DATA' |
| 605 'cardSet.update', | 927 }; |
| 606 'chrome.storage.local.set', | 928 |
| 607 'instrumented.notifications.getAll' | 929 this.makeAndRegisterMockApis([ |
| 608 ]); | 930 'cardSet.update', |
| 609 this.makeMockLocalFunctions([ | 931 'chrome.storage.local.set', |
| 610 'onSuccess' | 932 'instrumented.notifications.getAll' |
| 611 ]); | 933 ]); |
| 612 | 934 this.makeMockLocalFunctions([ |
| 613 var notificationsGetAllSavedArgs = new SaveMockArguments(); | 935 'onSuccess' |
| 614 this.mockApis.expects(once()). | 936 ]); |
| 615 instrumented_notifications_getAll( | 937 |
| 616 notificationsGetAllSavedArgs.match(ANYTHING)). | 938 var notificationsGetAllSavedArgs = new SaveMockArguments(); |
| 617 will(invokeCallback( | 939 this.mockApis.expects(once()). |
| 618 notificationsGetAllSavedArgs, 0, existingNotifications)); | 940 instrumented_notifications_getAll( |
| 619 | 941 notificationsGetAllSavedArgs.match(ANYTHING)). |
| 620 this.mockApis.expects(once()). | 942 will(invokeCallback( |
| 621 cardSet_update( | 943 notificationsGetAllSavedArgs, 0, existingNotifications)); |
| 622 'SHOULD BE KEPT', | 944 |
| 623 [1], | 945 this.mockApis.expects(once()). |
| 624 eqJSON(notificationGroups), | 946 cardSet_update( |
| 625 fakeOnCardShownFunction). | 947 'SHOULD BE KEPT', |
| 626 will(returnValue('KEPT CARD NOTIFICATION DATA')); | 948 eqJSON([keptNotification]), |
| 627 this.mockApis.expects(once()). | 949 eqJSON(notificationGroups), |
| 628 cardSet_update( | 950 fakeOnCardShownFunction). |
| 629 'NEW CARD', | 951 will(returnValue('KEPT CARD NOTIFICATION DATA')); |
| 630 [2], | 952 this.mockApis.expects(once()). |
| 631 eqJSON(notificationGroups), | 953 cardSet_update( |
| 632 fakeOnCardShownFunction). | 954 'NEW CARD', |
| 633 will(returnValue('NEW CARD NOTIFICATION DATA')); | 955 eqJSON([newNotification]), |
| 634 this.mockApis.expects(once()). | 956 eqJSON(notificationGroups), |
| 635 cardSet_update( | 957 fakeOnCardShownFunction). |
| 636 'SHOULD BE DELETED', | 958 will(returnValue('NEW CARD NOTIFICATION DATA')); |
| 637 [], | 959 this.mockApis.expects(once()). |
| 638 eqJSON(notificationGroups), | 960 cardSet_update( |
| 639 fakeOnCardShownFunction). | 961 'SHOULD BE DELETED', |
| 640 will(returnValue(undefined)); | 962 [], |
| 641 | 963 eqJSON(notificationGroups), |
| 642 this.mockApis.expects(once()). | 964 fakeOnCardShownFunction). |
| 643 chrome_storage_local_set( | 965 will(returnValue(undefined)); |
| 644 eqJSON({notificationsData: expectedUpdatedNotifications})); | 966 |
| 645 | 967 this.mockApis.expects(once()). |
| 646 this.mockLocalFunctions.expects(once()). | 968 chrome_storage_local_set( |
| 647 onSuccess(); | 969 eqJSON({notificationsData: expectedUpdatedNotifications})); |
| 648 | 970 |
| 649 // Invoking the tested function. | 971 this.mockLocalFunctions.expects(once()). |
| 650 showNotificationCards( | 972 onSuccess(undefined); |
| 651 notificationGroups, | 973 |
| 652 cards, | 974 // Invoking the tested function. |
| 653 this.mockLocalFunctions.functions().onSuccess, | 975 showNotificationGroups(notificationGroups, fakeOnCardShownFunction) |
| 654 fakeOnCardShownFunction); | 976 .then(this.mockLocalFunctions.functions().onSuccess); |
| 655 }); | 977 }); |
| 656 | 978 |
| 657 TEST_F( | 979 TEST_F(TEST_NAME, 'ProcessServerResponse', function() { |
| 658 'GoogleNowBackgroundUnitTest', | 980 // Tests processServerResponse function. |
| 659 'CombineGroup', | 981 |
| 660 function() { | 982 // Setup and expectations. |
| 661 // Tests combineGroup function. Verifies that both notifications with and | 983 Date.now = function() { return 3000000; }; |
| 662 // without show time are handled correctly and that cards are correctly | 984 |
| 663 // added to existing cards with same ID or start a new combined card. | 985 // GROUP1 was requested and contains cards c4 and c5. For c5, there is a |
| 664 | 986 // non-expired dismissal, so it will be ignored. |
| 665 // Setup and expectations. | 987 // GROUP2 was not requested, but is contained in server response to |
| 666 var combinedCards = { | 988 // indicate that the group still exists. Stored group GROUP2 won't change. |
| 667 'EXISTING CARD': [1] | 989 // GROUP3 is stored, but is not present in server's response, which means |
| 668 }; | 990 // it doesn't exist anymore. This group will be deleted. |
| 669 | 991 // GROUP4 doesn't contain cards, but it was requested. This is treated as |
| 670 var receivedNotificationNoShowTime = { | 992 // if it had an empty array of cards. Cards in the stored group will be |
| 671 chromeNotificationId: 'EXISTING CARD', | 993 // replaced with an empty array. |
| 672 trigger: {hideTimeSec: 1} | 994 // GROUP5 doesn't have next poll time, and it will be stored without next |
| 673 }; | 995 // poll time. |
| 674 var receivedNotificationWithShowTime = { | 996 var serverResponse = { |
| 675 chromeNotificationId: 'NEW CARD', | 997 groups: { |
| 676 trigger: {showTimeSec: 2, hideTimeSec: 3} | 998 GROUP1: {requested: true, nextPollSeconds: 46}, |
| 677 } | 999 GROUP2: {requested: false}, |
| 678 | 1000 GROUP4: {requested: true, nextPollSeconds: 45}, |
| 679 var storedGroup = { | 1001 GROUP5: {requested: true} |
| 680 cardsTimestamp: 10000, | 1002 }, |
| 681 cards: [ | 1003 notifications: [ |
| 682 receivedNotificationNoShowTime, | 1004 {notificationId: 'c4', groupName: 'GROUP1'}, |
| 683 receivedNotificationWithShowTime | 1005 {notificationId: 'c5', groupName: 'GROUP1'} |
| 684 ] | 1006 ] |
| 685 }; | 1007 }; |
| 686 | 1008 |
| 687 // Invoking the tested function. | 1009 var recentDismissals = { |
| 688 combineGroup(combinedCards, storedGroup); | 1010 c4: 1800000, // expired dismissal |
| 689 | 1011 c5: 1800001 // non-expired dismissal |
| 690 // Check the output value. | 1012 }; |
| 691 var expectedCombinedCards = { | 1013 |
| 692 'EXISTING CARD': [ | 1014 var storedGroups = { |
| 693 1, | 1015 GROUP2: { |
| 694 { | 1016 cards: [{notificationId: 'c2'}], |
| 695 receivedNotification: receivedNotificationNoShowTime, | 1017 cardsTimestamp: 239, |
| 696 hideTime: 11000 | 1018 nextPollTime: 10000 |
| 697 } | 1019 }, |
| 698 ], | 1020 GROUP3: { |
| 699 'NEW CARD': [ | 1021 cards: [{notificationId: 'c3'}], |
| 700 { | 1022 cardsTimestamp: 240, |
| 701 receivedNotification: receivedNotificationWithShowTime, | 1023 nextPollTime: 10001 |
| 702 showTime: 12000, | 1024 }, |
| 703 hideTime: 13000 | 1025 GROUP4: { |
| 704 } | 1026 cards: [{notificationId: 'c6'}], |
| 705 ] | 1027 cardsTimestamp: 241, |
| 706 }; | 1028 nextPollTime: 10002 |
| 707 | 1029 } |
| 708 assertEquals( | 1030 }; |
| 709 JSON.stringify(expectedCombinedCards), | 1031 |
| 710 JSON.stringify(combinedCards)); | 1032 var expectedUpdatedGroups = { |
| 711 }); | 1033 GROUP1: { |
| 712 | 1034 cards: [{notificationId: 'c4', groupName: 'GROUP1'}], |
| 713 TEST_F( | 1035 cardsTimestamp: 3000000, |
| 714 'GoogleNowBackgroundUnitTest', | 1036 nextPollTime: 3046000 |
| 715 'CombineAndShowNotificationCards', | 1037 }, |
| 716 function() { | 1038 GROUP2: { |
| 717 // Tests combineAndShowNotificationCards function. | 1039 cards: [{notificationId: 'c2'}], |
| 718 // The test passes 2 groups to combineAndShowNotificationCards, checks | 1040 cardsTimestamp: 239, |
| 719 // that it calls combineGroup() for each of these groups and calls | 1041 nextPollTime: 10000 |
| 720 // showNotificationCards() with the results of these combineGroup() calls. | 1042 }, |
| 721 | 1043 GROUP4: { |
| 722 // Setup and expectations. | 1044 cards: [], |
| 723 var testGroups = { | 1045 cardsTimestamp: 3000000, |
| 724 'TEST GROUP 1': {testField: 'TEST VALUE 1'}, | 1046 nextPollTime: 3045000 |
| 725 'TEST GROUP 2': {testField: 'TEST VALUE 2'} | 1047 }, |
| 726 }; | 1048 GROUP5: { |
| 727 | 1049 cards: [], |
| 728 var fakeOnSuccessFunction = 'FAKE ON SUCCESS FUNCTION'; | 1050 cardsTimestamp: 3000000 |
| 729 var fakeOnCardShownFunction = 'FAKE ON CARD SHOWN FUNCTION'; | 1051 } |
| 730 | 1052 }; |
| 731 this.makeAndRegisterMockGlobals( | 1053 |
| 732 ['combineGroup', 'showNotificationCards']); | 1054 var expectedUpdatedRecentDismissals = { |
| 733 | 1055 c5: 1800001 |
| 734 var combineGroupSavedArgs = new SaveMockArguments(); | 1056 }; |
| 735 this.mockGlobals.expects(once()). | 1057 |
| 736 combineGroup( | 1058 this.makeAndRegisterMockGlobals([ |
| 737 combineGroupSavedArgs.match(eqJSON({})), | 1059 'scheduleNextPoll' |
| 738 combineGroupSavedArgs.match(eqJSON({testField: 'TEST VALUE 1'}))). | 1060 ]); |
| 739 will(callFunction(function() { | 1061 |
| 740 combineGroupSavedArgs.arguments[0].card1 = { | 1062 this.makeAndRegisterMockApis([ |
| 741 testValue: 'TEST CARD VALUE 1' | 1063 'fillFromChromeLocalStorage', |
| 742 }; | 1064 ]); |
| 743 })); | 1065 |
| 744 this.mockGlobals.expects(once()). | 1066 expectChromeLocalStorageGet( |
| 745 combineGroup( | 1067 this, |
| 746 combineGroupSavedArgs.match( | 1068 { |
| 747 eqJSON({card1: {testValue: 'TEST CARD VALUE 1'}})), | 1069 notificationGroups: {}, |
| 748 combineGroupSavedArgs.match( | 1070 recentDismissals: {} |
| 749 eqJSON({testField: 'TEST VALUE 2'}))). | 1071 }, |
| 750 will(callFunction(function() { | 1072 { |
| 751 combineGroupSavedArgs.arguments[0].card2 = { | 1073 notificationGroups: storedGroups, |
| 752 testValue: 'TEST CARD VALUE 2' | 1074 recentDismissals: recentDismissals |
| 753 }; | 1075 }); |
| 754 })); | 1076 |
| 755 this.mockGlobals.expects(once()). | 1077 this.mockGlobals.expects(once()). |
| 756 showNotificationCards( | 1078 scheduleNextPoll(eqJSON(expectedUpdatedGroups), true); |
| 757 eqJSON(testGroups), | 1079 |
| 758 eqJSON({ | 1080 // Invoking the tested function. |
| 759 card1: {testValue: 'TEST CARD VALUE 1'}, | 1081 var processedResponse = processServerResponse(serverResponse); |
| 760 card2: {testValue: 'TEST CARD VALUE 2'} | 1082 }); |
| 761 }), | 1083 |
| 762 fakeOnSuccessFunction, | 1084 TEST_F(TEST_NAME, 'ProcessServerResponseGoogleNowDisabled', function() { |
| 763 fakeOnCardShownFunction); | 1085 // Tests processServerResponse function for the case when the response |
| 764 | 1086 // indicates that Google Now is disabled. |
| 765 // Invoking the tested function. | 1087 |
| 766 combineAndShowNotificationCards( | 1088 // Setup and expectations. |
| 767 testGroups, fakeOnSuccessFunction, fakeOnCardShownFunction); | 1089 var serverResponse = { |
| 768 }); | 1090 googleNowDisabled: true, |
| 769 | 1091 groups: { |
| 770 TEST_F( | 1092 GROUP1: {nextPollTimeSeconds: 200} |
| 771 'GoogleNowBackgroundUnitTest', | 1093 } |
| 772 'ProcessServerResponse', | 1094 }; |
| 773 function() { | 1095 |
| 774 // Tests processServerResponse function. | 1096 this.makeAndRegisterMockGlobals([ |
| 775 | 1097 'onStateChange', |
| 776 // Setup and expectations. | 1098 'scheduleNextPoll', |
| 777 Date.now = function() { return 3000000; }; | 1099 ]); |
| 778 | 1100 |
| 779 // GROUP1 was requested and contains cards c4 and c5. For c5, there is a | 1101 this.makeAndRegisterMockApis([ |
| 780 // non-expired dismissal, so it will be ignored. | 1102 'chrome.storage.local.set', |
| 781 // GROUP2 was not requested, but is contained in server response to | 1103 'fillFromChromeLocalStorage' |
| 782 // indicate that the group still exists. Stored group GROUP2 won't change. | 1104 ]); |
| 783 // GROUP3 is stored, but is not present in server's response, which means | 1105 |
| 784 // it doesn't exist anymore. This group will be deleted. | 1106 this.mockApis.expects(once()). |
| 785 // GROUP4 doesn't contain cards, but it was requested. This is treated as | 1107 chrome_storage_local_set(eqJSON({googleNowEnabled: false})); |
| 786 // if it had an empty array of cards. Cards in the stored group will be | 1108 |
| 787 // replaced with an empty array. | 1109 this.mockGlobals.expects(once()).onStateChange(); |
| 788 // GROUP5 doesn't have next poll time, and it will be stored without next | 1110 |
| 789 // poll time. | 1111 this.mockApis.expects(never()).fillFromChromeLocalStorage(); |
| 790 var serverResponse = { | 1112 |
| 791 groups: { | 1113 this.mockGlobals.expects(never()).scheduleNextPoll(); |
| 792 GROUP1: {requested: true, nextPollSeconds: 46}, | 1114 |
| 793 GROUP2: {requested: false}, | 1115 var processedResponse = processServerResponse(serverResponse); |
| 794 GROUP4: {requested: true, nextPollSeconds: 45}, | 1116 }); |
| 795 GROUP5: {requested: true} | 1117 |
| 796 }, | |
| 797 notifications: [ | |
| 798 {notificationId: 'c4', groupName: 'GROUP1'}, | |
| 799 {notificationId: 'c5', groupName: 'GROUP1'} | |
| 800 ] | |
| 801 }; | |
| 802 | |
| 803 var recentDismissals = { | |
| 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 |