208 lines
8.3 KiB
HTML
208 lines
8.3 KiB
HTML
<!DOCTYPE HTML>
|
|
<html>
|
|
<!--
|
|
https://bugzilla.mozilla.org/show_bug.cgi?id=1440041
|
|
https://bugzilla.mozilla.org/show_bug.cgi?id=1443914
|
|
-->
|
|
<head>
|
|
<meta charset="utf-8">
|
|
<title>Test for shippingOptions related bugs</title>
|
|
<link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
|
|
<script src="/tests/SimpleTest/SimpleTest.js"></script>
|
|
<script type="application/javascript" src="./DefaultData.js"></script>
|
|
<script type="application/javascript">
|
|
|
|
"use strict";
|
|
SimpleTest.waitForExplicitFinish();
|
|
|
|
var gUrl = SimpleTest.getTestFileURL('ShippingOptionsChromeScript.js');
|
|
var gScript = SpecialPowers.loadChromeScript(gUrl);
|
|
|
|
function testFailHandler(message) {
|
|
ok(false, message);
|
|
}
|
|
function testPassHandler(message) {
|
|
ok(true, message);
|
|
}
|
|
gScript.addMessageListener("test-fail", testFailHandler);
|
|
gScript.addMessageListener("test-pass", testPassHandler);
|
|
|
|
let shippingOptions = [{
|
|
id: "NormalShipping",
|
|
label: "NormalShipping",
|
|
amount: {
|
|
currency: "USD",
|
|
value: "10.00",
|
|
},
|
|
selected: true,
|
|
},{
|
|
id: "FastShipping",
|
|
label: "FastShipping",
|
|
amount: {
|
|
currency: "USD",
|
|
value: "5.00",
|
|
},
|
|
selected: false,
|
|
}]
|
|
|
|
// testing function main body
|
|
function testShippingOptionsTemplate(initDetails,
|
|
optionUpdateDetails,
|
|
expectedRequestOption,
|
|
expectedOptionChangeOption,
|
|
expectedResponseOption) {
|
|
const expectedResults = {requestResult: expectedRequestOption,
|
|
changeOptionResult: expectedOptionChangeOption,
|
|
responseResult: expectedResponseOption,};
|
|
gScript.sendAsyncMessage("set-expected-results", expectedResults);
|
|
return new Promise((resolve, reject) => {
|
|
const request = new PaymentRequest(defaultMethods, initDetails, defaultOptions);
|
|
const handler = SpecialPowers.getDOMWindowUtils(window).setHandlingUserInput(true);
|
|
is(request.shippingOption, expectedRequestOption,
|
|
"request.shippingOption should be " + expectedRequestOption +
|
|
" after created, but got " + request.shippingOption + ".");
|
|
if (optionUpdateDetails) {
|
|
request.addEventListener("shippingoptionchange", event => {
|
|
is(request.shippingOption, expectedOptionChangeOption,
|
|
"request.shippingOption should be " + expectedOptionChangeOption +
|
|
" in shippingoptionchange event, but got " + request.shippingOption + ".");
|
|
event.updateWith(optionUpdateDetails);
|
|
});
|
|
}
|
|
request.show().then(response => {
|
|
is(response.shippingOption, expectedResponseOption,
|
|
"response.shippingOption should be " + expectedResponseOption +
|
|
", but got " + response.shippingOption + ".");
|
|
response.complete("success").then(() => {
|
|
resolve();
|
|
}).catch(error => {
|
|
ok(false, "Unexpected error: " + error.name);
|
|
resolve();
|
|
})
|
|
}, response => {
|
|
}).catch(error => {
|
|
ok(false, "Unexpected error: " + error.name);
|
|
resolve();
|
|
}).finally(handler.destruct);
|
|
});
|
|
}
|
|
|
|
// test no selected shipping option in default
|
|
function testNoSelectedShippingOptions() {
|
|
return testShippingOptionsTemplate(defaultDetails, // initial details
|
|
null, // update details for optionchange
|
|
null, // expected request.shippintOption after create
|
|
null, // expected request.shippingOption after optionchange
|
|
null); // expected response.shippingOption
|
|
}
|
|
|
|
// test select one shipping option in default
|
|
function testSelectedOneShippingOption() {
|
|
let details = Object.assign({}, defaultDetails);
|
|
details.shippingOptions = shippingOptions;
|
|
details.shippingOptions[0].selected = true;
|
|
details.shippingOptions[1].selected = false;
|
|
const expectedOption = details.shippingOptions[0].id;
|
|
return testShippingOptionsTemplate(details, // initial details
|
|
null, // update details for optionchange
|
|
expectedOption, // expected request.shippintOption after create
|
|
null, // expected request.shippingOption after optionchange
|
|
expectedOption); // expected response.shippingOption
|
|
}
|
|
|
|
// test select multiple shipping options in default
|
|
function testMultiSelectedShippingOptions() {
|
|
let details = Object.assign({}, defaultDetails);
|
|
details.shippingOptions = shippingOptions;
|
|
details.shippingOptions[0].selected = true;
|
|
details.shippingOptions[1].selected = true;
|
|
const expectedOption = details.shippingOptions[1].id;
|
|
return testShippingOptionsTemplate(details, // initial details
|
|
null, // update details for optionchange
|
|
expectedOption, // expected request.shippintOption after create
|
|
null, // expected request.shippingOption after optionchange
|
|
expectedOption); // expected response.shippingOption
|
|
}
|
|
|
|
// test no selected shipping option in default, but selected by user
|
|
function testSelectedByUser() {
|
|
let updateDetails = Object.assign({}, defaultDetails);
|
|
updateDetails.shippingOptions = shippingOptions;
|
|
updateDetails.shippingOptions[0].selected = true;
|
|
updateDetails.shippingOptions[1].selected = false;
|
|
const expectedOption = updateDetails.shippingOptions[0].id;
|
|
return testShippingOptionsTemplate(defaultDetails, // initial details
|
|
updateDetails, // update details for optionchange
|
|
null, // expected request.shippintOption after create
|
|
expectedOption, // expected request.shippingOption after optionchange
|
|
expectedOption); // expected response.shippingOption
|
|
}
|
|
|
|
// test no selected shipping option in default, but selected by user then updated
|
|
// by merchant to the other.
|
|
function testUpdateSelectedByMerchant() {
|
|
let updateDetails = Object.assign({}, defaultDetails);
|
|
updateDetails.shippingOptions = shippingOptions;
|
|
updateDetails.shippingOptions[0].selected = false;
|
|
updateDetails.shippingOptions[1].selected = true;
|
|
const expectedOption = updateDetails.shippingOptions[0].id;
|
|
const expectedResponse = updateDetails.shippingOptions[1].id;
|
|
return testShippingOptionsTemplate(defaultDetails, // initial details
|
|
updateDetails, // update details for optionchange
|
|
null, // expected request.shippintOption after create
|
|
expectedOption, // expected request.shippingOption after optionchange
|
|
expectedResponse);// expected response.shippingOption
|
|
}
|
|
|
|
// test update shipping options to null
|
|
function testUpdateShippingOptionsToNull() {
|
|
let updateDetails = Object.assign({}, defaultDetails);
|
|
delete updateDetails.shippingOptions;
|
|
const expectedOption = defaultDetails.shippingOptions[0].id;
|
|
return testShippingOptionsTemplate(defaultDetails, // initial details
|
|
updateDetails, // update details for optionchange
|
|
null, // expected request.shippintOption after create
|
|
expectedOption, // expected request.shippingOption after optionchange
|
|
null); // expected response.shippingOption
|
|
}
|
|
|
|
function teardown() {
|
|
gScript.addMessageListener("teardown-complete", function teardownCompleteHandler() {
|
|
gScript.removeMessageListener("teardown-complete", teardownCompleteHandler);
|
|
gScript.removeMessageListener("test-fail", testFailHandler);
|
|
gScript.removeMessageListener("test-pass", testPassHandler);
|
|
gScript.destroy();
|
|
SimpleTest.finish();
|
|
});
|
|
gScript.sendAsyncMessage("teardown");
|
|
}
|
|
|
|
function runTests() {
|
|
testNoSelectedShippingOptions()
|
|
.then(testSelectedOneShippingOption)
|
|
.then(testMultiSelectedShippingOptions)
|
|
.then(testSelectedByUser)
|
|
.then(testUpdateSelectedByMerchant)
|
|
.then(testUpdateShippingOptionsToNull)
|
|
.then(teardown)
|
|
.catch( e => {
|
|
ok(false, "Unexpected error: " + e.name);
|
|
SimpleTest.finish();
|
|
});
|
|
}
|
|
|
|
window.addEventListener('load', function() {
|
|
SpecialPowers.pushPrefEnv({
|
|
'set': [
|
|
['dom.payments.request.enabled', true],
|
|
]
|
|
}, runTests);
|
|
});
|
|
|
|
</script>
|
|
</head>
|
|
<body>
|
|
<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1440041">Mozilla Bug 1440041</a>
|
|
<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1443914">Mozilla Bug 1443914</a>
|
|
</body>
|
|
</html>
|