blob: 88c43e85fa6bd6c75df4a4ee1ca17b5356e0545f [file] [log] [blame] [edit]
<!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>