blob: 486cee052e635476980d82ec0eba050ffd662246 [file] [log] [blame]
<!DOCTYPE html>
<meta charset="utf-8">
<title>Tests for providing `automaticReloadPaymentRequest` as part of `ApplePayModifier`.</title>
<script src="/js-test-resources/ui-helper.js"></script>
<script src="/resources/payment-request.js"></script>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<body>
<script>
setup({ explicit_done: true, explicit_timeout: true });
const paymentDescription = "paymentDescription";
const automaticReloadBilling = { label: "automaticReloadBilling", amount: "5", type: "final", paymentTiming: "automaticReload", automaticReloadPaymentThresholdAmount: "10", recurringPaymentIntervalUnit: "month", recurringPaymentIntervalCount: 1 };
const billingAgreement = "billingAgreement";
const managementURL = "http://managementURL.com";
const tokenNotificationURL = "http://tokenNotificationURL.com";
function modifiersWithData(data) {
return [ { supportedMethods: 'https://apple.com/apple-pay', data } ];
}
function testValidAutomaticReloadPaymentRequest(description, {initialAutomaticReloadPaymentRequest, expectedAutomaticReloadPaymentRequest}) {
user_activation_test(async (test) => {
let detailsInit = validPaymentDetails();
if (initialAutomaticReloadPaymentRequest !== undefined)
detailsInit.modifiers = modifiersWithData({ automaticReloadPaymentRequest: initialAutomaticReloadPaymentRequest });
let request = new PaymentRequest([validPaymentMethod()], detailsInit);
request.addEventListener("merchantvalidation", (event) => {
event.complete({ });
});
request.addEventListener("shippingaddresschange", (event) => {
event.updateWith({ });
internals.mockPaymentCoordinator.acceptPayment();
});
let response = await request.show();
let actualAutomaticReloadPaymentRequest = internals.mockPaymentCoordinator.automaticReloadPaymentRequest;
if (actualAutomaticReloadPaymentRequest)
assert_object_equals(actualAutomaticReloadPaymentRequest, expectedAutomaticReloadPaymentRequest, "check that the `automaticReloadPaymentRequest` matches");
else
assert_equals(actualAutomaticReloadPaymentRequest, expectedAutomaticReloadPaymentRequest, "check that the `automaticReloadPaymentRequest` matches");
await response.complete("success");
}, description + " as part of the request.");
user_activation_test(async (test) => {
let request = new PaymentRequest([validPaymentMethod()], validPaymentDetails());
request.addEventListener("merchantvalidation", (event) => {
event.complete({ });
});
request.addEventListener("shippingaddresschange", (event) => {
let detailsUpdate = { };
if (initialAutomaticReloadPaymentRequest !== undefined)
detailsUpdate.modifiers = modifiersWithData({ automaticReloadPaymentRequest: initialAutomaticReloadPaymentRequest });
event.updateWith(detailsUpdate);
internals.mockPaymentCoordinator.acceptPayment();
});
let response = await request.show();
let actualAutomaticReloadPaymentRequest = internals.mockPaymentCoordinator.automaticReloadPaymentRequest;
if (actualAutomaticReloadPaymentRequest)
assert_object_equals(actualAutomaticReloadPaymentRequest, expectedAutomaticReloadPaymentRequest, "check that the `automaticReloadPaymentRequest` matches");
else
assert_equals(actualAutomaticReloadPaymentRequest, expectedAutomaticReloadPaymentRequest, "check that the `automaticReloadPaymentRequest` matches");
await response.complete("success");
}, description + " as part of an update.");
}
testValidAutomaticReloadPaymentRequest("The default value of `automaticReloadPaymentRequest` should be `null` if `data` is not provided", {
initialAutomaticReloadPaymentRequest: undefined,
expectedAutomaticReloadPaymentRequest: null,
});
testValidAutomaticReloadPaymentRequest("Should not error if optional properties are not provided", {
initialAutomaticReloadPaymentRequest: { paymentDescription, automaticReloadBilling, managementURL },
expectedAutomaticReloadPaymentRequest: { paymentDescription, automaticReloadBilling, managementURL },
});
testValidAutomaticReloadPaymentRequest("Should propagate all data", {
initialAutomaticReloadPaymentRequest: { paymentDescription, automaticReloadBilling, billingAgreement, managementURL, tokenNotificationURL },
expectedAutomaticReloadPaymentRequest: { paymentDescription, automaticReloadBilling, billingAgreement, managementURL, tokenNotificationURL },
});
function testInvalidAutomaticReloadPaymentRequest(description, {automaticReloadPaymentRequest, expectedErrorSubstring}) {
user_activation_test(async (test) => {
let detailsInit = validPaymentDetails();
detailsInit.modifiers = modifiersWithData({ automaticReloadPaymentRequest });
let request = new PaymentRequest([validPaymentMethod()], detailsInit);
try {
let response = await request.show();
internals.mockPaymentCoordinator.cancelPayment();
assert_true(false, "should error about " + expectedErrorSubstring);
} catch (e) {
assert_true(e.message.includes(expectedErrorSubstring), "should error about " + expectedErrorSubstring);
}
}, description + " as part of the request.");
user_activation_test(async (test) => {
let request = new PaymentRequest([validPaymentMethod()], validPaymentDetails());
request.addEventListener("merchantvalidation", (event) => {
event.complete({ });
});
request.addEventListener("shippingaddresschange", (event) => {
event.updateWith({ modifiers: modifiersWithData({ automaticReloadPaymentRequest }) });
});
try {
let response = await request.show();
internals.mockPaymentCoordinator.cancelPayment();
assert_true(false, "should error about " + expectedErrorSubstring);
} catch (e) {
assert_true(e.message.includes(expectedErrorSubstring), "should error about " + expectedErrorSubstring);
}
}, description + " as part of an update.");
}
testInvalidAutomaticReloadPaymentRequest("Should error when `automaticReloadBilling` is missing `paymentTiming`", {
automaticReloadPaymentRequest: { paymentDescription, automaticReloadBilling: { } , managementURL },
expectedErrorSubstring: "'automaticReloadBilling' must be an 'automaticReload' line item",
});
testInvalidAutomaticReloadPaymentRequest("Should error when `automaticReloadBilling` has an invalid `paymentTiming`", {
automaticReloadPaymentRequest: { paymentDescription, automaticReloadBilling: { paymentTiming: "immediate" } , managementURL },
expectedErrorSubstring: "'automaticReloadBilling' must be an 'automaticReload' line item",
});
testInvalidAutomaticReloadPaymentRequest("Should error when `automaticReloadBilling` is missing `label`", {
automaticReloadPaymentRequest: { paymentDescription, automaticReloadBilling: { paymentTiming: "automaticReload" } , managementURL },
expectedErrorSubstring: "Missing label for 'automaticReloadBilling'",
});
testInvalidAutomaticReloadPaymentRequest("Should error when `automaticReloadBilling` is missing `amount`", {
automaticReloadPaymentRequest: { paymentDescription, automaticReloadBilling: { paymentTiming: "automaticReload", label: "automaticReloadBillingBad" } , managementURL },
expectedErrorSubstring: "not a valid amount",
});
testInvalidAutomaticReloadPaymentRequest("Should error when `automaticReloadBilling` has an invalid `amount`", {
automaticReloadPaymentRequest: { paymentDescription, automaticReloadBilling: { paymentTiming: "automaticReload", label: "automaticReloadBillingBad", amount: "invalid" } , managementURL },
expectedErrorSubstring: "not a valid amount",
});
testInvalidAutomaticReloadPaymentRequest("Should error when `automaticReloadBilling` is missing `automaticReloadPaymentThresholdAmount`", {
automaticReloadPaymentRequest: { paymentDescription, automaticReloadBilling: { paymentTiming: "automaticReload", label: "automaticReloadBillingBad", amount: "42" } , managementURL },
expectedErrorSubstring: "not a valid automaticReloadPaymentThresholdAmount",
});
testInvalidAutomaticReloadPaymentRequest("Should error when `automaticReloadBilling` has an invalid `automaticReloadPaymentThresholdAmount`", {
automaticReloadPaymentRequest: { paymentDescription, automaticReloadBilling: { paymentTiming: "automaticReload", label: "automaticReloadBillingBad", amount: "42", automaticReloadPaymentThresholdAmount: "invalid" } , managementURL },
expectedErrorSubstring: "not a valid automaticReloadPaymentThresholdAmount",
});
testInvalidAutomaticReloadPaymentRequest("Should error when `managementURL` is not a valid URL", {
automaticReloadPaymentRequest: { paymentDescription, automaticReloadBilling, managementURL: 42 },
expectedErrorSubstring: "not a valid URL",
});
testInvalidAutomaticReloadPaymentRequest("Should error when `tokenNotificationURL` is not a valid URL", {
automaticReloadPaymentRequest: { paymentDescription, automaticReloadBilling, managementURL, tokenNotificationURL: 42 },
expectedErrorSubstring: "not a valid URL",
});
done();
</script>