<!DOCTYPE html>
<title>Federated Credential Management API hosted domain tests.</title>
<link rel="help" href="https://fedidcg.github.io/FedCM">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/resources/testdriver.js"></script>
<script src="/resources/testdriver-vendor.js"></script>
<body>

<script type="module">
import {
  fedcm_test,
  request_options_with_hosted_domain,
  select_manifest,
  fedcm_get_and_select_first_account
} from './support/fedcm-helper.sub.js';

fedcm_test(async t => {
  let options = request_options_with_hosted_domain('manifest.py',
    'nomatch');
  const cred = fedcm_get_and_select_first_account(t, options);
  return promise_rejects_dom(t, "NetworkError", cred);
}, "No hosted domain matches an account.");

fedcm_test(async t => {
  const options = request_options_with_hosted_domain('manifest.py',
    'idp.example');
  const cred = await fedcm_get_and_select_first_account(t, options);
  assert_equals(cred.token, 'token');
}, "Hosted domain matches an account.");

fedcm_test(async t => {
  let options = request_options_with_hosted_domain(
    'manifest_with_two_accounts.json', 'example');
  await select_manifest(t, options);

  const cred = await fedcm_get_and_select_first_account(t, options);
  assert_equals(cred.token, 'account_id=john_doe');
}, "Hosted domain matches an account from two accounts.");

fedcm_test(async t => {
  let options = request_options_with_hosted_domain(
    'manifest_with_two_accounts.json', '*');
  await select_manifest(t, options);

  const cred = await fedcm_get_and_select_first_account(t, options);
  assert_equals(cred.token, 'account_id=john_doe');
}, "Hosted domain '*' matches an account with any hosted domain.");
  </script>
