1
/* eslint-disable no-console */
2
import axios from 'axios';
3
import { spawn, spawnSync } from 'child_process';
4
import knex from 'knex';
5
import { Listr } from 'listr2';
6
import { clone } from 'lodash-es';
7
import fs from 'node:fs/promises';
8
import { join } from 'node:path';
9
import config, { getUrl, paths } from '../common/config';
10
import vendors from '../common/get-dbs-to-test';
11
import { USER } from '../common/variables';
12
import { awaitDatabaseConnection, awaitDirectusConnection } from '../utils/await-connection';
13
import global from './global';
15
export async function setup() {
16
console.log(`👮♀️ Starting tests!\n`);
20
title: 'Bootstrap databases and start servers',
23
vendors.map((vendor) => {
25
title: config.names[vendor],
27
const database = knex(config.knexConfig[vendor]);
28
await awaitDatabaseConnection(database, config.knexConfig[vendor].waitTestSQL);
30
if (vendor === 'sqlite3') {
31
await fs.writeFile(join(paths.cwd, 'test.db'), '');
34
const bootstrap = spawnSync('node', [paths.cli, 'bootstrap'], {
36
env: config.envs[vendor],
39
if (bootstrap.status !== null && bootstrap.status !== 0) {
41
`Directus-${vendor} bootstrap failed (${bootstrap.status}): \n ${bootstrap.stderr.toString()}`,
45
await database.migrate.latest();
46
await database.seed.run();
47
await database.destroy();
49
if (!process.env['TEST_LOCAL']) {
50
const server = spawn('node', [paths.cli, 'start'], {
52
env: config.envs[vendor],
55
global.directus[vendor] = server;
56
let serverOutput = '';
57
server.stdout.setEncoding('utf8');
59
server.stdout.on('data', (data) => {
60
serverOutput += data.toString();
63
server.stderr.on('data', (data) => {
64
console.log(data.toString());
67
server.on('exit', async (code) => {
68
if (process.env['TEST_SAVE_LOGS']) {
69
await fs.writeFile(join(paths.cwd, `server-log-${vendor}.txt`), serverOutput);
73
throw new Error(`Directus-${vendor} server failed (${code}): \n ${serverOutput}`);
76
// Give the server some time to start
77
await awaitDirectusConnection(Number(config.envs[vendor].PORT));
79
// Set up separate directus instance without system cache
80
const noCacheEnv = clone(config.envs[vendor]);
81
noCacheEnv['CACHE_SCHEMA'] = 'false';
82
noCacheEnv['PORT'] = String(parseInt(noCacheEnv.PORT) + 50);
83
const serverNoCache = spawn('node', [paths.cli, 'start'], { cwd: paths.cwd, env: noCacheEnv });
84
global.directusNoCache[vendor] = serverNoCache;
85
let serverNoCacheOutput = '';
86
serverNoCache.stdout.setEncoding('utf8');
88
serverNoCache.stdout.on('data', (data) => {
89
serverNoCacheOutput += data.toString();
92
serverNoCache.on('exit', async (code) => {
93
if (process.env['TEST_SAVE_LOGS']) {
94
await fs.writeFile(join(paths.cwd, `server-log-${vendor}-no-cache.txt`), serverNoCacheOutput);
98
throw new Error(`Directus-${vendor}-no-cache server failed (${code}): \n ${serverNoCacheOutput}`);
102
// Give the server some time to start
103
await awaitDirectusConnection(Number(noCacheEnv['PORT']));
108
{ concurrent: true, rendererOptions: { collapseErrors: false } },
113
title: 'Test server connectivity',
115
for (const vendor of vendors) {
117
const serverUrl = getUrl(vendor);
119
const response = await axios.get(
120
`${serverUrl}/items/tests_flow_data?access_token=${USER.TESTS_FLOW.TOKEN}`,
123
if (response.status === 200) {
124
process.env['serverUrl'] = serverUrl;
132
if (!process.env['serverUrl']) {
133
throw new Error('Unable to connect to any Directus server');
140
for (const server of Object.values(global.directus)) {
144
for (const serverNoCache of Object.values(global.directusNoCache)) {
145
serverNoCache?.kill();
148
throw new Error(reason);
154
export async function teardown() {
156
await fs.unlink('sequencer-data.json');
161
if (!process.env['TEST_LOCAL']) {
164
title: 'Stop Directus servers',
167
vendors.map((vendor) => {
169
title: config.names[vendor]!,
171
const directus = global.directus[vendor];
174
const directusNoCache = global.directusNoCache[vendor];
175
directusNoCache?.kill();
179
{ concurrent: true, exitOnError: false },
188
console.log(`👮♀️ Tests complete!\n`);