@reldens/storage
Version:
225 lines (211 loc) • 8.95 kB
JavaScript
/**
*
* Reldens - Storage Test Runner
*
*/
const { Logger, sc } = require('@reldens/utils');
const { FileHandler } = require('@reldens/server-utils');
const { TestHelpers } = require('./utils/test-helpers');
const { DriverRegistry } = require('./utils/driver-registry');
const DriversTest = require('./integration/test-drivers');
const NestedFiltersTest = require('./integration/test-nested-filters');
const RelationsTest = require('./integration/test-relations');
const RawQueriesTest = require('./integration/test-raw-queries');
const EntityManagerTest = require('./unit/test-entity-manager');
const TypeMapperTest = require('./unit/test-type-mapper');
const DriversUnitTest = require('./unit/test-drivers');
if(!process.env.RELDENS_TEST_DB_HOST){
let envPath = FileHandler.joinPaths(__dirname, '.env.test');
if(FileHandler.exists(envPath)){
require('dotenv').config({path: envPath});
}
}
class RunTests
{
constructor()
{
this.allCounts = {total: 0, passed: 0, failed: 0};
this.filter = null;
this.suite = null;
this.driver = null;
this.skipCleanup = false;
this.skipGeneration = false;
this.driverRegistry = new DriverRegistry();
}
parseCommandLineArgs()
{
for(let arg of process.argv){
if(arg.startsWith('--filter=')){
this.filter = arg.split('=')[1];
Logger.info('Filter applied: '+this.filter+'\n');
}
if(arg.startsWith('--suite=')){
this.suite = arg.split('=')[1];
Logger.info('Suite: '+this.suite);
}
if(arg.startsWith('--driver=')){
this.driver = arg.split('=')[1];
Logger.info('Driver: '+this.driver);
}
if('--skip-cleanup' === arg){
this.skipCleanup = true;
Logger.info('Skipping cleanup: YES\n');
}
if('--skip-generation' === arg){
this.skipGeneration = true;
Logger.info('Skipping entity generation: YES\n');
}
}
}
async run()
{
Logger.info('='.repeat(60));
Logger.info('@RELDENS/STORAGE - TEST SUITE');
Logger.info('='.repeat(60));
Logger.info('Test execution started: '+sc.formatDate(new Date()));
Logger.info('');
this.parseCommandLineArgs();
let config = TestHelpers.getTestDbConfig();
if(!this.skipCleanup){
TestHelpers.cleanupGeneratedFiles();
}
await this.runPreFlightChecks(config);
let hasIntegrationTests = !this.suite || this.suite === 'integration';
let hasUnitTests = !this.suite || this.suite === 'unit';
if(this.filter){
if(this.filter.includes('integration')){
hasUnitTests = false;
}
if(this.filter.includes('unit')){
hasIntegrationTests = false;
}
}
Logger.info('Integration tests: '+(hasIntegrationTests ? 'YES' : 'NO'));
Logger.info('Unit tests: '+(hasUnitTests ? 'YES' : 'NO'));
Logger.info('');
if(hasIntegrationTests){
this.driverRegistry.skipGeneration = this.skipGeneration;
await this.driverRegistry.initialize();
await this.runIntegrationTests();
}
if(hasUnitTests){
await this.runUnitTests();
}
Logger.info('');
Logger.info('='.repeat(60));
Logger.info('FINAL TEST RESULTS');
Logger.info('='.repeat(60));
Logger.info('Total tests executed: '+this.allCounts.total);
Logger.info('Tests passed: '+this.allCounts.passed);
Logger.info('Tests failed: '+this.allCounts.failed);
Logger.info('='.repeat(60));
if(hasIntegrationTests){
await this.driverRegistry.cleanup();
}
if(0 < this.allCounts.failed){
process.exitCode = 1;
}
return this.allCounts;
}
async runIntegrationTests()
{
let driverNames = ['objection-js', 'mikro-orm', 'prisma'];
if(this.driver){
driverNames = [this.driver];
}
for(let driverName of driverNames){
let dataServer = this.driverRegistry.getDriver(driverName);
let repos = this.driverRegistry.getRepos(driverName);
if(!dataServer){
Logger.warning('Driver '+driverName+' not available, skipping tests');
continue;
}
try {
let driversTest = new DriversTest(dataServer, repos, driverName);
let driversResult = await driversTest.run();
this.allCounts.total += driversResult.total;
this.allCounts.passed += driversResult.passed;
this.allCounts.failed += driversResult.failed;
} catch(error) {
Logger.critical('Driver '+driverName+' tests crashed: '+error.message);
Logger.critical(error.stack);
}
try {
let nestedFiltersTest = new NestedFiltersTest(dataServer, repos, driverName);
let nestedFiltersResult = await nestedFiltersTest.run();
this.allCounts.total += nestedFiltersResult.total;
this.allCounts.passed += nestedFiltersResult.passed;
this.allCounts.failed += nestedFiltersResult.failed;
} catch(error) {
Logger.critical('Driver '+driverName+' nested filters tests crashed: '+error.message);
Logger.critical(error.stack);
}
try {
let relationsTest = new RelationsTest(dataServer, repos, driverName);
let relationsResult = await relationsTest.run();
this.allCounts.total += relationsResult.total;
this.allCounts.passed += relationsResult.passed;
this.allCounts.failed += relationsResult.failed;
} catch(error) {
Logger.critical('Driver '+driverName+' relations tests crashed: '+error.message);
Logger.critical(error.stack);
}
try {
let rawQueriesTest = new RawQueriesTest(dataServer, repos, driverName);
let rawQueriesResult = await rawQueriesTest.run();
this.allCounts.total += rawQueriesResult.total;
this.allCounts.passed += rawQueriesResult.passed;
this.allCounts.failed += rawQueriesResult.failed;
} catch(error) {
Logger.critical('Driver '+driverName+' raw queries tests crashed: '+error.message);
Logger.critical(error.stack);
}
}
}
async runUnitTests()
{
let entityManagerTest = new EntityManagerTest();
let entityManagerResult = await entityManagerTest.run();
this.allCounts.total += entityManagerResult.total;
this.allCounts.passed += entityManagerResult.passed;
this.allCounts.failed += entityManagerResult.failed;
let typeMapperTest = new TypeMapperTest();
let typeMapperResult = await typeMapperTest.run();
this.allCounts.total += typeMapperResult.total;
this.allCounts.passed += typeMapperResult.passed;
this.allCounts.failed += typeMapperResult.failed;
let driversUnitTest = new DriversUnitTest();
let driversUnitResult = await driversUnitTest.run();
this.allCounts.total += driversUnitResult.total;
this.allCounts.passed += driversUnitResult.passed;
this.allCounts.failed += driversUnitResult.failed;
}
async runPreFlightChecks(config)
{
Logger.info('='.repeat(60));
Logger.info('Pre-Flight Checks');
Logger.info('='.repeat(60));
if(!TestHelpers.verifyAllPackages()){
Logger.critical('Package verification failed');
process.exit(1);
}
Logger.info('All pre-flight checks passed');
Logger.info('='.repeat(60));
}
}
process.on('unhandledRejection', (reason, promise) => {
Logger.info('Unhandled Rejection at: '+promise+' reason: '+reason+'\n');
Logger.info('(Test suite will continue)\n');
});
process.on('uncaughtException', (error) => {
Logger.info('Uncaught Exception: '+error.message+'\n');
Logger.info(error.stack+'\n');
Logger.info('(Test suite will continue)\n');
});
let runner = new RunTests();
runner.run().catch(error => {
Logger.info('CATASTROPHIC ERROR: Test runner failed completely\n');
Logger.info('Error: '+error.message+'\n');
Logger.info(error.stack+'\n');
process.exit(1);
});