/*!
 * @license
 * Copyright 2020 The Go Authors. All rights reserved.
 * Use of this source code is governed by a BSD-style
 * license that can be found in the LICENSE file.
 */

import { ExpandableRowsTableController } from './table';

describe('ExpandableRowsTableController', () => {
  let table: HTMLTableElement;
  let toggle1: HTMLButtonElement;
  let toggle2: HTMLButtonElement;
  let toggleAll: HTMLButtonElement;

  beforeEach(() => {
    document.body.innerHTML = `
      <div>
        <button class="js-toggleAll">Expand all</button>
      </div>
      <table class="js-table">
        <tbody>
          <tr>
            <th>Toggle</th>
            <th>Foo</th>
            <th>Bar</th>
          </tr>
          <tr>
            <td></td>
            <td data-id="label-id-1">Hello World</td>
            <td>Simple row with no toggle or hidden elements</td>
          </tr>
          <tr data-aria-controls="hidden-row-id-1 hidden-row-id-2">
            <td>
              <button
                type="button"
                aria-expanded="false"
                aria-label="2 more from"
                data-aria-controls="hidden-row-id-1 hidden-row-id-2"
                data-aria-labelledby="toggle-id-1 label-id-2"
                data-id="toggle-id-1"
              >
                +
              </button>
            </td>
            <td data-id="label-id-2">
              <span>Baz</span>
            </td>
            <td></td>
          </tr>
          <tr data-id="hidden-row-id-1">
            <td></td>
            <td>First hidden row</td>
            <td></td>
          </tr>
          <tr data-id="hidden-row-id-2">
            <td></td>
            <td>Second hidden row</td>
            <td></td>
          </tr>
          <tr data-aria-controls="hidden-row-id-3">
            <td>
              <button
                type="button"
                aria-expanded="false"
                aria-label="2 more from"
                data-aria-controls="hidden-row-id-3"
                data-aria-labelledby="toggle-id-2 label-id-3"
                data-id="toggle-id-2"
              >
                +
              </button>
            </td>
            <td data-id="label-id-3">
              <span>Baz</span>
            </td>
            <td></td>
          </tr>
          <tr data-id="hidden-row-id-3">
            <td></td>
            <td>First hidden row</td>
            <td></td>
          </tr>
        </tbody>
      </table>
    `;
    table = document.querySelector<HTMLTableElement>('.js-table');
    toggleAll = document.querySelector<HTMLButtonElement>('.js-toggleAll');
    new ExpandableRowsTableController(table, toggleAll);
    toggle1 = document.querySelector<HTMLButtonElement>('#toggle-id-1');
    toggle2 = document.querySelector<HTMLButtonElement>('#toggle-id-2');
  });

  afterEach(() => {
    document.body.innerHTML = '';
  });

  it('sets data-aria-* and data-id attributes to regular html attributes', () => {
    expect(document.querySelector('#label-id-1')).toBeTruthy();
    expect(
      document.querySelector('[aria-controls="hidden-row-id-1 hidden-row-id-2"]'),
    ).toBeTruthy();
    expect(document.querySelector('[aria-labelledby="toggle-id-1 label-id-2"]')).toBeTruthy();
    expect(document.querySelector('#toggle-id-1')).toBeTruthy();
    expect(document.querySelector('#label-id-2')).toBeTruthy();
    expect(document.querySelector('#hidden-row-id-1')).toBeTruthy();
    expect(document.querySelector('#hidden-row-id-2')).toBeTruthy();
  });

  it('hides rows with unexpanded toggles', () => {
    expect(document.querySelector('#hidden-row-id-1').classList).toContain('hidden');
    expect(document.querySelector('#hidden-row-id-2').classList).toContain('hidden');
  });

  it('shows rows with expanded toggles', () => {
    toggleAll.click();
    expect(document.querySelector('#hidden-row-id-1').classList).toContain('visible');
    expect(document.querySelector('#hidden-row-id-2').classList).toContain('visible');
  });

  it('expands rows when entering text search', () => {
    document.dispatchEvent(new KeyboardEvent('keydown', { key: 'f', ctrlKey: true }));
    expect(document.querySelector('#hidden-row-id-1').classList).toContain('visible');
    expect(document.querySelector('#hidden-row-id-2').classList).toContain('visible');
  });

  it('toggle expands and collapses all elements', async () => {
    jest.useFakeTimers();
    toggleAll.click();
    jest.runAllTimers();
    expect(document.querySelector('#hidden-row-id-1').classList).toContain('visible');
    expect(document.querySelector('#hidden-row-id-2').classList).toContain('visible');
    expect(toggleAll.innerText).toBe('Collapse all');
    toggleAll.click();
    jest.runAllTimers();
    expect(document.querySelector('#hidden-row-id-1').classList).toContain('hidden');
    expect(document.querySelector('#hidden-row-id-2').classList).toContain('hidden');
    expect(toggleAll.innerText).toBe('Expand all');
  });

  it('toggle changes text only when all items expanded', () => {
    jest.useFakeTimers();
    toggle1.click();
    jest.runAllTimers();
    expect(toggleAll.innerText).toBe('Expand all');
    toggle2.click();
    jest.runAllTimers();
    expect(toggleAll.innerText).toBe('Collapse all');
  });
});
