import './index';

import { expect } from 'chai';
import fetchMock from 'fetch-mock';
import { $, $$ } from '../../../infra-sk/modules/dom';
import { SelectSk } from '../../../elements-sk/modules/select-sk/select-sk';
import { pageSets } from './test_data';
import { setUpElementUnderTest } from '../../../infra-sk/modules/test_util';
import { PagesetSelectorSk } from './pageset-selector-sk';

describe('pageset-selector-sk', () => {
  const factory = setUpElementUnderTest<PagesetSelectorSk>(
    'pageset-selector-sk'
  );
  // Returns a new element with the pagesets fetch complete.
  const newInstance = async (init?: (instance: PagesetSelectorSk) => void) => {
    const ele = factory(init);
    await new Promise((resolve) => setTimeout(resolve, 0));
    return ele;
  };

  let selector: PagesetSelectorSk; // Set at start of each test.
  beforeEach(() => {
    fetchMock.postOnce('begin:/_/page_sets/', pageSets);
  });

  afterEach(() => {
    //  Check all mock fetches called at least once and reset.
    expect(fetchMock.done()).to.be.true;
    fetchMock.reset();
  });

  const simulateUserToggle = () => {
    ($$('expandable-textarea-sk > button', selector) as HTMLElement).click();
  };

  // Simulates a user typing 'value' into the input element by setting its
  // value and triggering the built-in 'input' event.
  const simulateUserEnteringCustomPages = (value: string) => {
    const ele = $$('textarea', selector) as HTMLInputElement;
    ele.focus();
    ele.value = value;
    ele.dispatchEvent(
      new Event('input', {
        bubbles: true,
        cancelable: true,
      })
    );
  };

  it('loads selections', async () => {
    selector = await newInstance(undefined);
    expect($('select-sk div')).to.have.length(8);
    expect($$('.pageset-list', selector)).to.have.property('hidden', false);
    expect(selector).to.have.property('selected', '10k');
  });

  it('reflects changes to selected', async () => {
    selector = await newInstance(undefined);
    expect(selector).to.have.property('selected', '10k');
    ($$('select-sk', selector) as SelectSk).selection = 3;
    expect(selector).to.have.property('selected', 'Mobile10k');
    selector.selected = 'Dummy1k';
    expect(selector).to.have.property('selected', 'Dummy1k');
    // Invalid keys aren't honored.
    selector.selected = 'bogus key';
    expect(selector).to.have.property('selected', '');
  });

  it('filters out hideKeys options', async () => {
    selector = await newInstance((ele) => {
      ele.hideKeys = ['Mobile100k', '100k', 'Dummy1k', 'non-existant'];
    });
    expect($('select-sk div', selector)).to.have.length(5);
    // Check that options can be recovered.
    selector.hideKeys = [];
    expect($('select-sk div', selector)).to.have.length(8);
  });

  it('hides selector when custom page form expanded', async () => {
    selector = await newInstance(undefined);
    simulateUserToggle();
    expect($$('.pageset-list', selector)).to.have.property('hidden', true);
  });

  it('clears custom pages when custom page form collapsed ', async () => {
    selector = await newInstance(undefined);
    simulateUserToggle();
    simulateUserEnteringCustomPages('example.com');
    expect(selector).to.have.property('customPages', 'example.com');
    expect($$('.pageset-list', selector)).to.have.property('hidden', true);
    simulateUserToggle();
    expect($$('.pageset-list', selector)).to.have.property('hidden', false);
    expect(selector).to.have.property('customPages', '');
  });

  it('disables custom page form on disable-custom-webpages', async () => {
    selector = await newInstance((ele) => {
      ele.setAttribute('disable-custom-webpages', '');
    });
    expect(selector.querySelectorAll('expandable-textarea-sk').length).to.equal(
      0
    );
    expect(selector.querySelectorAll('select-sk').length).to.equal(1);
  });
});
