Source code

Revision control

Copy as Markdown

Other Tools

Test Info: Warnings

"use strict";
var AddressResult, CreditCardResult;
add_setup(async () => {
({ AddressResult, CreditCardResult } = ChromeUtils.importESModule(
));
});
let matchingProfiles = [
{
guid: "test-guid-1",
"given-name": "Timothy",
"family-name": "Berners-Lee",
name: "Timothy Berners-Lee",
organization: "Sesame Street",
"street-address": "123 Sesame Street.",
"address-line1": "123 Sesame Street.",
tel: "1-345-345-3456.",
},
{
guid: "test-guid-2",
"given-name": "John",
"family-name": "Doe",
name: "John Doe",
organization: "Mozilla",
"street-address": "331 E. Evelyn Avenue",
"address-line1": "331 E. Evelyn Avenue",
tel: "1-650-903-0800",
},
{
guid: "test-guid-3",
organization: "",
"street-address": "321, No Name St. 2nd line 3rd line",
"-moz-street-address-one-line": "321, No Name St. 2nd line 3rd line",
"address-line1": "321, No Name St.",
"address-line2": "2nd line",
"address-line3": "3rd line",
tel: "1-000-000-0000",
},
];
let allFieldNames = [
"given-name",
"family-name",
"street-address",
"address-line1",
"address-line2",
"address-line3",
"organization",
"tel",
];
function makeAddressLabel({ primary, secondary, status }) {
return JSON.stringify({
primary,
secondary,
status,
ariaLabel: primary + " " + secondary + " " + status,
});
}
let addressTestCases = [
{
description: "Focus on an `organization` field",
options: {},
matchingProfiles,
allFieldNames,
searchString: "",
fieldName: "organization",
expected: {
searchResult: Ci.nsIAutoCompleteResult.RESULT_SUCCESS,
defaultIndex: 0,
items: [
{
value: "",
style: "autofill",
comment: JSON.stringify(matchingProfiles[0]),
label: makeAddressLabel({
primary: "Sesame Street",
secondary: "123 Sesame Street.",
status: "Also autofills address, name, phone",
}),
image: "",
},
{
value: "",
style: "autofill",
comment: JSON.stringify(matchingProfiles[1]),
label: makeAddressLabel({
primary: "Mozilla",
secondary: "331 E. Evelyn Avenue",
status: "Also autofills address, name, phone",
}),
image: "",
},
],
},
},
{
description: "Focus on an `tel` field",
options: {},
matchingProfiles,
allFieldNames,
searchString: "",
fieldName: "tel",
expected: {
searchResult: Ci.nsIAutoCompleteResult.RESULT_SUCCESS,
defaultIndex: 0,
items: [
{
value: "",
style: "autofill",
comment: JSON.stringify(matchingProfiles[0]),
label: makeAddressLabel({
primary: "1-345-345-3456.",
secondary: "123 Sesame Street.",
status: "Also autofills address, name, organization",
}),
image: "",
},
{
value: "",
style: "autofill",
comment: JSON.stringify(matchingProfiles[1]),
label: makeAddressLabel({
primary: "1-650-903-0800",
secondary: "331 E. Evelyn Avenue",
status: "Also autofills address, name, organization",
}),
image: "",
},
{
value: "",
style: "autofill",
comment: JSON.stringify(matchingProfiles[2]),
label: makeAddressLabel({
primary: "1-000-000-0000",
secondary: "321, No Name St. 2nd line 3rd line",
status: "Also autofills address",
}),
image: "",
},
],
},
},
{
description: "Focus on an `street-address` field",
options: {},
matchingProfiles,
allFieldNames,
searchString: "",
fieldName: "street-address",
expected: {
searchResult: Ci.nsIAutoCompleteResult.RESULT_SUCCESS,
defaultIndex: 0,
items: [
{
value: "",
style: "autofill",
comment: JSON.stringify(matchingProfiles[0]),
label: makeAddressLabel({
primary: "123 Sesame Street.",
secondary: "Timothy Berners-Lee",
status: "Also autofills name, organization, phone",
}),
image: "",
},
{
value: "",
style: "autofill",
comment: JSON.stringify(matchingProfiles[1]),
label: makeAddressLabel({
primary: "331 E. Evelyn Avenue",
secondary: "John Doe",
status: "Also autofills name, organization, phone",
}),
image: "",
},
{
value: "",
style: "autofill",
comment: JSON.stringify(matchingProfiles[2]),
label: makeAddressLabel({
primary: "321, No Name St. 2nd line 3rd line",
secondary: "1-000-000-0000",
status: "Also autofills phone",
}),
image: "",
},
],
},
},
{
description: "Focus on an `address-line1` field",
options: {},
matchingProfiles,
allFieldNames,
searchString: "",
fieldName: "address-line1",
expected: {
searchResult: Ci.nsIAutoCompleteResult.RESULT_SUCCESS,
defaultIndex: 0,
items: [
{
value: "",
style: "autofill",
comment: JSON.stringify(matchingProfiles[0]),
label: makeAddressLabel({
primary: "123 Sesame Street.",
secondary: "Timothy Berners-Lee",
status: "Also autofills name, organization, phone",
}),
image: "",
},
{
value: "",
style: "autofill",
comment: JSON.stringify(matchingProfiles[1]),
label: makeAddressLabel({
primary: "331 E. Evelyn Avenue",
secondary: "John Doe",
status: "Also autofills name, organization, phone",
}),
image: "",
},
{
value: "",
style: "autofill",
comment: JSON.stringify(matchingProfiles[2]),
label: makeAddressLabel({
primary: "321, No Name St.",
secondary: "1-000-000-0000",
status: "Also autofills phone",
}),
image: "",
},
],
},
},
{
description: "No matching profiles",
options: {},
matchingProfiles: [],
allFieldNames,
searchString: "",
fieldName: "",
expected: {
searchResult: Ci.nsIAutoCompleteResult.RESULT_NOMATCH,
defaultIndex: 0,
items: [],
},
},
{
description: "Search with failure",
options: { resultCode: Ci.nsIAutoCompleteResult.RESULT_FAILURE },
matchingProfiles: [],
allFieldNames,
searchString: "",
fieldName: "",
expected: {
searchResult: Ci.nsIAutoCompleteResult.RESULT_FAILURE,
defaultIndex: 0,
items: [],
},
},
];
matchingProfiles = [
{
guid: "test-guid-1",
"cc-name": "Timothy Berners-Lee",
"cc-number": "************6785",
"cc-exp-month": 12,
"cc-exp-year": 2014,
"cc-type": "visa",
},
{
guid: "test-guid-2",
"cc-name": "John Doe",
"cc-number": "************1234",
"cc-exp-month": 4,
"cc-exp-year": 2014,
"cc-type": "amex",
},
{
guid: "test-guid-3",
"cc-number": "************5678",
"cc-exp-month": 8,
"cc-exp-year": 2018,
},
];
allFieldNames = ["cc-name", "cc-number", "cc-exp-month", "cc-exp-year"];
let creditCardTestCases = [
{
description: "Focus on a `cc-name` field",
options: {},
matchingProfiles,
allFieldNames,
searchString: "",
fieldName: "cc-name",
expected: {
searchResult: Ci.nsIAutoCompleteResult.RESULT_SUCCESS,
defaultIndex: 0,
items: [
{
value: "",
style: "autofill",
comment: JSON.stringify(matchingProfiles[0]),
label: JSON.stringify({
primary: "Timothy Berners-Lee",
secondary: "••••6785",
ariaLabel: "Visa Timothy Berners-Lee ****6785",
}),
},
{
value: "",
style: "autofill",
comment: JSON.stringify(matchingProfiles[1]),
label: JSON.stringify({
primary: "John Doe",
secondary: "••••1234",
ariaLabel: "American Express John Doe ****1234",
}),
},
],
},
},
{
description: "Focus on a `cc-number` field",
options: {},
matchingProfiles,
allFieldNames,
searchString: "",
fieldName: "cc-number",
expected: {
searchResult: Ci.nsIAutoCompleteResult.RESULT_SUCCESS,
defaultIndex: 0,
items: [
{
value: "",
style: "autofill",
comment: JSON.stringify(matchingProfiles[0]),
label: JSON.stringify({
primary: "••••6785",
secondary: "Timothy Berners-Lee",
ariaLabel: "Visa 6785 Timothy Berners-Lee",
}),
},
{
value: "",
style: "autofill",
comment: JSON.stringify(matchingProfiles[1]),
label: JSON.stringify({
primary: "••••1234",
secondary: "John Doe",
ariaLabel: "American Express 1234 John Doe",
}),
},
{
value: "",
style: "autofill",
comment: JSON.stringify(matchingProfiles[2]),
label: JSON.stringify({
primary: "••••5678",
secondary: "",
ariaLabel: "5678",
}),
},
],
},
},
{
description: "No matching profiles",
options: {},
matchingProfiles: [],
allFieldNames,
searchString: "",
fieldName: "",
expected: {
searchResult: Ci.nsIAutoCompleteResult.RESULT_NOMATCH,
defaultIndex: 0,
items: [],
},
},
{
description: "Search with failure",
options: { resultCode: Ci.nsIAutoCompleteResult.RESULT_FAILURE },
matchingProfiles: [],
allFieldNames,
searchString: "",
fieldName: "",
expected: {
searchResult: Ci.nsIAutoCompleteResult.RESULT_FAILURE,
defaultIndex: 0,
items: [],
},
},
];
add_task(async function test_all_patterns() {
let testSets = [
{
collectionConstructor: AddressResult,
testCases: addressTestCases,
},
{
collectionConstructor: CreditCardResult,
testCases: creditCardTestCases,
},
];
testSets.forEach(({ collectionConstructor, testCases }) => {
testCases.forEach(testCase => {
info("Starting testcase: " + testCase.description);
let actual = new collectionConstructor(
testCase.searchString,
testCase.fieldName,
testCase.allFieldNames,
testCase.matchingProfiles,
testCase.options
);
let expectedValue = testCase.expected;
let expectedItemLength = expectedValue.items.length;
// If the last item shows up as a footer, we expect one more item
// than expected.
if (actual.getStyleAt(actual.matchCount - 1) == "action") {
expectedItemLength++;
}
// Add one row for the status.
if (
actual.matchCount > 2 &&
actual.getStyleAt(actual.matchCount - 2) == "status"
) {
expectedItemLength++;
}
equal(actual.searchResult, expectedValue.searchResult);
equal(actual.defaultIndex, expectedValue.defaultIndex);
equal(actual.matchCount, expectedItemLength);
expectedValue.items.forEach((item, index) => {
equal(actual.getValueAt(index), item.value);
equal(actual.getCommentAt(index), item.comment);
equal(actual.getLabelAt(index), item.label);
equal(actual.getStyleAt(index), item.style);
equal(actual.getImageAt(index), item.image);
});
if (expectedValue.items.length) {
Assert.throws(
() => actual.getValueAt(expectedItemLength),
/Index out of range\./
);
Assert.throws(
() => actual.getLabelAt(expectedItemLength),
/Index out of range\./
);
Assert.throws(
() => actual.getCommentAt(expectedItemLength),
/Index out of range\./
);
}
});
});
});