text: 'use strict';
  
  const path = require('path');
  const execa = require('execa');
  const yargs = require('yargs');
  const { cleanTestApp, generateTestApp } = require('./helpers/test-app-generator');
  
  const appName = 'testApp';
  
  const databases = {
    postgres: {
      client: 'postgres',
      connection: {
        host: '127.0.0.1',
        port: 5432,
        database: 'strapi_test',
        username: 'strapi',
        password: 'strapi',
      },
    },
    mysql: {
      client: 'mysql',
      connection: {
        host: '127.0.0.1',
        port: 3306,
        database: 'strapi_test',
        username: 'strapi',
        password: 'strapi',
      },
    },
    sqlite: {
      client: 'sqlite',
      connection: {
        filename: './tmp/data.db',
      },
      useNullAsDefault: true,
    },
  };
  
  const runAllTests = async args => {
    return execa('yarn', ['test:e2e', ...args], {
      stdio: 'inherit',
      cwd: path.resolve(__dirname, '..'),
      env: {
        FORCE_COLOR: 1,
      },
    });
  };
  
  const main = async (database, args) => {
    try {
      await cleanTestApp(appName);
      await generateTestApp({ appName, database });
  
      await runAllTests(args).catch(() => {
        process.stdout.write('Tests failed\n', () => {
          process.exit(1);
        });
      });
  
      process.exit(0);
    } catch (error) {
      console.error(error);
      process.stdout.write('Tests failed\n', () => {
        process.exit(1);
      });
    }
  };
  
  yargs
    .command(
      '$0',
      'run end to end tests',
      yargs => {
        yargs.option('database', {
          alias: 'db',
          describe: 'choose a database',
          choices: Object.keys(databases),
          default: 'sqlite',
        });
      },
      argv => {
        const { database, _: args } = argv;
  
        main(databases[database], args);
      }
    )
    .help().argv;
  