import * as path from 'path';
import { expect } from 'chai';
import { setUpPuppeteerAndDemoPageServer, takeScreenshot } from '../../../puppeteer-tests/util';
import { ElementHandle } from 'puppeteer';

describe('autogrow-textarea-sk', () => {
  const testBed = setUpPuppeteerAndDemoPageServer(path.join(__dirname, '..', '..', 'webpack.config.ts'));

  let textarea: ElementHandle;

  beforeEach(async () => {
    await testBed.page.goto(`${testBed.baseUrl}/autogrow-textarea-sk.html`);
    await testBed.page.setViewport({ width: 800, height: 600 });
    textarea = (await testBed.page.$('textarea'))!;
  });

  it('should render the demo page', async () => {
    // Smoke test.
    expect(await testBed.page.$$('autogrow-textarea-sk')).to.have.length(2);
  });

  describe('screenshots', () => {
    it('shows the empty view', async () => {
      await takeScreenshot(testBed.page, 'infra-sk', 'autogrow-textarea-sk');
    });

    it('shows small amount of text without growth', async () => {
      await textarea.type('A\nfew\nlines don\'t grow the textarea');
      await takeScreenshot(testBed.page, 'infra-sk', 'autogrow-textarea-sk_filled');
    });
    it('shows the textarea grows', async () => {
      await textarea.type('A\n\n\nlot\n\n\n\nof lines\n\n\n\n\nhere');
      await takeScreenshot(testBed.page, 'infra-sk', 'autogrow-textarea-sk_grow');
    });
    it('shows the textarea shrinks', async () => {
      await textarea.type('Two\nLines');
      await takeScreenshot(testBed.page, 'infra-sk', 'autogrow-textarea-sk_shrink');
    });
  });
});
