summaryrefslogtreecommitdiffstats
path: root/testing/web-platform/tests/payment-handler/change-payment-method-manual.https.html
diff options
context:
space:
mode:
Diffstat (limited to 'testing/web-platform/tests/payment-handler/change-payment-method-manual.https.html')
-rw-r--r--testing/web-platform/tests/payment-handler/change-payment-method-manual.https.html170
1 files changed, 170 insertions, 0 deletions
diff --git a/testing/web-platform/tests/payment-handler/change-payment-method-manual.https.html b/testing/web-platform/tests/payment-handler/change-payment-method-manual.https.html
new file mode 100644
index 0000000000..1640420c62
--- /dev/null
+++ b/testing/web-platform/tests/payment-handler/change-payment-method-manual.https.html
@@ -0,0 +1,170 @@
+<!DOCTYPE html>
+<meta charset="utf-8" />
+<title>Tests for PaymentRequestEvent.changePaymentMethod()</title>
+<link
+ rel="help"
+ href="https://w3c.github.io/payment-handler/#changepaymentmethod-method"
+/>
+<link rel="manifest" href="/payment-handler/manifest.json" />
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/testdriver.js"></script>
+<script src="/resources/testdriver-vendor.js"></script>
+<script src="register-and-activate-service-worker.js"></script>
+<p>If the payment sheet is shown, please authorize the mock payment.</p>
+<script>
+ async function runTests(registration) {
+ const methodName = window.location.origin + '/payment-handler/payment-app/';
+ await registration.paymentManager.instruments.clear();
+ await registration.paymentManager.instruments.set('instrument-key', {
+ name: 'Instrument Name',
+ method: methodName,
+ });
+
+ promise_test(async (t) => {
+ const request = new PaymentRequest([{supportedMethods: methodName}], {
+ total: {label: 'Total', amount: {currency: 'USD', value: '0.01'}},
+ });
+ // Intentionally do not respond to the 'paymentmethodchange' event.
+ const response = await test_driver.bless('showing a payment sheet', () =>
+ request.show()
+ );
+ const complete_promise = response.complete('success');
+
+ assert_equals(response.details.changePaymentMethodReturned, null);
+
+ return complete_promise;
+ }, 'If updateWith(details) is not run, changePaymentMethod() returns null.');
+
+ promise_test(async (t) => {
+ const request = new PaymentRequest([{supportedMethods: methodName}], {
+ total: {label: 'Total', amount: {currency: 'USD', value: '0.01'}},
+ });
+ request.addEventListener('paymentmethodchange', (event) => {
+ assert_equals(event.methodName, methodName);
+ assert_equals(event.methodDetails.country, 'US');
+ event.updateWith(Promise.reject('Error'));
+ });
+ const response_promise = test_driver.bless(
+ 'showing a payment sheet',
+ () => request.show()
+ );
+
+ return promise_rejects_dom(t, 'AbortError', response_promise);
+ }, 'If updateWith(details) is rejected, abort the PaymentRequest.show().');
+
+ promise_test(async (t) => {
+ const request = new PaymentRequest([{supportedMethods: methodName}], {
+ total: {label: 'Total', amount: {currency: 'USD', value: '0.01'}},
+ });
+ request.addEventListener('paymentmethodchange', (event) => {
+ assert_equals(event.methodName, methodName);
+ assert_equals(event.methodDetails.country, 'US');
+ event.updateWith(
+ new Promise(() => {
+ throw 'Error for test';
+ })
+ );
+ });
+ const response_promise = test_driver.bless(
+ 'showing a payment sheet',
+ () => request.show()
+ );
+
+ return promise_rejects_dom(t, 'AbortError', response_promise);
+ }, 'If updateWith(details) throws inside of the promise, abort the PaymentRequest.show().');
+
+ promise_test(async (t) => {
+ const request = new PaymentRequest([{supportedMethods: methodName}], {
+ total: {label: 'Total', amount: {currency: 'USD', value: '0.01'}},
+ });
+ request.addEventListener('paymentmethodchange', (event) => {
+ assert_equals(event.methodName, methodName);
+ assert_equals(event.methodDetails.country, 'US');
+ event.updateWith({
+ total: {label: 'Total', amount: {currency: 'GBP', value: '0.02'}},
+ error: 'Error for test',
+ modifiers: [
+ {
+ supportedMethods: methodName,
+ data: {soup: 'potato'},
+ total: {
+ label: 'Modified total',
+ amount: {currency: 'EUR', value: '0.03'},
+ },
+ additionalDisplayItems: [
+ {
+ label: 'Modified display item',
+ amount: {currency: 'INR', value: '0.06'},
+ },
+ ],
+ },
+ {
+ supportedMethods: methodName + '2',
+ data: {soup: 'tomato'},
+ total: {
+ label: 'Modified total #2',
+ amount: {currency: 'CHF', value: '0.07'},
+ },
+ additionalDisplayItems: [
+ {
+ label: 'Modified display item #2',
+ amount: {currency: 'CAD', value: '0.08'},
+ },
+ ],
+ },
+ ],
+ paymentMethodErrors: {country: 'Unsupported country'},
+ displayItems: [
+ {
+ label: 'Display item',
+ amount: {currency: 'CNY', value: '0.04'},
+ },
+ ],
+ shippingOptions: [
+ {
+ label: 'Shipping option',
+ id: 'id',
+ amount: {currency: 'JPY', value: '0.05'},
+ },
+ ],
+ });
+ });
+ const response = await test_driver.bless('showing a payment sheet', () =>
+ request.show()
+ );
+ const complete_promise = response.complete('success');
+ const changePaymentMethodReturned =
+ response.details.changePaymentMethodReturned;
+
+ assert_equals(changePaymentMethodReturned.total.currency, 'GBP');
+ assert_equals(changePaymentMethodReturned.total.value, '0.02');
+ assert_equals(changePaymentMethodReturned.total.label, undefined);
+ assert_equals(changePaymentMethodReturned.error, 'Error for test');
+ assert_equals(changePaymentMethodReturned.modifiers.length, 1);
+ assert_equals(changePaymentMethodReturned.displayItems, undefined);
+ assert_equals(changePaymentMethodReturned.shippingOptions, undefined);
+ assert_equals(
+ changePaymentMethodReturned.paymentMethodErrors.country,
+ 'Unsupported country'
+ );
+
+ const modifier = changePaymentMethodReturned.modifiers[0];
+
+ assert_equals(modifier.supportedMethods, methodName);
+ assert_equals(modifier.data.soup, 'potato');
+ assert_equals(modifier.total.label, '');
+ assert_equals(modifier.total.amount.currency, 'EUR');
+ assert_equals(modifier.total.amount.value, '0.03');
+ assert_equals(modifier.additionalDisplayItems, undefined);
+
+ return complete_promise;
+ }, 'The changePaymentMethod() returns some details from the "paymentmethodchange" event\'s updateWith(details) call.');
+ }
+
+ registerAndActiveServiceWorker(
+ 'app-change-payment-method.js',
+ 'payment-app/',
+ runTests
+ );
+</script>