Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1696)

Unified Diff: chrome/test/data/webui/settings/search_engines_page_test.js

Issue 1666623006: MD Settings: Manage search engines 3/3, hooking up UI. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@manage_search_engines_handler
Patch Set: Resolving conflicts with ToT Created 4 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « chrome/test/data/webui/settings/cr_settings_browsertest.js ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: chrome/test/data/webui/settings/search_engines_page_test.js
diff --git a/chrome/test/data/webui/settings/search_engines_page_test.js b/chrome/test/data/webui/settings/search_engines_page_test.js
new file mode 100644
index 0000000000000000000000000000000000000000..48042bcc9f2533358883fb60e6a4ba73f63454d4
--- /dev/null
+++ b/chrome/test/data/webui/settings/search_engines_page_test.js
@@ -0,0 +1,361 @@
+// Copyright 2016 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+cr.define('settings_search_engines_page', function() {
+ /**
+ * TODO(dpapad): Similar class exists in webui_resource_async_browsertest.js.
+ * Move somewhere else and re-use.
+ * @constructor
+ */
+ var PromiseResolver = function() {
+ this.promise = new Promise(function(resolve, reject) {
+ this.resolve = resolve;
+ this.reject = reject;
+ }.bind(this));
+ };
+
+ /**
+ * A test version of SearchEnginesBrowserProxy. Provides helper methods
+ * for allowing tests to know when a method was called, as well as
+ * specifying mock responses.
+ *
+ * @constructor
+ * @implements {settings.SearchEnginesBrowserProxy}
+ */
+ var TestSearchEnginesBrowserProxy = function() {
+ /** @private {!Map<string, !PromiseResolver>} */
+ this.resolverMap_ = new Map();
+ var wrapperMethods = [
+ 'getSearchEnginesList',
+ 'removeSearchEngine',
+ 'searchEngineEditCancelled',
+ 'searchEngineEditCompleted',
+ 'searchEngineEditStarted',
+ 'setDefaultSearchEngine',
+ 'validateSearchEngineInput',
+ ];
+ wrapperMethods.forEach(this.resetResolver, this);
+
+ /** @private {!SearchEnginesInfo} */
+ this.searchEnginesInfo_ = {defaults: [], others: [], extensions: []};
+ };
+
+ TestSearchEnginesBrowserProxy.prototype = {
+ /**
+ * @param {string} methodName
+ * @return {!Promise} A promise that is resolved when the given method
+ * is called.
+ */
+ whenCalled: function(methodName) {
+ return this.resolverMap_.get(methodName).promise;
+ },
+
+ /**
+ * Resets the PromiseResolver associated with the given method.
+ * @param {string} methodName
+ */
+ resetResolver: function(methodName) {
+ this.resolverMap_.set(methodName, new PromiseResolver());
+ },
+
+ /** @override */
+ setDefaultSearchEngine: function(modelIndex) {
+ this.resolverMap_.get('setDefaultSearchEngine').resolve(modelIndex);
+ },
+
+ /** @override */
+ removeSearchEngine: function(modelIndex) {
+ this.resolverMap_.get('removeSearchEngine').resolve(modelIndex);
+ },
+
+ /** @override */
+ searchEngineEditStarted: function(modelIndex) {
+ this.resolverMap_.get('searchEngineEditStarted').resolve(modelIndex);
+ },
+
+ /** @override */
+ searchEngineEditCancelled: function() {
+ this.resolverMap_.get('searchEngineEditCancelled').resolve();
+ },
+
+ /** @override */
+ searchEngineEditCompleted: function(searchEngine, keyword, queryUrl) {
+ this.resolverMap_.get('searchEngineEditCompleted').resolve();
+ },
+
+ /**
+ * Sets the response to be returned by |getSearchEnginesList|.
+ * @param {!SearchEnginesInfo}
+ */
+ setSearchEnginesInfo: function(searchEnginesInfo) {
+ this.searchEnginesInfo_ = searchEnginesInfo;
+ },
+
+ /** @override */
+ getSearchEnginesList: function() {
+ this.resolverMap_.get('getSearchEnginesList').resolve();
+ return Promise.resolve(this.searchEnginesInfo_);
+ },
+
+ /** @override */
+ validateSearchEngineInput: function(fieldName, fieldValue) {
+ this.resolverMap_.get('validateSearchEngineInput').resolve();
+ return Promise.resolve(true);
+ },
+ };
+
+ /** @return {!SearchEngine} */
+ var createSampleSearchEngine = function() {
+ return {
+ canBeDefault: false,
+ canBeEdited: true,
+ canBeRemoved: false,
+ default: false,
+ displayName: "Google",
+ iconURL: "http://www.google.com/favicon.ico",
+ isOmniboxExtension: false,
+ keyword: "google.com",
+ modelIndex: 0,
+ name: "Google",
+ url: "https://search.foo.com/search?p=%s",
+ urlLocked: false,
+ };
+ };
+
+ function registerDialogTests() {
+ suite('AddSearchEngineDialogTests', function() {
+ /** @type {?SettingsAddSearchEngineDialog} */
+ var dialog = null;
+ var browserProxy = null;
+
+ setup(function() {
+ browserProxy = new TestSearchEnginesBrowserProxy();
+ settings.SearchEnginesBrowserProxyImpl.instance_ = browserProxy;
+ PolymerTest.clearBody();
+ dialog = document.createElement('settings-search-engine-dialog');
+ document.body.appendChild(dialog);
+ });
+
+ teardown(function() { dialog.remove(); });
+
+ // Tests that the dialog calls 'searchEngineEditStarted' and
+ // 'searchEngineEditCancelled' when closed from the 'x' button.
+ test('DialogOpenAndClose', function() {
+ return browserProxy.whenCalled('searchEngineEditStarted').then(
+ function() {
+ MockInteractions.tap(dialog.$.close);
+ return browserProxy.whenCalled('searchEngineEditCancelled');
+ });
+ });
+
+ // Tests that the dialog calls 'searchEngineEditStarted' and
+ // 'searchEngineEditCancelled' when closed from the 'cancel' button.
+ test('DialogOpenAndCancel', function() {
+ return browserProxy.whenCalled('searchEngineEditStarted').then(
+ function() {
+ MockInteractions.tap(dialog.$.cancel);
+ return browserProxy.whenCalled('searchEngineEditCancelled');
+ });
+ });
+
+ // Tests the dialog to add a new search engine. Specifically
+ // - paper-input elements are empty initially.
+ // - action button initially disabled.
+ // - validation is triggered on 'focus'. 'change' is not teted because
+ // MockInteractions does not currently provide a way to trigger such
+ // events.
+ // - action button is enabled when all fields are valid.
+ // - action button triggers appropriate browser signal when tapped.
+ test('DialogAddSearchEngine', function() {
+ /**
+ * Focuses the given paper-input element and checks that validation is
+ * triggered.
+ * @param {string} inputId
+ * @return {!Promise}
+ */
+ var focusAndValidate = function(inputId) {
+ browserProxy.resetResolver('validateSearchEngineInput');
+ MockInteractions.focus(dialog.$[inputId]);
+ return browserProxy.whenCalled('validateSearchEngineInput');
+ };
+
+ assertEquals('', dialog.$.searchEngine.value);
+ assertEquals('', dialog.$.keyword.value);
+ assertEquals('', dialog.$.queryUrl.value);
+ var actionButton = dialog.$.actionButton;
+ assertTrue(actionButton.disabled);
+
+ return focusAndValidate('searchEngine').then(function() {
+ return focusAndValidate('keyword');
+ }).then(function() {
+ return focusAndValidate('queryUrl');
+ }).then(function() {
+ // Manually set the text to a non-empty string for all fields.
+ dialog.$.searchEngine.value = 'foo';
+ dialog.$.keyword.value = 'bar';
+ dialog.$.queryUrl.value = 'baz';
+
+ // MockInteractions does not provide a way to trigger a 'change' event
+ // yet. Triggering the 'focus' event instead, to update the state of
+ // the action button.
+ return focusAndValidate('searchEngine');
+ }).then(function() {
+ // Assert that the action button has been enabled now that all input
+ // is valid and non-empty.
+ assertFalse(actionButton.disabled);
+ MockInteractions.tap(actionButton);
+ return browserProxy.whenCalled('searchEngineEditCompleted');
+ });
+ });
+
+ });
+ }
+
+ function registerEntryTests() {
+ suite('SearchEngineEntryTests', function() {
+ /** @type {?SettingsSearchEngineEntryElement} */
+ var entry = null;
+
+ var browserProxy = null;
+
+ setup(function() {
+ browserProxy = new TestSearchEnginesBrowserProxy();
+ settings.SearchEnginesBrowserProxyImpl.instance_ = browserProxy;
+ PolymerTest.clearBody();
+ entry = document.createElement('settings-search-engine-entry');
+ entry.set('engine', createSampleSearchEngine());
+ document.body.appendChild(entry);
+ });
+
+ teardown(function() { entry.remove(); });
+
+ test('RemoveSearchEngine', function() {
+ var deleteButton = entry.$.delete;
+ assertTrue(!!deleteButton);
+ MockInteractions.tap(deleteButton);
+ return browserProxy.whenCalled('removeSearchEngine').then(
+ function(modelIndex) {
+ assertEquals(entry.engine.modelIndex, modelIndex);
+ });
+ });
+
+ test('MakeDefault', function() {
+ var makeDefaultButton = entry.$.makeDefault;
+ assertTrue(!!makeDefaultButton);
+ MockInteractions.tap(makeDefaultButton);
+ return browserProxy.whenCalled('setDefaultSearchEngine').then(
+ function(modelIndex) {
+ assertEquals(entry.engine.modelIndex, modelIndex);
+ });
+ });
+
+ // Test that the "make default" and "remove" buttons are hidden for
+ // the default search engine.
+ test('DefaultSearchEngineHiddenButtons', function() {
+ assertFalse(entry.$.makeDefault.hidden);
+ assertFalse(entry.$.edit.hidden);
+ assertFalse(entry.$.delete.hidden);
+
+ // Mark the engine as the "default" one.
+ var engine = createSampleSearchEngine();
+ engine.default = true;
+ entry.set('engine', engine);
+ Polymer.dom.flush();
+
+ assertTrue(entry.$.makeDefault.hidden);
+ assertFalse(entry.$.edit.hidden);
+ assertTrue(entry.$.delete.hidden);
+ });
+
+ // Test that clicking the "edit" button brings up a dialog.
+ test('Edit', function() {
+ var engine = entry.engine;
+ var editButton = entry.$.edit;
+ assertTrue(!!editButton);
+ MockInteractions.tap(editButton);
+ return browserProxy.whenCalled('searchEngineEditStarted').then(
+ function(modelIndex) {
+ assertEquals(engine.modelIndex, modelIndex);
+ var dialog = entry.$$('settings-search-engine-dialog');
+ assertTrue(!!dialog);
+
+ // Check that the paper-input fields are pre-populated.
+ assertEquals(engine.displayName, dialog.$.searchEngine.value);
+ assertEquals(engine.keyword, dialog.$.keyword.value);
+ assertEquals(engine.url, dialog.$.queryUrl.value);
+
+ assertFalse(dialog.$.actionButton.disabled);
+ });
+ });
+ });
+ }
+
+ function registerPageTests() {
+ suite('SearchEnginePageTests', function() {
+ /** @type {?SettingsSearchEnginesPageElement} */
+ var page = null;
+
+ var browserProxy = null;
+
+ /** @type {!SearchEnginesInfo} */
+ var searchEnginesInfo = {
+ defaults: [createSampleSearchEngine()],
+ others: [],
+ extensions: [],
+ };
+
+ setup(function() {
+ browserProxy = new TestSearchEnginesBrowserProxy();
+ browserProxy.setSearchEnginesInfo(searchEnginesInfo);
+ settings.SearchEnginesBrowserProxyImpl.instance_ = browserProxy;
+ PolymerTest.clearBody();
+ page = document.createElement('settings-search-engines-page');
+ document.body.appendChild(page);
+ });
+
+ teardown(function() { page.remove(); });
+
+ // Tests that the page is querying and displaying search engine info on
+ // startup.
+ test('Initialization', function() {
+ return browserProxy.whenCalled('getSearchEnginesList').then(function() {
+ var searchEnginesLists = Polymer.dom(page.shadowRoot).
+ querySelectorAll('settings-search-engines-list');
+ assertEquals(2, searchEnginesLists.length);
+
+ Polymer.dom.flush();
+ var defaultsList = searchEnginesLists[0];
+ var defaultsEntries = Polymer.dom(defaultsList.shadowRoot).
+ querySelectorAll('settings-search-engine-entry');
+ assertEquals(
+ searchEnginesInfo.defaults.length, defaultsEntries.length);
+
+ var othersList = searchEnginesLists[1];
+ var othersEntries = Polymer.dom(othersList.shadowRoot).
+ querySelectorAll('settings-search-engine-entry');
+ assertEquals(
+ searchEnginesInfo.others.length, othersEntries.length);
+ });
+ });
+
+ // Tests that the add search engine dialog opens when the corresponding
+ // button is tapped.
+ test('AddSearchEngineDialog', function() {
+ assertFalse(!!page.$$('settings-search-engine-dialog'));
+ var addSearchEngineButton = page.$.addSearchEngine;
+ assertTrue(!!addSearchEngineButton);
+
+ MockInteractions.tap(addSearchEngineButton);
+ Polymer.dom.flush();
+ assertTrue(!!page.$$('settings-search-engine-dialog'));
+ });
+ });
+ }
+
+ return {
+ registerDialogTests: registerDialogTests,
+ registerEntryTests: registerEntryTests,
+ registerPageTests: registerPageTests,
+ };
+});
« no previous file with comments | « chrome/test/data/webui/settings/cr_settings_browsertest.js ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698