// Copyright 2023 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

import * as Models from '../models/models.js';

import * as Converters from './converters.js';

describe('PuppeteerConverter', () => {
  it('should stringify a flow', async () => {
    const converter = new Converters.PuppeteerConverter.PuppeteerConverter(
        '  ',
    );
    const [result, sourceMap] = await converter.stringify({
      title: 'test',
      steps: [{type: Models.Schema.StepType.Scroll, selectors: [['.cls']]}],
    });
    const expected = `const puppeteer = require('puppeteer'); // v23.0.0 or later

(async () => {
  const browser = await puppeteer.launch();
  const page = await browser.newPage();
  const timeout = 5000;
  page.setDefaultTimeout(timeout);

  {
    const targetPage = page;
    await puppeteer.Locator.race([
      targetPage.locator('.cls')
    ])
      .setTimeout(timeout)
      .scroll({ scrollTop: undefined, scrollLeft: undefined});
  }

  await browser.close();`;
    const actual = result.substring(0, expected.length);
    assert.strictEqual(actual, expected, `Unexpected start of generated result:\n${actual}`);
    assert.deepEqual(sourceMap, [1, 8, 8]);
  });

  it('should stringify a step', async () => {
    const converter = new Converters.PuppeteerConverter.PuppeteerConverter(
        '  ',
    );
    const result = await converter.stringifyStep({
      type: Models.Schema.StepType.Scroll,
    });
    assert.strictEqual(
        result,
        `{
  const targetPage = page;
  await targetPage.evaluate((x, y) => { window.scroll(x, y); }, undefined, undefined)
}
`,
    );
  });

  it('should stringify a flow for Firefox', async () => {
    const converter = new Converters.PuppeteerFirefoxConverter.PuppeteerFirefoxConverter(
        '  ',
    );
    const [result, sourceMap] = await converter.stringify({
      title: 'test',
      steps: [{type: Models.Schema.StepType.Scroll, selectors: [['.cls']]}],
    });
    const expected = `const puppeteer = require('puppeteer'); // v23.0.0 or later

(async () => {
  const browser = await puppeteer.launch({browser: 'firefox'});
  const page = await browser.newPage();
  const timeout = 5000;
  page.setDefaultTimeout(timeout);

  {
    const targetPage = page;
    await puppeteer.Locator.race([
      targetPage.locator('.cls')
    ])
      .setTimeout(timeout)
      .scroll({ scrollTop: undefined, scrollLeft: undefined});
  }

  await browser.close();`;
    const actual = result.substring(0, expected.length);
    assert.strictEqual(actual, expected, `Unexpected start of generated result:\n${actual}`);
    assert.deepEqual(sourceMap, [1, 8, 8]);
  });
});
