Bug 1303510 - Part 3: Add mochitest-plain for saving submitted form. r=MattN

MozReview-Commit-ID: XJZWEBkCrx

--HG--
extra : rebase_source : 463a8101f803cfdc4305d1b1c9d79d3e25c2f279
This commit is contained in:
steveck-chung 2017-05-10 17:56:17 +08:00
parent 4a78b88263
commit f89677c9be
4 changed files with 136 additions and 3 deletions

View File

@ -20,6 +20,26 @@ function setInput(selector, value) {
return new Promise(resolve => setTimeout(resolve));
}
function clickOnElement(selector) {
let element = document.querySelector(selector);
if (!element) {
throw new Error("Can not find the element");
}
element.click();
}
async function onAddressChanged(type) {
return new Promise(resolve => {
formFillChromeScript.addMessageListener("formautofill-storage-changed", function onChanged(data) {
formFillChromeScript.removeMessageListener("formautofill-storage-changed", onChanged);
is(data.data, type, `Receive ${type} storage changed event`);
resolve();
});
});
}
function checkMenuEntries(expectedValues) {
let actualValues = getMenuEntries();
@ -29,7 +49,7 @@ function checkMenuEntries(expectedValues) {
}
}
function addAddress(address) {
async function addAddress(address) {
return new Promise(resolve => {
formFillChromeScript.sendAsyncMessage("FormAutofillTest:AddAddress", {address});
formFillChromeScript.addMessageListener("FormAutofillTest:AddressAdded", function onAdded(data) {
@ -40,7 +60,7 @@ function addAddress(address) {
});
}
function removeAddress(guid) {
async function removeAddress(guid) {
return new Promise(resolve => {
formFillChromeScript.sendAsyncMessage("FormAutofillTest:RemoveAddress", {guid});
formFillChromeScript.addMessageListener("FormAutofillTest:AddressRemoved", function onDeleted(data) {
@ -51,7 +71,7 @@ function removeAddress(guid) {
});
}
function updateAddress(guid, address) {
async function updateAddress(guid, address) {
return new Promise(resolve => {
formFillChromeScript.sendAsyncMessage("FormAutofillTest:UpdateAddress", {address, guid});
formFillChromeScript.addMessageListener("FormAutofillTest:AddressUpdated", function onUpdated(data) {
@ -62,6 +82,17 @@ function updateAddress(guid, address) {
});
}
async function checkAddresses(expectedAddresses) {
return new Promise(resolve => {
formFillChromeScript.sendAsyncMessage("FormAutofillTest:CheckAddresses", {expectedAddresses});
formFillChromeScript.addMessageListener("FormAutofillTest:areAddressesMatching", function onChecked(data) {
formFillChromeScript.removeMessageListener("FormAutofillTest:areAddressesMatching", onChecked);
resolve(data);
});
});
}
function formAutoFillCommonSetup() {
let chromeURL = SimpleTest.getTestFileURL("formautofill_parent_utils.js");
formFillChromeScript = SpecialPowers.loadChromeScript(chromeURL);

View File

@ -7,6 +7,7 @@
const {classes: Cc, interfaces: Ci, utils: Cu} = Components;
Cu.import("resource://gre/modules/Services.jsm");
let {profileStorage} = Cu.import("resource://formautofill/ProfileStorage.jsm", {});
var ParentUtils = {
cleanUpAddress() {
@ -42,6 +43,41 @@ var ParentUtils = {
Services.obs.removeObserver(this, "formautofill-storage-changed");
this.cleanUpAddress();
},
areAddressesMatching(addressA, addressB) {
for (let field of profileStorage.addresses.VALID_FIELDS) {
if (addressA[field] !== addressB[field]) {
return false;
}
}
return true;
},
checkAddresses({expectedAddresses}) {
Services.cpmm.addMessageListener("FormAutofill:Addresses", function getResult(result) {
Services.cpmm.removeMessageListener("FormAutofill:Addresses", getResult);
let addresses = result.data;
if (addresses.length !== expectedAddresses.length) {
sendAsyncMessage("FormAutofillTest:areAddressesMatching", false);
return;
}
for (let address of addresses) {
let matching = expectedAddresses.some((expectedAddress) => {
return ParentUtils.areAddressesMatching(address, expectedAddress);
});
if (!matching) {
sendAsyncMessage("FormAutofillTest:areAddressesMatching", false);
return;
}
}
sendAsyncMessage("FormAutofillTest:areAddressesMatching", true);
});
Services.cpmm.sendAsyncMessage("FormAutofill:GetAddresses", {searchString: ""});
},
};
Services.obs.addObserver(ParentUtils, "formautofill-storage-changed");
@ -58,6 +94,10 @@ addMessageListener("FormAutofillTest:UpdateAddress", (msg) => {
ParentUtils.updateAddress("update", "FormAutofill:SaveAddress", msg, "FormAutofillTest:AddressUpdated");
});
addMessageListener("FormAutofillTest:CheckAddresses", (msg) => {
ParentUtils.checkAddresses(msg);
});
addMessageListener("cleanup", () => {
ParentUtils.cleanup();
});

View File

@ -5,5 +5,6 @@ support-files =
formautofill_common.js
formautofill_parent_utils.js
[test_address_submission.html]
[test_autofocus_form.html]
[test_basic_autocomplete_form.html]

View File

@ -0,0 +1,61 @@
<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8">
<title>Test autofill submit</title>
<script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
<script type="text/javascript" src="/tests/SimpleTest/SpawnTask.js"></script>
<script type="text/javascript" src="formautofill_common.js"></script>
<script type="text/javascript" src="satchel_common.js"></script>
<link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
</head>
<body>
Form autofill test: check if address is saved/updated correctly
<script>
/* import-globals-from ../../../../../testing/mochitest/tests/SimpleTest/SpawnTask.js */
/* import-globals-from ../../../../../toolkit/components/satchel/test/satchel_common.js */
/* import-globals-from formautofill_common.js */
"use strict";
let TEST_ADDRESSES = [{
organization: "Sesame Street",
"street-address": "123 Sesame Street.",
tel: "1-345-345-3456",
}, {
organization: "Mozilla",
"street-address": "331 E. Evelyn Avenue",
tel: "1-650-903-0800",
}];
// Autofill the address from dropdown menu.
add_task(async function check_storage_after_form_submitted() {
for (let key in TEST_ADDRESSES[0]) {
setInput("#" + key, TEST_ADDRESSES[0][key]);
}
clickOnElement("input[type=submit]");
let expectedAddresses = TEST_ADDRESSES.slice(0, 1);
await onAddressChanged("add");
let matching = await checkAddresses(expectedAddresses);
ok(matching, "Address saved as expected");
});
</script>
<div>
<form onsubmit="return false">
<p>This is a basic form for submitting test.</p>
<p><label>organization: <input id="organization" name="organization" autocomplete="organization" type="text"></label></p>
<p><label>streetAddress: <input id="street-address" name="street-address" autocomplete="street-address" type="text"></label></p>
<p><label>tel: <input id="tel" name="tel" autocomplete="tel" type="text"></label></p>
<p><label>country: <input id="country" name="country" autocomplete="country" type="text"></label></p>
<p><input type="submit"></p>
</form>
</div>
</body>
</html>