Files
directus/tests/setup/setup.ts
ian 68066eccb7 Remove UTC conversion from date, time and datetime fields (#10956)
* Remove UTC conversion from date, time and datetime fields

* Fix mysql / maria timestamps when not in UTC timezone

* Add sequential tests with node timezone change

* Increase connection attempt check

* Add error catching in tests flow setup

* Check for server connectivity

* Fix promises

* Fix timestamp inconsistencies

* Revert to previously used parseISO

* Ensure database and directus connection

* Add another timezone to test positive and negative GMT

* Set local server hostname to localhost

* Add tests for SQLite

* Use notNullable primary key

* Revert connection testing sleep duration

* Fix nested transactions on SQLite

* Increase MSSQL request timeout

* Add type override flag for SQLite

* Remove commented code

* Add type override flags for Oracle

* Updated test file path

* Increase test servers launch timeout

* Increase test servers launch timeout

* Update format of tests

* Fix typo

* Increase test timeout for CockroachDB

* Add type overrides when creating fields through collections service

* Remove time field type conversion for Oracle

* Update collections list in test

* Remove check for time field in Oracle

* Add missing continue...

* Remove database override

* Add note for SQLite

* Rename flags and extract shared util

* Abstract remaining DB specific checks

* Revert flags renaming except renaming of test files

* Use date helper to add field flag

* Move field date typecasting upstream

* Use timestamp helper for date-created and date-updated

* Fix tests

* Remove unused vars

* Add tests for date-created

* Increase connection attempt count

* Fix test for mariadb

* Increase allowable difference to account for delays

* Add tests for date-updated

* Fix tests again for mariadb

* Add date helpers post merge

Co-authored-by: rijkvanzanten <rijkvanzanten@me.com>
2022-04-06 16:15:22 -04:00

123 lines
3.5 KiB
TypeScript

/* eslint-disable no-console */
import knex from 'knex';
import Listr from 'listr';
import vendors from '../get-dbs-to-test';
import config from '../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';
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.on('data', (data) => (serverOutput += data.toString()));
server.on('exit', (code) => {
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 'Unable to read totalTestsCount';
}
for (const vendor of vendors) {
try {
const serverUrl = `http://localhost:${config.envs[vendor]!.PORT}`;
let response = await axios.get(`${serverUrl}/items/tests_flow_data?access_token=AdminToken`);
if (response.status !== 200) {
continue;
}
const body = {
total_tests_count: totalTestsCount,
};
response = await axios.post(`${serverUrl}/items/tests_flow_data`, body, {
headers: {
Authorization: 'Bearer AdminToken',
'Content-Type': 'application/json',
},
});
if (response.status === 200) {
process.env.serverUrl = serverUrl;
break;
}
} catch (err) {
continue;
}
}
if (!process.env.serverUrl) {
throw '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');
};