<!doctype html>
<meta charset="utf8">
<link rel="help" href="https://w3c.github.io/payment-request/#dom-paymentresponse-complete()">
<title>
  PaymentResponse.prototype.complete() method
</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>
<script src="resources/helpers.js"></script>
<script>
async function runTest({ completeWith: result }, button) {
  button.disabled = true;
  const { response, request } = await getPaymentRequestResponse();
  promise_test(async () => {
    try {
      // We .complete() as normal, using the passed test value
      const promise = response.complete(result);
      assert_true(promise instanceof Promise, "returns a promise");
      const returnedValue = await promise;
      assert_equals(
        returnedValue,
        undefined,
        "Returned value must always be undefined"
      );
      // We now call .complete() again, to force an exception
      // because [[completeCalled]] is true.
      try {
        await response.complete(result);
        assert_unreached("Expected InvalidStateError to be thrown");
      } catch (err) {
        assert_equals(
          err.code,
          DOMException.INVALID_STATE_ERR,
          "Must throw an InvalidStateError"
        );
      }
      button.innerHTML = `✅  ${button.textContent}`;
    } catch (err) {
      button.innerHTML = `❌  ${button.textContent}`;
      assert_unreached("Unexpected exception: " + err.message);
    }
  }, button.textContent.trim());
}
</script>
<ol>
  <li>
    <button id="button1">
      If the value of the internal slot [[completeCalled]] is true,
      reject promise with an "InvalidStateError" DOMException.
    </button>
  </li>
  <li>
    <button id="button2">
      Passing no argument defaults to "unknown",
      eventually closing the sheet and doesn't throw.
    </button>
  </li>
  <li>
    <button id="button3">
      Passing "success" eventually closes the sheet and doesn't throw.
    </button>
  </li>
  <li>
    <button id="button4">
      Passing "fail" eventually closes the sheet and doesn't throw.
    </button>
  </li>
</ol>
<script>
    async function runTests()
    {
        await runTest({completeWith: "success"}, document.getElementById("button1"));
        await runTest({completeWith: "unknown"}, document.getElementById("button2"));
        await runTest({completeWith: "success"}, document.getElementById("button3"));
        await runTest({completeWith: "fail"}, document.getElementById("button4"));
        done();
    }
    runTests();
</script>
