<!DOCTYPE html>
<meta charset="utf-8">
<title>Tests for providing `supportsCouponCode` 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.supportsCouponCode, null, "check that the `supportsCouponCode` is still `null` after an update");
        event.updateWith({ });
        internals.mockPaymentCoordinator.acceptPayment();
    });

    let response = await request.show();

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

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

user_activation_test(async (test) => {
    const method = validPaymentMethod();
    method.data.supportsCouponCode = true;

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

    let response = await request.show();

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

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

done();
</script>

