// Copyright 2019 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

import axe from 'axe-core';
import userEvent from '@testing-library/user-event';
import {fireEvent} from '@testing-library/react';

// TODO(seanmccullough): Move this into crdx/chopsui-npm if we decide this
// is worth using in other projects.

/**
 * @param {HTMLElement} element The element to audit accessibility for.
 */
export async function auditA11y(element) {
  // Performance tip: try restricting the analysis using
  // https://github.com/dequelabs/axe-core/blob/develop/doc/API.md#use-resulttypes
  const options = {};

  // Adjust this set to make tests more/less permissible.
  const reportImpact = new Set(['critical', 'serious', 'moderate', 'minor']);
  const results = await axe.run(element, options);

  if (results.violations.length == 0) {
    return;
  }

  const msgs = ['Accessibility violations:'];
  results.violations.forEach((result) => {
    if (reportImpact.has(result.impact)) {
      msgs.push(`\n[${result.impact}] ${result.help}`);
      for (const node of result.nodes) {
        if (node.failureSummary) {
          msgs.push(node.failureSummary);
        }
        msgs.push(node.html);
      }
      msgs.push('---');
    }
  });

  throw new Error(msgs.join('\n'));
}

/**
 * Types text into an input field and presses Enter.
 * @param {HTMLInputElement} input The input field to enter text in.
 * @param {string} value The text to enter in the input field.
 */
export function enterInput(input, value) {
  userEvent.clear(input);

  userEvent.type(input, value);

  fireEvent.keyDown(input, {key: 'Enter', code: 'Enter'});
}
