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

    let response = await request.show();

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

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

user_activation_test(async (test) => {
    const method = validPaymentMethod();
    method.data.shippingContactEditingMode = "enabled";

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

    let response = await request.show();

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

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

done();
</script>

