Index: chrome/browser/resources/google_now/background_unittest.gtestjs |
diff --git a/chrome/browser/resources/google_now/background_unittest.gtestjs b/chrome/browser/resources/google_now/background_unittest.gtestjs |
index 149c51ca41a0cffb74a206df15e8aa9e1aa4161d..af88014ee99ceab8343ee26d3eeaa941232bebd3 100644 |
--- a/chrome/browser/resources/google_now/background_unittest.gtestjs |
+++ b/chrome/browser/resources/google_now/background_unittest.gtestjs |
@@ -40,3 +40,339 @@ TEST_F('GoogleNowBackgroundUnitTest', 'AreTasksConflicting', function() { |
testTaskPair(RETRY_DISMISS_TASK_NAME, RETRY_DISMISS_TASK_NAME, true); |
}); |
+/** |
+ * Mocks global functions and APIs that initialize() depends upon. |
+ * @param {Test} fixture Test fixture. |
+ */ |
+function mockInitializeDependencies(fixture) { |
+ fixture.makeAndRegisterMockGlobals([ |
+ 'recordEvent', |
+ 'showWelcomeToast', |
+ 'startPollingCards']); |
+ fixture.makeAndRegisterMockApis( |
+ ['storage.get', 'chrome.identity.getAuthToken']); |
+} |
+ |
+TEST_F( |
+ 'GoogleNowBackgroundUnitTest', |
+ 'Initialize_ToastStateEmpty1', |
+ function() { |
+ // Tests the case when toast state is empty and NOTIFICATION_CARDS_URL is |
+ // not set. In this case, the function should quietly exit after finding |
+ // out that NOTIFICATION_CARDS_URL is empty. |
+ |
+ // Setup and expectations. |
+ var testToastState = {}; |
+ NOTIFICATION_CARDS_URL = undefined; |
+ |
+ mockInitializeDependencies(this); |
+ |
+ this.mockGlobals.expects(once()).recordEvent( |
+ DiagnosticEvent.EXTENSION_START); |
+ var storageGetSavedArgs = new SaveMockArguments(); |
+ this.mockApis.expects(once()). |
+ storage_get( |
+ storageGetSavedArgs.match(eq('toastState')), |
+ storageGetSavedArgs.match(ANYTHING)). |
+ will(invokeCallback(storageGetSavedArgs, 1, testToastState)); |
+ |
+ // Invoking the tested function. |
+ initialize(); |
+ }); |
+ |
+TEST_F( |
+ 'GoogleNowBackgroundUnitTest', |
+ 'Initialize_ToastStateEmpty2', |
+ function() { |
+ // Tests the case when toast state is empty and NOTIFICATION_CARDS_URL is |
+ // set, but getAuthToken fails most likely because the user is not signed |
+ // in. In this case, the function should quietly exit after finding out |
+ // that getAuthToken fails. |
+ |
+ // Setup and expectations. |
+ var testToastState = {}; |
+ NOTIFICATION_CARDS_URL = 'https://some.server.url.com'; |
+ var testIdentityToken = undefined; |
+ |
+ mockInitializeDependencies(this); |
+ |
+ this.mockGlobals.expects(once()).recordEvent( |
+ DiagnosticEvent.EXTENSION_START); |
+ var storageGetSavedArgs = new SaveMockArguments(); |
+ this.mockApis.expects(once()). |
+ storage_get( |
+ storageGetSavedArgs.match(eq('toastState')), |
+ storageGetSavedArgs.match(ANYTHING)). |
+ will(invokeCallback(storageGetSavedArgs, 1, testToastState)); |
+ var chromeIdentityGetAuthTokenSavedArgs = new SaveMockArguments(); |
+ this.mockApis.expects(once()). |
+ chrome_identity_getAuthToken( |
+ chromeIdentityGetAuthTokenSavedArgs.match( |
+ eqJSON({interactive: false})), |
+ chromeIdentityGetAuthTokenSavedArgs.match(ANYTHING)). |
+ will(invokeCallback( |
+ chromeIdentityGetAuthTokenSavedArgs, 1, testIdentityToken)); |
+ |
+ // Invoking the tested function. |
+ initialize(); |
+ }); |
+ |
+TEST_F( |
+ 'GoogleNowBackgroundUnitTest', |
+ 'Initialize_ToastStateEmpty3', |
+ function() { |
+ // Tests the case when toast state is empty and NOTIFICATION_CARDS_URL is |
+ // set, and getAuthToken succeeds. In this case, the function should |
+ // invoke showWelcomeToast(). |
+ |
+ // Setup and expectations. |
+ var testToastState = {}; |
+ NOTIFICATION_CARDS_URL = 'https://some.server.url.com'; |
+ var testIdentityToken = 'some identity token'; |
+ |
+ mockInitializeDependencies(this); |
+ |
+ this.mockGlobals.expects(once()).recordEvent( |
+ DiagnosticEvent.EXTENSION_START); |
+ var storageGetSavedArgs = new SaveMockArguments(); |
+ this.mockApis.expects(once()). |
+ storage_get( |
+ storageGetSavedArgs.match(eq('toastState')), |
+ storageGetSavedArgs.match(ANYTHING)). |
+ will(invokeCallback(storageGetSavedArgs, 1, testToastState)); |
+ var chromeIdentityGetAuthTokenSavedArgs = new SaveMockArguments(); |
+ this.mockApis.expects(once()). |
+ chrome_identity_getAuthToken( |
+ chromeIdentityGetAuthTokenSavedArgs.match( |
+ eqJSON({interactive: false})), |
+ chromeIdentityGetAuthTokenSavedArgs.match(ANYTHING)). |
+ will(invokeCallback( |
+ chromeIdentityGetAuthTokenSavedArgs, 1, testIdentityToken)); |
+ this.mockGlobals.expects(once()).showWelcomeToast(); |
+ |
+ // Invoking the tested function. |
+ initialize(); |
+ }); |
+ |
+TEST_F('GoogleNowBackgroundUnitTest', 'Initialize_ToastStateYes', function() { |
+ // Tests the case when the user has answered "yes" to the toast in the past. |
+ // In this case, the function should invoke startPollingCards(). |
+ |
+ // Setup and expectations. |
+ var testToastState = {toastState: ToastOptionResponse.CHOSE_YES}; |
+ |
+ mockInitializeDependencies(this); |
+ |
+ this.mockGlobals.expects(once()).recordEvent(DiagnosticEvent.EXTENSION_START); |
+ var storageGetSavedArgs = new SaveMockArguments(); |
+ this.mockApis.expects(once()). |
+ storage_get( |
+ storageGetSavedArgs.match(eq('toastState')), |
+ storageGetSavedArgs.match(ANYTHING)). |
+ will(invokeCallback(storageGetSavedArgs, 1, testToastState)); |
+ this.mockGlobals.expects(once()).startPollingCards(); |
+ |
+ // Invoking the tested function. |
+ initialize(); |
+}); |
+ |
+TEST_F('GoogleNowBackgroundUnitTest', 'Initialize_ToastStateNo', function() { |
+ // Tests the case when the user has answered "no" to the toast in the past. |
+ // In this case, the function should do nothing. |
+ |
+ // Setup and expectations. |
+ var testToastState = {toastState: ToastOptionResponse.CHOSE_NO}; |
+ |
+ mockInitializeDependencies(this); |
+ |
+ this.mockGlobals.expects(once()).recordEvent(DiagnosticEvent.EXTENSION_START); |
+ var storageGetSavedArgs = new SaveMockArguments(); |
+ this.mockApis.expects(once()). |
+ storage_get( |
+ storageGetSavedArgs.match(eq('toastState')), |
+ storageGetSavedArgs.match(ANYTHING)). |
+ will(invokeCallback(storageGetSavedArgs, 1, testToastState)); |
+ |
+ // Invoking the tested function. |
+ initialize(); |
+}); |
+ |
+/** |
+ * Mocks global functions and APIs that onNotificationClicked() depends upon. |
+ * @param {Test} fixture Test fixture. |
+ */ |
+function mockOnNotificationClickedDependencies(fixture) { |
+ fixture.makeAndRegisterMockApis([ |
+ 'storage.get', |
+ 'chrome.tabs.create', |
+ 'chrome.windows.create']); |
+} |
+ |
+TEST_F( |
+ 'GoogleNowBackgroundUnitTest', |
+ 'OnNotificationClicked_NoData', |
+ function() { |
+ // Tests the case when there is no data associated with notification id. |
+ // In this case, the function should do nothing. |
+ |
+ // Setup and expectations. |
+ var testNotificationId = 'TEST_ID'; |
+ var testNotificationData = {}; |
+ |
+ mockOnNotificationClickedDependencies(this); |
+ this.makeMockLocalFunctions(['selector']); |
+ |
+ var storageGetSavedArgs = new SaveMockArguments(); |
+ this.mockApis.expects(once()). |
+ storage_get( |
+ storageGetSavedArgs.match(eq('notificationsData')), |
+ storageGetSavedArgs.match(ANYTHING)). |
+ will(invokeCallback(storageGetSavedArgs, 1, testNotificationData)); |
+ |
+ // Invoking the tested function. |
+ onNotificationClicked( |
+ testNotificationId, this.mockLocalFunctions.functions().selector); |
+ }); |
+ |
+TEST_F( |
+ 'GoogleNowBackgroundUnitTest', |
+ 'OnNotificationClicked_ActionUrlsNotObject', |
+ function() { |
+ // Tests the case when the data associated with notification id is not an |
+ // object, probably because of a malformed server response. |
+ // In this case, the function should do nothing. |
+ |
+ // Setup and expectations. |
+ var testActionUrls = 'string, not object'; |
+ var testNotificationId = 'TEST_ID'; |
+ var testNotificationData = { |
+ notificationsData: {'TEST_ID': {actionUrls: testActionUrls}} |
+ }; |
+ |
+ mockOnNotificationClickedDependencies(this); |
+ this.makeMockLocalFunctions(['selector']); |
+ |
+ var storageGetSavedArgs = new SaveMockArguments(); |
+ this.mockApis.expects(once()). |
+ storage_get( |
+ storageGetSavedArgs.match(eq('notificationsData')), |
+ storageGetSavedArgs.match(ANYTHING)). |
+ will(invokeCallback(storageGetSavedArgs, 1, testNotificationData)); |
+ |
+ // Invoking the tested function. |
+ onNotificationClicked( |
+ testNotificationId, this.mockLocalFunctions.functions().selector); |
+ }); |
+ |
+TEST_F( |
+ 'GoogleNowBackgroundUnitTest', |
+ 'OnNotificationClicked_UrlNotString', |
+ function() { |
+ // Tests the case when selector returns a non-string, probably because of |
+ // a malformed server response. |
+ // In this case, the function should do nothing. |
+ |
+ // Setup and expectations. |
+ var testActionUrls = {testField: 'TEST VALUE'}; |
+ var testNotificationId = 'TEST_ID'; |
+ var testNotificationData = { |
+ notificationsData: {'TEST_ID': {actionUrls: testActionUrls}} |
+ }; |
+ var testActionUrl = {}; |
+ |
+ mockOnNotificationClickedDependencies(this); |
+ this.makeMockLocalFunctions(['selector']); |
+ |
+ var storageGetSavedArgs = new SaveMockArguments(); |
+ this.mockApis.expects(once()). |
+ storage_get( |
+ storageGetSavedArgs.match(eq('notificationsData')), |
+ storageGetSavedArgs.match(ANYTHING)). |
+ will(invokeCallback(storageGetSavedArgs, 1, testNotificationData)); |
+ this.mockLocalFunctions.expects(once()).selector(testActionUrls).will( |
+ returnValue(testActionUrl)); |
+ |
+ // Invoking the tested function. |
+ onNotificationClicked( |
+ testNotificationId, this.mockLocalFunctions.functions().selector); |
+ }); |
+ |
+TEST_F( |
+ 'GoogleNowBackgroundUnitTest', |
+ 'OnNotificationClicked_TabCreateSuccess', |
+ function() { |
+ // Tests the selected URL is OK and crome.tabs.create suceeds. |
+ |
+ // Setup and expectations. |
+ var testActionUrls = {testField: 'TEST VALUE'}; |
+ var testNotificationId = 'TEST_ID'; |
+ var testNotificationData = { |
+ notificationsData: {'TEST_ID': {actionUrls: testActionUrls}} |
+ }; |
+ var testActionUrl = 'http://testurl.com'; |
+ var testCreatedTab = {}; |
+ |
+ mockOnNotificationClickedDependencies(this); |
+ this.makeMockLocalFunctions(['selector']); |
+ |
+ var storageGetSavedArgs = new SaveMockArguments(); |
+ this.mockApis.expects(once()). |
+ storage_get( |
+ storageGetSavedArgs.match(eq('notificationsData')), |
+ storageGetSavedArgs.match(ANYTHING)). |
+ will(invokeCallback(storageGetSavedArgs, 1, testNotificationData)); |
+ this.mockLocalFunctions.expects(once()).selector(testActionUrls).will( |
+ returnValue(testActionUrl)); |
+ var chromeTabsCreateSavedArgs = new SaveMockArguments(); |
+ this.mockApis.expects(once()). |
+ chrome_tabs_create( |
+ chromeTabsCreateSavedArgs.match(eqJSON({url: testActionUrl})), |
+ chromeTabsCreateSavedArgs.match(ANYTHING)). |
+ will(invokeCallback(chromeTabsCreateSavedArgs, 1, testCreatedTab)); |
+ |
+ // Invoking the tested function. |
+ onNotificationClicked( |
+ testNotificationId, this.mockLocalFunctions.functions().selector); |
+ }); |
+ |
+TEST_F( |
+ 'GoogleNowBackgroundUnitTest', |
+ 'OnNotificationClicked_TabCreateFail', |
+ function() { |
+ // Tests the selected URL is OK and crome.tabs.create fails. |
+ // In this case, the function should invoke chrome.windows.create as a |
+ // second attempt. |
+ |
+ // Setup and expectations. |
+ var testActionUrls = {testField: 'TEST VALUE'}; |
+ var testNotificationId = 'TEST_ID'; |
+ var testNotificationData = { |
+ notificationsData: {'TEST_ID': {actionUrls: testActionUrls}} |
+ }; |
+ var testActionUrl = 'http://testurl.com'; |
+ var testCreatedTab = undefined; // chrome.tabs.create fails |
+ |
+ mockOnNotificationClickedDependencies(this); |
+ this.makeMockLocalFunctions(['selector']); |
+ |
+ var storageGetSavedArgs = new SaveMockArguments(); |
+ this.mockApis.expects(once()). |
+ storage_get( |
+ storageGetSavedArgs.match(eq('notificationsData')), |
+ storageGetSavedArgs.match(ANYTHING)). |
+ will(invokeCallback(storageGetSavedArgs, 1, testNotificationData)); |
+ this.mockLocalFunctions.expects(once()).selector(testActionUrls).will( |
+ returnValue(testActionUrl)); |
+ var chromeTabsCreateSavedArgs = new SaveMockArguments(); |
+ this.mockApis.expects(once()). |
+ chrome_tabs_create( |
+ chromeTabsCreateSavedArgs.match(eqJSON({url: testActionUrl})), |
+ chromeTabsCreateSavedArgs.match(ANYTHING)). |
+ will(invokeCallback(chromeTabsCreateSavedArgs, 1, testCreatedTab)); |
+ this.mockApis.expects(once()).chrome_windows_create( |
+ eqJSON({url: testActionUrl})); |
+ |
+ // Invoking the tested function. |
+ onNotificationClicked( |
+ testNotificationId, this.mockLocalFunctions.functions().selector); |
+ }); |