/**
 * Copyright Microsoft Corporation. All rights reserved.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

import { test, expect } from './playwright-test-fixtures';

test('should list files', async ({ runListFiles }) => {
  const result = await runListFiles({
    'playwright.config.ts': `
      module.exports = { projects: [{ name: 'foo' }, { name: 'bar' }] };
    `,
    'a.test.js': ``
  });
  expect(result.exitCode).toBe(0);

  const data = JSON.parse(result.output);
  expect(data).toEqual({
    projects: [
      {
        name: 'foo',
        testDir: expect.stringContaining('list-files-should-list-files-playwright-test'),
        use: {},
        files: [
          expect.stringContaining('a.test.js')
        ]
      },
      {
        name: 'bar',
        testDir: expect.stringContaining('list-files-should-list-files-playwright-test'),
        use: {},
        files: [
          expect.stringContaining('a.test.js')
        ]
      }
    ]
  });
});

test('should include testIdAttribute', async ({ runListFiles }) => {
  const result = await runListFiles({
    'playwright.config.ts': `
      module.exports = {
        use: { testIdAttribute: 'myid' }
      };
    `,
    'a.test.js': ``
  });
  expect(result.exitCode).toBe(0);

  const data = JSON.parse(result.output);
  expect(data).toEqual({
    projects: [
      {
        name: '',
        testDir: expect.stringContaining('list-files-should-include-testIdAttribute-playwright-test'),
        use: {
          testIdAttribute: 'myid'
        },
        files: [
          expect.stringContaining('a.test.js')
        ]
      },
    ]
  });
});

test('should report error', async ({ runListFiles }) => {
  const result = await runListFiles({
    'playwright.config.ts': `
      const a = 1;
      a = 2;
    `,
    'a.test.js': ``
  });
  expect(result.exitCode).toBe(0);

  const data = JSON.parse(result.output);
  expect(data).toEqual({
    error: {
      location: {
        file: expect.stringContaining('playwright.config.ts'),
        line: 3,
        column: 8,
      },
      message: 'Assignment to constant variable.',
      stack: expect.stringContaining('TypeError: Assignment to constant variable.'),
    }
  });
});
