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 { priorities } from './test_data';
import { setUpElementUnderTest } from '../../../infra-sk/modules/test_util';
import { TaskPrioritySk } from './task-priority-sk';

describe('task-priority-sk', () => {
  const factory = setUpElementUnderTest<TaskPrioritySk>('task-priority-sk');
  // Returns a new element with the pagesets fetch complete.
  const newInstance = async () => {
    const ele = factory();
    await new Promise((resolve) => setTimeout(resolve, 0));
    return ele;
  };

  let selector; // Set at start of each test.
  beforeEach(() => {
    fetchMock.getOnce('begin:/_/task_priorities/', priorities);
  });

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

  it('loads selections', async () => {
    selector = await newInstance();
    expect($('select-sk div', selector)).to.have.length(3);
    expect(selector).to.have.property('priority', '100');
  });

  it('reflects changes to selection', async () => {
    selector = await newInstance();
    ($$('select-sk', selector) as SelectSk).selection = 2;
    expect(selector).to.have.property('priority', '110');
    selector.priority = '90';
    expect(selector).to.have.property('priority', '90');
    expect($$('select-sk', selector)).to.have.property('selection', 0);
  });
});
