Files
directus/tests-blackbox/setup/setup.ts
ian 8d1966ab04 Blackbox testing (#13200)
* Add black box tests

* Revert docker compose file

* Update workflow

* Try use workflow from dev repo

* Increase seedDB() timeout

* Disable other checks for now

* Change DB sequence

* Update jest moduleNameMapper

* Update workflow's docker-compose.yml path

* Slice array first

* Remove differentiation of status code

* Delete field only after foreign key constraints are removed

* Add checks for different types of primary key

* Test global query filter for all field types

* Increase timeout for m2o seeding

* Add case insensitive string operators

* Update filter check to run on relational fields

* Enable time field checks

* Add seeded random and fix relational seeding

* Add casting for integer and bigInteger

* Minor fixes

* Reduce bigInt values

* Separate seeding of DB structure from values

* Add primaryKey seeding function

* Use automatic IDs except for string pk

* Try fix ci

* Update package-lock.json

* Update common.test for concealed user tokens

* Use dynamic field type for m2o.test relational fields

* Temporary disable missing nicontains for string type

* Add support for alias type filtering

* Fix relational filter operator checks

* Add initial o2m test

* Remove integer pk limit

* Add empty checks for string and uuid null

* Limit generated integer value to 4 bytes

* Patch timezone tests for MSSQL

* Remove sample query filter test

* Fix timezone test for sqlite

* Fix MSSQL uuids

* Fix MSSQL timestamp inaccuracy

* Cast datetime schema to milliseconds for comparison

* Fix MySQL / Maria timestamp inaccuracy

* Fix MySQL / Maria between operator inconsistency for float type

* Fix missing time datatype in Oracle

* Skip filter testing on Oracle

* Enable o2m filter tests for other collections

* Run tests only on SQLite for PRs unless the Full Tests label exists

* Try fix actions

* Refactor github actions

* Update tests flow setup to use getURL()

* Start postgres docker

* Reinstate package-lock

* Fix geometry test

* Remove .gitkeep files

* Add todo.md

* Rename black box to blackbox

Co-authored-by: rijkvanzanten <rijkvanzanten@me.com>
2022-07-15 15:25:32 +00:00

132 lines
3.8 KiB
TypeScript

/* eslint-disable no-console */
import knex from 'knex';
import Listr from 'listr';
import vendors from '../common/get-dbs-to-test';
import config, { getUrl } from '../common/config';
import global from './global';
import { spawn, spawnSync } from 'child_process';
import axios from 'axios';
import { writeFileSync } from 'fs';
import { awaitDatabaseConnection, awaitDirectusConnection } from '../utils/await-connection';
import * as common from '../common';
let started = false;
export default async (): Promise<void> => {
if (started) return;
started = true;
console.log('\n\n');
console.log(`👮‍♀️ Starting tests!\n`);
await new Listr([
{
title: 'Bootstrap databases and start servers',
task: async () => {
return new Listr(
vendors.map((vendor) => {
return {
title: config.names[vendor]!,
task: async () => {
const database = knex(config.knexConfig[vendor]!);
await awaitDatabaseConnection(database, config.knexConfig[vendor]!.waitTestSQL);
if (vendor === 'sqlite3') {
writeFileSync('test.db', '');
}
const bootstrap = spawnSync('node', ['api/cli', 'bootstrap'], { env: config.envs[vendor] });
if (bootstrap.stderr.length > 0) {
throw new Error(`Directus-${vendor} bootstrap failed: \n ${bootstrap.stderr.toString()}`);
}
await database.migrate.latest();
await database.seed.run();
await database.destroy();
if (!process.env.TEST_LOCAL) {
const server = spawn('node', ['api/cli', 'start'], { env: config.envs[vendor] });
global.directus[vendor] = server;
let serverOutput = '';
server.stdout.setEncoding('utf8');
server.stdout.on('data', (data) => {
serverOutput += data.toString();
});
server.on('exit', (code) => {
if (process.env.TEST_SAVE_LOGS) {
writeFileSync(__dirname + `/../server-log-${vendor}.txt`, serverOutput);
}
if (code !== null) throw new Error(`Directus-${vendor} server failed: \n ${serverOutput}`);
});
// Give the server some time to start
await awaitDirectusConnection(Number(config.envs[vendor]!.PORT!));
server.on('exit', () => undefined);
}
},
};
}),
{ concurrent: true }
);
},
},
{
title: 'Setup test data flow',
task: async () => {
return new Listr([
{
title: 'Testing server connectivity and bootstrap tests flow',
task: async () => {
const totalTestsCount = Number(process.env.totalTestsCount);
if (isNaN(totalTestsCount)) {
throw new Error('Unable to read totalTestsCount');
}
for (const vendor of vendors) {
try {
const serverUrl = getUrl(vendor);
let response = await axios.get(
`${serverUrl}/items/tests_flow_data?access_token=${common.USER.TESTS_FLOW.TOKEN}`
);
if (response.status !== 200) {
continue;
}
const body = {
total_tests_count: totalTestsCount,
};
response = await axios.post(`${serverUrl}/items/tests_flow_data`, body, {
headers: {
Authorization: 'Bearer ' + common.USER.TESTS_FLOW.TOKEN,
'Content-Type': 'application/json',
},
});
if (response.status === 200) {
process.env.serverUrl = serverUrl;
break;
}
} catch (err) {
continue;
}
}
if (!process.env.serverUrl) {
throw new Error('Unable to connect to any directus server');
}
},
},
]);
},
},
])
.run()
.catch((reason) => {
for (const server of Object.values(global.directus)) {
server?.kill();
}
throw new Error(reason);
});
console.log('\n');
};