import { expect } from 'chai';
import { loadCachedTestBed, takeScreenshot, TestBed } from '../../../puppeteer-tests/util';

describe('blamelist-panel-sk', () => {
  let testBed: TestBed;
  before(async () => {
    testBed = await loadCachedTestBed();
  });

  beforeEach(async () => {
    await testBed.page.goto(testBed.baseUrl);
  });

  describe('screenshots', async () => {
    it('should show a single commit', async () => {
      const blamelistPanelSk = await testBed.page.$('#single_commit');
      await takeScreenshot(blamelistPanelSk!, 'gold', 'blamelist-panel-sk');
      expect(await testBed.page.$$('#single_commit tr')).to.have.length(1);
    });

    it('should show a single CL commit', async () => {
      const blamelistPanelSk = await testBed.page.$('#single_cl_commit');
      await takeScreenshot(blamelistPanelSk!, 'gold', 'blamelist-panel-sk_cl-commit');
      expect(await testBed.page.$$('#single_cl_commit tr')).to.have.length(1);
    });

    it('should show some commits', async () => {
      const blamelistPanelSk = await testBed.page.$('#some_commits');
      await takeScreenshot(blamelistPanelSk!, 'gold', 'blamelist-panel-sk_some-commits');
      expect(await testBed.page.$$('#some_commits tr')).to.have.length(3);
    });

    it('should truncate many commits', async () => {
      const blamelistPanelSk = await testBed.page.$('#many_commits');
      await takeScreenshot(blamelistPanelSk!, 'gold', 'blamelist-panel-sk_many-commits');
      expect(await testBed.page.$$('#many_commits tr')).to.have.length(15); // maxCommitsToDisplay
    });

    it('should show non-standard commits', async () => {
      const blamelistPanelSk = await testBed.page.$('#non_standard_commits');
      await takeScreenshot(blamelistPanelSk!, 'gold', 'blamelist-panel-sk_non-standard-commits');
      expect(await testBed.page.$$('#non_standard_commits tr')).to.have.length(2);
    });
  });

  describe('urls', async () => {
    it('should have a different URL for CL commits', async () => {
      const masterBranchURL = await testBed.page.$eval(
        '#single_commit table a',
        (e: Element) => (e as HTMLAnchorElement).href,
      );
      expect(masterBranchURL).to.equal(
        'https://github.com/example/example/commit/dded3c7506efc5635e60ffb7a908cbe8f1f028f1',
      );

      const changeListURL = await testBed.page.$eval(
        '#single_cl_commit table a',
        (e: Element) => (e as HTMLAnchorElement).href,
      );
      expect(changeListURL).to.equal('https://skia-review.googlesource.com/12345');
    });

    it('should have a link to the full source blamelist', async () => {
      const manyCommitsURL = await testBed.page.$eval(
        '#many_commits .full_range a',
        (e: Element) => (e as HTMLAnchorElement).href,
      );
      expect(manyCommitsURL).to.equal(
        'https://github.com/example/example/compare/667edf14ad72966ec36aa6cd705b98cb7d7eee28...dded3c7506efc5635e60ffb7a908cbe8f1f028f1',
      );

      const someCommitsURL = await testBed.page.$eval(
        '#some_commits .full_range a',
        (e: Element) => (e as HTMLAnchorElement).href,
      );
      expect(someCommitsURL).to.equal(
        'https://github.com/example/example/compare/9145f784f3261f227846e5b08dc2691a888b113c...dded3c7506efc5635e60ffb7a908cbe8f1f028f1',
      );
    });
  });
});
