import path from 'path';
import fs from 'fs';
import * as hc from '@actions/http-client';

const HTTP_CLIENT_OPTIONS = {allowRetries: true, maxRetries: 10} as const;
const TEST_TIMEOUT = 30000;

describe('Dotnet installation scripts tests', () => {
  it(
    'Uses an up to date bash download script',
    async () => {
      const httpCallbackClient = new hc.HttpClient(
        'setup-dotnet-test',
        [],
        HTTP_CLIENT_OPTIONS
      );
      const response: hc.HttpClientResponse = await httpCallbackClient.get(
        'https://dot.net/v1/dotnet-install.sh'
      );
      expect(response.message.statusCode).toBe(200);
      const upToDateContents: string = await response.readBody();
      const currentContents: string = fs
        .readFileSync(
          path.join(__dirname, '..', 'externals', 'install-dotnet.sh')
        )
        .toString();
      expect(normalizeFileContents(currentContents)).toBe(
        normalizeFileContents(upToDateContents)
      );
    },
    TEST_TIMEOUT
  );

  it(
    'Uses an up to date powershell download script',
    async () => {
      const httpCallbackClient = new hc.HttpClient(
        'setup-dotnet-test',
        [],
        HTTP_CLIENT_OPTIONS
      );
      const response: hc.HttpClientResponse = await httpCallbackClient.get(
        'https://dot.net/v1/dotnet-install.ps1'
      );
      expect(response.message.statusCode).toBe(200);
      const upToDateContents: string = await response.readBody();
      const currentContents: string = fs
        .readFileSync(
          path.join(__dirname, '..', 'externals', 'install-dotnet.ps1')
        )
        .toString();
      expect(normalizeFileContents(currentContents)).toBe(
        normalizeFileContents(upToDateContents)
      );
    },
    TEST_TIMEOUT
  );
});

function normalizeFileContents(contents: string): string {
  return contents
    .trim()
    .replace(new RegExp('\r\n', 'g'), '\n')
    .replace(new RegExp('\r', 'g'), '\n');
}