<!DOCTYPE html>
<meta charset="utf-8">
<title>Tests for providing `couponCode` in `data` as part of `PaymentMethodData`.</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 });

user_activation_test(async (test) => {
    let request = new PaymentRequest([validPaymentMethod()], validPaymentDetails());
    request.addEventListener("merchantvalidation", (event) => {
        event.complete({ });
    });
    request.addEventListener("shippingaddresschange", (event) => {
        assert_equals(internals.mockPaymentCoordinator.couponCode, null, "check that the `couponCode` is still `null` after an update");
        event.updateWith({ });
        internals.mockPaymentCoordinator.acceptPayment();
    });

    let response = await request.show();

    assert_equals(internals.mockPaymentCoordinator.couponCode, null, "check that the `couponCode` is still `null` after the payment is accepted");

    await response.complete("success");
}, "Should not have a default value for `couponCode`.");

user_activation_test(async (test) => {
    const method = validPaymentMethod();
    method.data.couponCode = "TEST";

    let request = new PaymentRequest([method], validPaymentDetails());
    request.addEventListener("merchantvalidation", (event) => {
        event.complete({ });
    });
    request.addEventListener("shippingaddresschange", (event) => {
        assert_equals(internals.mockPaymentCoordinator.couponCode, method.data.couponCode, "check that the `couponCode` still matches after an update");
        event.updateWith({ });
        internals.mockPaymentCoordinator.acceptPayment();
    });

    let response = await request.show();

    assert_equals(internals.mockPaymentCoordinator.couponCode, method.data.couponCode, "check that the `couponCode` still matches after the payment is accepted");

    await response.complete("success");
}, "Should propagate `couponCode` if provided.");

done();
</script>

