blob: 80ebfb0b746b52e384fcade16266f87a645f7d58 [file] [log] [blame]
// 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.
/** @fileoverview Runs the Polymer Passwords and Forms tests. */
/** @const {string} Path to root from chrome/test/data/webui/settings/. */
const ROOT_PATH = '../../../../../';
// Polymer BrowserTest fixture.
GEN_INCLUDE(
[ROOT_PATH + 'chrome/test/data/webui/polymer_browser_test_base.js']);
// Fake data generator.
GEN_INCLUDE(
[ROOT_PATH +
'chrome/test/data/webui/settings/passwords_and_autofill_fake_data.js']);
/**
* @constructor
* @extends {PolymerTest}
*/
function PasswordsAndFormsBrowserTest() {}
PasswordsAndFormsBrowserTest.prototype = {
__proto__: PolymerTest.prototype,
/** @override */
browsePreload: 'chrome://settings/passwords_and_forms_page/' +
'passwords_and_forms_page.html',
/** @override */
extraLibraries: PolymerTest.getLibraries(ROOT_PATH).concat([
'../fake_chrome_event.js',
'fake_settings_private.js',
'ensure_lazy_loaded.js',
]),
/** @override */
setUp: function() {
PolymerTest.prototype.setUp.call(this);
// Test is run on an individual element that won't have a page language.
this.accessibilityAuditConfig.auditRulesToIgnore.push('humanLangMissing');
settings.ensureLazyLoaded();
},
};
/** This test will validate that the section is loaded with data. */
TEST_F('PasswordsAndFormsBrowserTest', 'uiTests', function() {
let passwordManager;
let autofillManager;
let paymentsManager;
/**
* Creates a new passwords and forms element.
* @return {!Object}
*/
function createPasswordsAndFormsElement(prefsElement) {
const element = document.createElement('settings-passwords-and-forms-page');
element.prefs = prefsElement.prefs;
document.body.appendChild(element);
// TODO(dpapad): Update this once migration to Polymer 2 is done.
const domIfTag = Polymer.DomIf ? 'dom-if' : 'template';
element.$$(`${domIfTag}[route-path="/passwords"]`).if = true;
element.$$(`${domIfTag}[route-path="/autofill"]`).if = true;
element.$$(`${domIfTag}[route-path="/payments"]`).if = true;
Polymer.dom.flush();
return element;
}
/**
* @pram {boolean} autofill Whether autofill is enabled or not.
* @param {boolean} passwords Whether passwords are enabled or not.
* @return {!Promise<!Element>} The |prefs| element.
*/
function createPrefs(autofill, passwords) {
return new Promise(function(resolve) {
CrSettingsPrefs.deferInitialization = true;
const prefs = document.createElement('settings-prefs');
prefs.initialize(new settings.FakeSettingsPrivate([
{
key: 'autofill.enabled',
type: chrome.settingsPrivate.PrefType.BOOLEAN,
value: autofill,
},
{
key: 'autofill.profile_enabled',
type: chrome.settingsPrivate.PrefType.BOOLEAN,
value: true,
},
{
key: 'autofill.credit_card_enabled',
type: chrome.settingsPrivate.PrefType.BOOLEAN,
value: true,
},
{
key: 'credentials_enable_service',
type: chrome.settingsPrivate.PrefType.BOOLEAN,
value: passwords,
},
{
key: 'credentials_enable_autosignin',
type: chrome.settingsPrivate.PrefType.BOOLEAN,
value: true,
},
]));
CrSettingsPrefs.initialized.then(function() {
resolve(prefs);
});
});
}
/**
* Cleans up prefs so tests can continue to run.
* @param {!Element} prefs The prefs element.
*/
function destroyPrefs(prefs) {
CrSettingsPrefs.resetForTesting();
CrSettingsPrefs.deferInitialization = false;
prefs.resetForTesting();
}
/**
* Creates PasswordManagerExpectations with the values expected after first
* creating the element.
* @return {!PasswordManagerExpectations}
*/
function basePasswordExpectations() {
const expected = new PasswordManagerExpectations();
expected.requested.passwords = 1;
expected.requested.exceptions = 1;
expected.listening.passwords = 1;
expected.listening.exceptions = 1;
return expected;
}
/**
* Creates AutofillManagerExpectations with the values expected after first
* creating the element.
* @return {!AutofillManagerExpectations}
*/
function baseAutofillExpectations() {
const expected = new AutofillManagerExpectations();
expected.requestedAddresses = 1;
expected.listeningAddresses = 1;
return expected;
}
/**
* Creates PaymentsManagerExpectations with the values expected after first
* creating the element.
* @return {!PaymentsManagerExpectations}
*/
function basePaymentsExpectations() {
const expected = new PaymentsManagerExpectations();
expected.requestedCreditCards = 1;
expected.listeningCreditCards = 1;
return expected;
}
setup(function() {
PolymerTest.clearBody();
// Override the PasswordManagerImpl for testing.
passwordManager = new TestPasswordManager();
PasswordManagerImpl.instance_ = passwordManager;
// Override the AutofillManagerImpl for testing.
autofillManager = new TestAutofillManager();
AutofillManagerImpl.instance_ = autofillManager;
// Override the PaymentsManagerImpl for testing.
paymentsManager = new TestPaymentsManager();
PaymentsManagerImpl.instance_ = paymentsManager;
});
suite('PasswordsAndForms', function() {
test('baseLoadAndRemove', function() {
return createPrefs(true, true).then(function(prefs) {
const element = createPasswordsAndFormsElement(prefs);
const passwordsExpectations = basePasswordExpectations();
passwordManager.assertExpectations(passwordsExpectations);
const autofillExpectations = baseAutofillExpectations();
autofillManager.assertExpectations(autofillExpectations);
const paymentsExpectations = basePaymentsExpectations();
paymentsManager.assertExpectations(paymentsExpectations);
element.remove();
Polymer.dom.flush();
passwordsExpectations.listening.passwords = 0;
passwordsExpectations.listening.exceptions = 0;
passwordManager.assertExpectations(passwordsExpectations);
autofillExpectations.listeningAddresses = 0;
autofillManager.assertExpectations(autofillExpectations);
paymentsExpectations.listeningCreditCards = 0;
paymentsManager.assertExpectations(paymentsExpectations);
destroyPrefs(prefs);
});
});
test('loadPasswordsAsync', function() {
return createPrefs(true, true).then(function(prefs) {
const element = createPasswordsAndFormsElement(prefs);
const list =
[FakeDataMaker.passwordEntry(), FakeDataMaker.passwordEntry()];
passwordManager.lastCallback.addSavedPasswordListChangedListener(list);
Polymer.dom.flush();
assertDeepEquals(
list,
element.$$('#passwordSection')
.savedPasswords.map(entry => entry.entry));
// The callback is coming from the manager, so the element shouldn't
// have additional calls to the manager after the base expectations.
passwordManager.assertExpectations(basePasswordExpectations());
autofillManager.assertExpectations(baseAutofillExpectations());
paymentsManager.assertExpectations(basePaymentsExpectations());
destroyPrefs(prefs);
});
});
test('loadExceptionsAsync', function() {
return createPrefs(true, true).then(function(prefs) {
const element = createPasswordsAndFormsElement(prefs);
const list =
[FakeDataMaker.exceptionEntry(), FakeDataMaker.exceptionEntry()];
passwordManager.lastCallback.addExceptionListChangedListener(list);
Polymer.dom.flush();
assertEquals(list, element.$$('#passwordSection').passwordExceptions);
// The callback is coming from the manager, so the element shouldn't
// have additional calls to the manager after the base expectations.
passwordManager.assertExpectations(basePasswordExpectations());
autofillManager.assertExpectations(baseAutofillExpectations());
paymentsManager.assertExpectations(basePaymentsExpectations());
destroyPrefs(prefs);
});
});
test('loadAddressesAsync', function() {
return createPrefs(true, true).then(function(prefs) {
const element = createPasswordsAndFormsElement(prefs);
const list =
[FakeDataMaker.addressEntry(), FakeDataMaker.addressEntry()];
autofillManager.lastCallback.addAddressListChangedListener(list);
Polymer.dom.flush();
assertEquals(list, element.$$('#autofillSection').addresses);
// The callback is coming from the manager, so the element shouldn't
// have additional calls to the manager after the base expectations.
passwordManager.assertExpectations(basePasswordExpectations());
autofillManager.assertExpectations(baseAutofillExpectations());
paymentsManager.assertExpectations(basePaymentsExpectations());
destroyPrefs(prefs);
});
});
test('loadCreditCardsAsync', function() {
return createPrefs(true, true).then(function(prefs) {
const element = createPasswordsAndFormsElement(prefs);
const list =
[FakeDataMaker.creditCardEntry(), FakeDataMaker.creditCardEntry()];
paymentsManager.lastCallback.addCreditCardListChangedListener(list);
Polymer.dom.flush();
assertEquals(list, element.$$('#paymentSection').creditCards);
// The callback is coming from the manager, so the element shouldn't
// have additional calls to the manager after the base expectations.
passwordManager.assertExpectations(basePasswordExpectations());
autofillManager.assertExpectations(baseAutofillExpectations());
paymentsManager.assertExpectations(basePaymentsExpectations());
destroyPrefs(prefs);
});
});
});
mocha.run();
});