import './index';
import fetchMock from 'fetch-mock';
import { eventPromise, setUpElementUnderTest } from '../../../infra-sk/modules/test_util';
import { BulkTriageSk } from './bulk-triage-sk';
import { BulkTriageSkPO } from './bulk-triage-sk_po';
import { examplePageData, exampleAllData, expectedPageDataTriageRequest, expectedAllDataTriageRequest } from './test_data';
import { expect } from 'chai';

describe('bulk-triage-sk', () => {
  const newInstance = setUpElementUnderTest<BulkTriageSk>('bulk-triage-sk');

  let bulkTriageSk: BulkTriageSk;
  let bulkTriageSkPO: BulkTriageSkPO;

  beforeEach(() => {
    bulkTriageSk = newInstance();
    bulkTriageSk.currentPageDigests = examplePageData;
    bulkTriageSk.allDigests = exampleAllData;
    bulkTriageSkPO = new BulkTriageSkPO(bulkTriageSk);
  });

  it('shows the correct digest counts', async () => {
    expect(await bulkTriageSkPO.getTriageBtnLabel()).to.equal('Triage 3 digests as closest');
    expect(await bulkTriageSkPO.getTriageAllCheckboxLabel()).to.equal('Triage all 6 digests');
  });

  it('does not show a changelist ID by default', async () => {
    expect(await bulkTriageSkPO.isAffectedChangelistIdVisible()).to.be.false;
  });

  it('show the changelist ID when provided', async () => {
    bulkTriageSk.changeListID = '123';
    expect(await bulkTriageSkPO.isAffectedChangelistIdVisible()).to.be.true;
    expect(await bulkTriageSkPO.getAffectedChangelistId()).to.equal('This affects Changelist 123.');
  });

  it('defaults to bulk-triaging to closest', async () => {
    expect(await bulkTriageSkPO.isClosestBtnSelected()).to.be.true;
    expect(bulkTriageSk.value).to.equal('closest');
  });

  it('has value respond to button clicks', async () => {
    await bulkTriageSkPO.clickUntriagedBtn();
    expect(await bulkTriageSkPO.isUntriagedBtnSelected()).to.be.true;
    expect(bulkTriageSk.value).to.equal('untriaged');

    await bulkTriageSkPO.clickPositiveBtn();
    expect(await bulkTriageSkPO.isPositiveBtnSelected()).to.be.true;
    expect(bulkTriageSk.value).to.equal('positive');

    await bulkTriageSkPO.clickNegativeBtn();
    expect(await bulkTriageSkPO.isNegativeBtnSelected()).to.be.true;
    expect(bulkTriageSk.value).to.equal('negative');

    await bulkTriageSkPO.clickClosestBtn();
    expect(await bulkTriageSkPO.isClosestBtnSelected()).to.be.true;
    expect(bulkTriageSk.value).to.equal('closest');
  });

  it('emits a bulk_triage_cancelled event when the cancel button is clicked', async () => {
    const cancelEvent = eventPromise('bulk_triage_cancelled', 100);
    await bulkTriageSkPO.clickCancelBtn();
    await cancelEvent;
  });

  describe('RPC requests', () => {
    afterEach(() => {
      expect(fetchMock.done()).to.be.true; // All mock RPCs called at least once.
      fetchMock.reset();
    });

    it('POSTs for just this page of results', async () => {
      fetchMock.post('/json/v1/triage', 200, {body: expectedPageDataTriageRequest});

      const finishedPromise = eventPromise('bulk_triage_finished');
      await bulkTriageSkPO.clickTriageBtn();
      await finishedPromise;
    });

    it('POSTs for all results', async () => {
      bulkTriageSk.changeListID = 'someCL';
      bulkTriageSk.crs = 'gerrit';

      fetchMock.post('/json/v1/triage', 200, {body: expectedAllDataTriageRequest});

      await bulkTriageSkPO.clickTriageAllCheckbox();

      const finishedPromise = eventPromise('bulk_triage_finished');
      bulkTriageSkPO.clickTriageBtn();
      await finishedPromise;
    });
  });
});
