| <!DOCTYPE html> |
| <meta charset="utf-8" /> |
| <title> |
| Tests for providing `disbursementRequest` 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 }); |
| |
| test((test) => { |
| const method = validPaymentMethod(); |
| try { |
| method.data.features = ["invalidFeatureThatsNotDisbursements"]; |
| new PaymentRequest([method], validPaymentDetails()); |
| assert_unreached("Should have thrown with an invalid feature"); |
| } catch { |
| method.data.features = ["paymentRequestDisbursements"]; |
| new PaymentRequest([method], validPaymentDetails()); |
| } |
| }, "Should have a feature for `disbursementRequest`."); |
| |
| const RESOLVED_PROMISE = Promise.resolve({}); |
| |
| const lineItems = { |
| total: { |
| label: "Chime", |
| amount: "15.00", |
| }, |
| ifo: { |
| label: "Instant Transfer Fee", |
| amount: "0.15", |
| disbursementLineItemType: "instantFundsOutFee", |
| }, |
| disbursement: { |
| label: "Total Amount", |
| amount: "14.85", |
| disbursementLineItemType: "disbursement", |
| }, |
| }; |
| |
| const validLineItems = [ |
| lineItems.total, |
| lineItems.ifo, |
| lineItems.disbursement, |
| ]; |
| |
| function modifiersWithData(data, lineItems) { |
| data.additionalLineItems = lineItems; |
| return [ |
| { |
| supportedMethods: "https://apple.com/apple-pay", |
| data: { ...data }, |
| }, |
| ]; |
| } |
| |
| function testValidDisbursementRequest(description, options) { |
| const { |
| initialDisbursementRequest, |
| expectedDisbursementRequest, |
| } = options; |
| user_activation_test(async (test) => { |
| const detailsInit = { |
| total: { |
| label: "Disbursement", |
| amount: { |
| value: "14.85", |
| currency: "USD", |
| }, |
| }, |
| }; |
| if (initialDisbursementRequest !== undefined) { |
| detailsInit.modifiers = modifiersWithData( |
| { |
| disbursementRequest: |
| initialDisbursementRequest, |
| }, |
| validLineItems |
| ); |
| } |
| |
| const request = new PaymentRequest( |
| [validPaymentMethod()], |
| detailsInit |
| ); |
| request.addEventListener("merchantvalidation", (event) => { |
| event.complete(RESOLVED_PROMISE); |
| }); |
| |
| request.addEventListener("shippingaddresschange", (event) => { |
| event.updateWith({}); |
| internals.mockPaymentCoordinator.changePaymentMethod({ |
| type: "debit", |
| }); |
| }); |
| |
| request.addEventListener("paymentmethodchange", (event) => { |
| event.updateWith(RESOLVED_PROMISE); |
| internals.mockPaymentCoordinator.acceptPayment(); |
| }); |
| |
| const response = await request.show(); |
| |
| const { disbursementRequest } = |
| internals.mockPaymentCoordinator; |
| const assert = disbursementRequest |
| ? assert_object_equals |
| : assert_equals; |
| assert( |
| disbursementRequest, |
| expectedDisbursementRequest, |
| "check that the `DisbursementRequest` matches" |
| ); |
| await response.complete("success"); |
| }, description + " as part of the request."); |
| } |
| |
| function testInvalidDisbursementRequest( |
| description, |
| { disbursementRequest, expectedErrorType } |
| ) { |
| user_activation_test(async (test) => { |
| const detailsInit = { |
| total: { |
| label: "Disbursement", |
| amount: { |
| value: "14.85", |
| currency: "USD", |
| }, |
| }, |
| }; |
| |
| if (disbursementRequest) { |
| detailsInit.modifiers = modifiersWithData( |
| { disbursementRequest }, |
| validLineItems |
| ); |
| } |
| |
| const request = new PaymentRequest( |
| [validPaymentMethod()], |
| detailsInit |
| ); |
| |
| try { |
| await request.show(); |
| } catch (e) { |
| assert_true( |
| e instanceof expectedErrorType, |
| `Expected ${expectedErrorType}` |
| ); |
| } |
| }, description + " as part of the request."); |
| } |
| |
| testValidDisbursementRequest("Should propagate all data", { |
| initialDisbursementRequest: {}, |
| expectedDisbursementRequest: {}, |
| }); |
| |
| testValidDisbursementRequest( |
| "Should propagate recipient contact information", |
| { |
| initialDisbursementRequest: { |
| requiredRecipientContactFields: ["email", "name"], |
| }, |
| expectedDisbursementRequest: { |
| requiredRecipientContactFields: ["email", "name"], |
| }, |
| } |
| ); |
| |
| testInvalidDisbursementRequest( |
| "Should error when incorrect `requiredRecipientContactFields` are provided", |
| { |
| disbursementRequest: { |
| requiredRecipientContactFields: ["invalid1", "invalid2"], |
| }, |
| expectedErrorType: TypeError, |
| } |
| ); |
| |
| // We don't need invalidation tests since a disbursement request is an empty dictionary. |
| |
| done(); |
| </script> |
| </body> |