<!DOCTYPE html>
<link rel="help" href="https://github.com/WICG/WebOTP">
<title>Tests OTPCredential</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script type="module">
import {Status, expectOTPRequest} from './support/otpcredential-helper.js';

promise_test(async t => {
  await expectOTPRequest().andReturn(
      () => ({status: Status.SUCCESS, otp: "ABC"}));

  let cred = await navigator.credentials.get({otp: {transport: ["sms"]}});

  assert_equals(cred.code, "ABC");
}, 'Basic usage');

promise_test(async t => {
  await expectOTPRequest().andReturn(
      () => ({status: Status.SUCCESS, otp: "ABC"}));
  await expectOTPRequest().andReturn(
      () => ({status: Status.SUCCESS, otp: "ABC2"}));

  let sms1 = navigator.credentials.get({otp: {transport: ["sms"]}});
  let sms2 = navigator.credentials.get({otp: {transport: ["sms"]}});

  let cred2 = await sms2;
  let cred1 = await sms1;

  assert_equals(cred1.code, "ABC");
  assert_equals(cred2.code, "ABC2");
}, 'Handle multiple requests in different order.');

promise_test(async t => {
  await expectOTPRequest().andReturn(() => ({status: Status.CANCELLED}));
  await expectOTPRequest().andReturn(
      () => ({status: Status.SUCCESS, otp: "success"}));

  let cancelledRequest = navigator.credentials.get({otp: {transport: ["sms"]}});
  let successfulCred =
      await navigator.credentials.get({otp: {transport: ["sms"]}});

  assert_equals(successfulCred.code, "success");

  try {
    await cancelledRequest;
    assert_unreached('Expected AbortError to be thrown.');
  } catch (error) {
    assert_equals(error.name, "AbortError");
  }
}, 'Handle multiple requests with success and error.');

promise_test(async t => {
  await expectOTPRequest().andReturn(() => ({status: Status.CANCELLED}));

  await promise_rejects_dom(t, 'AbortError', navigator.credentials.get(
    {otp: {transport: ["sms"]}}));
}, 'Deal with cancelled requests');

promise_test(async t => {
  const controller = new AbortController();
  const signal = controller.signal;

  controller.abort();
  await promise_rejects_dom(t, 'AbortError', navigator.credentials.get(
    {otp: {transport: ["sms"]}, signal: signal}));
}, 'Should abort request');

</script>
