<!DOCTYPE html>
<meta charset="utf-8">
<title>Tests for providing `orderDetails` as part of `ApplePayPaymentCompleteDetails`.</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 orderTypeIdentifier = "orderTypeIdentifier";
const orderIdentifier = "orderIdentifier";
const webServiceURL = "https://apple.com";
const authenticationToken = "authenticationToken";

function testValidPaymentCompleteData(description, {orderDetails}) {
    user_activation_test(async (test) => {
        let request = new PaymentRequest([validPaymentMethod()], validPaymentDetails());
        request.addEventListener("merchantvalidation", (event) => {
            event.complete({ });
        });
        request.addEventListener("shippingaddresschange", (event) => {
            event.updateWith({ });
            internals.mockPaymentCoordinator.acceptPayment();
        });

        let response = await request.show();

        try {
            await response.complete("success", {data: {orderDetails}});
            assert_true(true, "should not error");
        } catch (e) {
            assert_true(false, `should not error, but saw '${e.message}'`);
        }
    }, description);
}

testValidPaymentCompleteData("Should not error if all properties are provided", {
    orderDetails: {orderTypeIdentifier, orderIdentifier, webServiceURL, authenticationToken},
});

function testInvalidPaymentCompleteData(description, {orderDetails, expectedErrorSubstring}) {
    user_activation_test(async (test) => {
        let request = new PaymentRequest([validPaymentMethod()], validPaymentDetails());
        request.addEventListener("merchantvalidation", (event) => {
            event.complete({ });
        });
        request.addEventListener("shippingaddresschange", (event) => {
            event.updateWith({ });
            internals.mockPaymentCoordinator.acceptPayment();
        });

        let response = await request.show();

        try {
            await response.complete("success", {data: {orderDetails}});
            assert_true(false, `should error about '${expectedErrorSubstring}'`);
        } catch (e) {
            assert_true(e.message.includes(expectedErrorSubstring), `should error about '${expectedErrorSubstring}'`);
        }

        try {
            await response.complete("success");
            assert_true(true, "should be able to recover from error");
        } catch (e) {
            assert_true(false, `should be able to recover from error, but exception was thrown '${e.message}'`);
        }
    }, description);
}

testInvalidPaymentCompleteData("Should error if `orderDetails` is not an object", {
    orderDetails: [],
    expectedErrorSubstring: "Member ApplePayPaymentOrderDetails.authenticationToken is required and must be an instance of DOMString",
});

testInvalidPaymentCompleteData("Should error if `orderTypeIdentifier` is not provided", {
    orderDetails: {orderIdentifier, webServiceURL, authenticationToken},
    expectedErrorSubstring: "Member ApplePayPaymentOrderDetails.orderTypeIdentifier is required and must be an instance of DOMString",
});

testInvalidPaymentCompleteData("Should error if `orderIdentifier` is not provided", {
    orderDetails: {orderTypeIdentifier, webServiceURL, authenticationToken},
    expectedErrorSubstring: "Member ApplePayPaymentOrderDetails.orderIdentifier is required and must be an instance of DOMString",
});

testInvalidPaymentCompleteData("Should error if `webServiceURL` is not provided", {
    orderDetails: {orderTypeIdentifier, orderIdentifier, authenticationToken},
    expectedErrorSubstring: "Member ApplePayPaymentOrderDetails.webServiceURL is required and must be an instance of DOMString",
});
testInvalidPaymentCompleteData("Should error if `webServiceURL` is not a valid URL", {
    orderDetails: {orderTypeIdentifier, orderIdentifier, webServiceURL: 42, authenticationToken},
    expectedErrorSubstring: "not a valid URL",
});

testInvalidPaymentCompleteData("Should error if `authenticationToken` is not provided", {
    orderDetails: {orderTypeIdentifier, orderIdentifier, webServiceURL},
    expectedErrorSubstring: "Member ApplePayPaymentOrderDetails.authenticationToken is required and must be an instance of DOMString",
});

done();
</script>

