<!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="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="helpers.js"></script>
<script>
async function runManualTest({ completeWith: result }, button) {
  button.disabled = true;
  const { response, request } = await getPaymentRequestResponse();
  promise_test(async t => {
    let completePromise;
    let invalidComplete;
    let afterComplete;
    try {
      // We .complete() as normal, using the passed test value
      completePromise = response.complete(result);
      assert_true(completePromise instanceof Promise, "returns a promise");
      // Immediately calling complete() again yields a rejected promise.
      invalidComplete = response.complete(result);
      await promise_rejects_dom(t, "InvalidStateError", invalidComplete);
      // but the original promise is unaffected
      const returnedValue = await completePromise;
      assert_equals(
        returnedValue,
        undefined,
        "Returned value must always be undefined"
      );
      // We now call .complete() again, to force an exception
      // because [[complete]] is true.
      afterComplete = response.complete(result);
      await promise_rejects_dom(t, "InvalidStateError", afterComplete);
      button.innerHTML = `✅  ${button.textContent}`;
    } catch (err) {
      button.innerHTML = `❌  ${button.textContent}`;
      assert_unreached("Unexpected exception: " + err.message);
    }
    const allPromises = new Set([
      completePromise,
      invalidComplete,
      afterComplete,
    ]);
    assert_equals(
      allPromises.size,
      3,
      "Calling complete() multiple times is always a new object."
    );
  }, button.textContent.trim());
}
</script>

<h2>
    Manual Tests for PaymentResponse.complete() - Please run in order!
</h2>
<p>
  Click on each button in sequence from top to bottom without refreshing the page.
  Each button will bring up the Payment Request UI window.
</p>
<p>
  When presented with the payment sheet, use any credit card select to "Pay".
  Also confirm any prompts that come up.
</p>
<ol>
  <li>
    <button onclick="runManualTest({completeWith: 'success'}, this)">
      If the value of the internal slot [[completeCalled]] is true,
      reject promise with an "InvalidStateError" DOMException.
    </button>
  </li>
  <li>
    <button onclick="runManualTest({completeWith: undefined}, this)">
      Passing no argument defaults to "unknown",
      eventually closing the sheet and doesn't throw.
    </button>
  </li>
  <li>
    <button onclick="runManualTest({completeWith: 'success'}, this)">
      Passing "success" eventually closes the sheet and doesn't throw.
    </button>
  </li>
  <li>
    <button onclick="runManualTest({completeWith: 'fail'}, this)">
      Passing "fail" eventually closes the sheet and doesn't throw.
    </button>
  </li>
  <li>
    <button onclick="runManualTest({completeWith: 'unknown'}, this)">
      Passing "unknown" eventually closes the sheet and doesn't throw.
    </button>
  </li>
  <li>
    <button onclick="done()">Done!</button>
  </li>
</ol>
<small>
  If you find a buggy test, please <a href="https://github.com/web-platform-tests/wpt/issues">file a bug</a>
  and tag one of the <a href="https://github.com/web-platform-tests/wpt/blob/master/payment-request/META.yml">suggested reviewers</a>.
</small>
