mirror of
https://github.com/directus/directus.git
synced 2026-02-05 13:04:54 -05:00
* First start on test setup * Setup e2e runner framework * Use prepublishOnly for docs build * Setup docker-based e2e test runner * Spacing * Setup db-getter + config * Build image in Dockerode, pull images if needed * Fix waiting for DB, run test for each running instance * Get tests running per vendor * Temp remove oracle * Close awaiting connections in between
259 lines
6.4 KiB
TypeScript
259 lines
6.4 KiB
TypeScript
import Dockerode, { ContainerSpec } from 'dockerode';
|
|
import knex, { Knex } from 'knex';
|
|
import { awaitDatabaseConnection, awaitDirectusConnection } from './utils/await-connection';
|
|
import Listr, { ListrTask } from 'listr';
|
|
import { getDBsToTest } from '../get-dbs-to-test';
|
|
import config from '../config';
|
|
import globby from 'globby';
|
|
import path from 'path';
|
|
|
|
declare module global {
|
|
let databaseContainers: { vendor: string; container: Dockerode.Container }[];
|
|
let directusContainers: { vendor: string; container: Dockerode.Container }[];
|
|
let knexInstances: { vendor: string; knex: Knex }[];
|
|
}
|
|
|
|
const docker = new Dockerode();
|
|
|
|
export default async () => {
|
|
console.log('\n\n');
|
|
|
|
console.log(`👮♀️ Starting tests!\n`);
|
|
|
|
global.databaseContainers = [];
|
|
global.directusContainers = [];
|
|
global.knexInstances = [];
|
|
|
|
const vendors = getDBsToTest();
|
|
|
|
const NODE_VERSION = process.env.TEST_NODE_VERSION || '15-alpine';
|
|
|
|
await new Listr([
|
|
{
|
|
title: 'Create Directus Docker Image',
|
|
task: async (_, task) => {
|
|
const result = await globby(['**/*', '!node_modules', '!**/node_modules', '!**/src'], {
|
|
cwd: path.resolve(__dirname, '..', '..'),
|
|
});
|
|
|
|
const stream = await docker.buildImage(
|
|
{
|
|
context: path.resolve(__dirname, '..', '..'),
|
|
src: ['Dockerfile', ...result],
|
|
},
|
|
{ t: 'directus-test-image', buildargs: { NODE_VERSION } }
|
|
);
|
|
|
|
await new Promise((resolve, reject) => {
|
|
docker.modem.followProgress(
|
|
stream,
|
|
(err: Error, res: any) => {
|
|
if (err) {
|
|
reject(err);
|
|
} else {
|
|
resolve(res);
|
|
}
|
|
},
|
|
(event: any) => {
|
|
if (event.stream?.startsWith('Step')) {
|
|
task.output = event.stream;
|
|
}
|
|
}
|
|
);
|
|
});
|
|
},
|
|
},
|
|
{
|
|
title: 'Pulling Required Images',
|
|
task: () => {
|
|
return new Listr(
|
|
vendors
|
|
.map((vendor) => {
|
|
return {
|
|
title: config.names[vendor]!,
|
|
task: async (_, task) => {
|
|
const image =
|
|
config.containerConfig[vendor]! &&
|
|
(config.containerConfig[vendor]! as Dockerode.ContainerSpec).Image;
|
|
|
|
if (!image) return;
|
|
|
|
const stream = await docker.pull(image);
|
|
|
|
await new Promise((resolve, reject) => {
|
|
docker.modem.followProgress(
|
|
stream,
|
|
(err: Error, res: any) => {
|
|
if (err) {
|
|
reject(err);
|
|
} else {
|
|
resolve(res);
|
|
}
|
|
},
|
|
(event: any) => {
|
|
if (event.stream?.startsWith('Step')) {
|
|
task.output = event.stream;
|
|
}
|
|
}
|
|
);
|
|
});
|
|
},
|
|
} as ListrTask;
|
|
})
|
|
.filter((t) => t),
|
|
{ concurrent: true }
|
|
);
|
|
},
|
|
},
|
|
{
|
|
title: 'Create Docker containers',
|
|
task: () => {
|
|
return new Listr(
|
|
vendors.map((vendor) => {
|
|
return {
|
|
title: config.names[vendor]!,
|
|
task: () => {
|
|
return new Listr([
|
|
{
|
|
title: 'Database',
|
|
task: async () => {
|
|
if (!config.containerConfig[vendor] || config.containerConfig[vendor] === false) return;
|
|
const container = await docker.createContainer(config.containerConfig[vendor]! as ContainerSpec);
|
|
global.databaseContainers.push({
|
|
vendor,
|
|
container,
|
|
});
|
|
},
|
|
},
|
|
{
|
|
title: 'Directus',
|
|
task: async () => {
|
|
const container = await docker.createContainer({
|
|
name: `directus-test-directus-${vendor}-${process.pid}`,
|
|
Image: 'directus-test-image',
|
|
Env: [
|
|
...config.envs[vendor]!,
|
|
'ADMIN_EMAIL=admin@example.com',
|
|
'ADMIN_PASSWORD=password',
|
|
'KEY=directus-test',
|
|
'SECRET=directus-test',
|
|
'TELEMETRY=false',
|
|
],
|
|
HostConfig: {
|
|
Links:
|
|
vendor === 'sqlite3'
|
|
? undefined
|
|
: [
|
|
`directus-test-database-${vendor}-${process.pid}:directus-test-database-${vendor}-${process.pid}`,
|
|
],
|
|
PortBindings: {
|
|
'8055/tcp': [{ HostPort: String(config.ports[vendor]!) }],
|
|
},
|
|
},
|
|
} as ContainerSpec);
|
|
|
|
global.directusContainers.push({
|
|
vendor,
|
|
container,
|
|
});
|
|
},
|
|
},
|
|
]);
|
|
},
|
|
};
|
|
}),
|
|
{ concurrent: true }
|
|
);
|
|
},
|
|
},
|
|
{
|
|
title: 'Start Database Docker containers',
|
|
task: () => {
|
|
return new Listr(
|
|
global.databaseContainers.map(({ vendor, container }) => {
|
|
return {
|
|
title: config.names[vendor]!,
|
|
task: async () => await container.start(),
|
|
};
|
|
}),
|
|
{ concurrent: true }
|
|
);
|
|
},
|
|
},
|
|
{
|
|
title: 'Create Knex instances',
|
|
task: () => {
|
|
return new Listr(
|
|
vendors.map((vendor) => {
|
|
return {
|
|
title: config.names[vendor]!,
|
|
task: () => {
|
|
global.knexInstances.push({ vendor, knex: knex(config.knexConfig[vendor]!) });
|
|
},
|
|
};
|
|
}),
|
|
{ concurrent: true }
|
|
);
|
|
},
|
|
},
|
|
{
|
|
title: 'Wait for databases to be ready',
|
|
task: async () => {
|
|
return new Listr(
|
|
global.knexInstances.map(({ vendor, knex }) => {
|
|
return {
|
|
title: config.names[vendor]!,
|
|
task: async () => await awaitDatabaseConnection(knex, config.knexConfig[vendor]!.waitTestSQL),
|
|
};
|
|
}),
|
|
{ concurrent: true }
|
|
);
|
|
},
|
|
},
|
|
{
|
|
title: 'Close Knex instances',
|
|
task: () => {
|
|
return new Listr(
|
|
global.knexInstances.map(({ vendor, knex }) => {
|
|
return {
|
|
title: config.names[vendor]!,
|
|
task: async () => await knex.destroy(),
|
|
};
|
|
}),
|
|
{ concurrent: true }
|
|
);
|
|
},
|
|
},
|
|
{
|
|
title: 'Start Directus Docker containers',
|
|
task: () => {
|
|
return new Listr(
|
|
global.directusContainers.map(({ vendor, container }) => {
|
|
return {
|
|
title: config.names[vendor]!,
|
|
task: async () => await container.start(),
|
|
};
|
|
}),
|
|
{ concurrent: true }
|
|
);
|
|
},
|
|
},
|
|
{
|
|
title: 'Wait for Directus to be ready',
|
|
task: async () => {
|
|
return new Listr(
|
|
vendors.map((vendor) => {
|
|
return {
|
|
title: config.names[vendor]!,
|
|
task: async () => await awaitDirectusConnection(config.ports[vendor]!),
|
|
};
|
|
}),
|
|
{ concurrent: true }
|
|
);
|
|
},
|
|
},
|
|
]).run();
|
|
|
|
console.log('\n');
|
|
};
|