import './index';

import sinon from 'sinon';
import { expect } from 'chai';
import fetchMock from 'fetch-mock';
import { $ } from '../../../infra-sk/modules/dom';
import {
  eventPromise,
  setUpElementUnderTest,
} from '../../../infra-sk/modules/test_util';
import { TreeStatus, TreeStatusSk } from './tree-status-sk';
import {
  treeStatusResp,
  generalRoleResp,
  gpuRoleResp,
  androidRoleResp,
  infraRoleResp,
} from './test_data';

describe('tree-status-sk', () => {
  const newInstance = setUpElementUnderTest<TreeStatusSk>('tree-status-sk');

  let element: TreeStatusSk;
  const createElement = async () => {
    sinon.stub(Notification, 'permission').value('denied');
    fetchMock.get('https://test-tree-status/test-repo/current', treeStatusResp);
    fetchMock.get(
      'https://chrome-ops-rotation-proxy.appspot.com/current/grotation:skia-gardener',
      generalRoleResp
    );
    fetchMock.get(
      'https://chrome-ops-rotation-proxy.appspot.com/current/grotation:skia-gpu-gardener',
      gpuRoleResp
    );
    fetchMock.get(
      'https://chrome-ops-rotation-proxy.appspot.com/current/grotation:skia-android-gardener',
      androidRoleResp
    );
    fetchMock.get(
      'https://chrome-ops-rotation-proxy.appspot.com/current/grotation:skia-infra-gardener',
      infraRoleResp
    );
    Date.now = () => 1600883976659;
    element = newInstance((el) => {
      el.baseURL = 'https://test-tree-status';
      el.repo = 'test-repo';
    });
    await fetchMock.flush(true);
  };

  afterEach(() => {
    expect(fetchMock.done()).to.be.true;
    fetchMock.reset();
    sinon.restore();
  });

  describe('displays', () => {
    it('status, user, and time', async () => {
      await createElement();
      expect(
        $('span', element).map((e) => (e as HTMLElement).innerText)
      ).to.deep.equal(['No longer Broken! ', '[alice 2w ago]']);
    });
  });

  describe('triggers', () => {
    it('tree-status-update event', async () => {
      const ep = eventPromise('tree-status-update');
      await createElement();
      const treeStatus = ((await ep) as CustomEvent).detail as TreeStatus;
      const rotations = treeStatus.rotations;
      expect(rotations).to.have.length(4);
      expect(rotations.map((r) => r.role)).to.deep.equal([
        'Skia',
        'GPU',
        'Android',
        'Infra',
      ]);
      expect(rotations.map((r) => r.name)).to.deep.equal([
        'alice',
        'bob',
        'christy',
        'dan',
      ]);
      expect(treeStatus.status).to.deep.equal(treeStatusResp);
    });
  });
});
