test(frontend): Backend in memory

This commit is contained in:
Tibo De Peuter 2025-04-20 20:27:04 +02:00
parent e4945fac66
commit 04ac71dbed
Signed by: tdpeuter
GPG key ID: 38297DE43F75FFE2
4 changed files with 53 additions and 23 deletions

View file

@ -11,3 +11,5 @@ DWENGO_PORT=3000
DWENGO_DB_NAME=":memory:" DWENGO_DB_NAME=":memory:"
DWENGO_DB_UPDATE=true DWENGO_DB_UPDATE=true
DWENGO_CORS_ALLOWED_ORIGINS=http://localhost:5173,http://localhost:3000

View file

@ -15,13 +15,13 @@ import { makeTestStudents } from '../tests/test_assets/users/students.testdata.j
import { makeTestTeachers } from '../tests/test_assets/users/teachers.testdata.js'; import { makeTestTeachers } from '../tests/test_assets/users/teachers.testdata.js';
import { getLogger, Logger } from '../src/logging/initalize.js'; import { getLogger, Logger } from '../src/logging/initalize.js';
import { Collection } from '@mikro-orm/core'; import { Collection } from '@mikro-orm/core';
import { Group } from '../dist/entities/assignments/group.entity.js'; import { Group } from '../src/entities/assignments/group.entity.js';
const logger: Logger = getLogger(); const logger: Logger = getLogger();
export async function seedDatabase(): Promise<void> { export async function seedDatabase(envFile = '.env.development.local', testMode = false): Promise<void> {
dotenv.config({ path: '.env.development.local' }); dotenv.config({ path: envFile });
const orm = await initORM(); const orm = await initORM(testMode);
await orm.schema.clearDatabase(); await orm.schema.clearDatabase();
const em = forkEntityManager(); const em = forkEntityManager();

View file

@ -0,0 +1,33 @@
import express, { Express } from 'express';
import { initORM } from '../src/orm.js';
import apiRouter from '../src/routes/router.js';
import { errorHandler } from '../src/middleware/error-handling/error-handler.js';
import dotenv from 'dotenv';
import cors from '../src/middleware/cors';
import { authenticateUser } from '../src/middleware/auth/auth';
import { seedDatabase } from './seed';
const envFile = '../.env.test';
console.log(`Using env file: ${envFile}`);
dotenv.config({ path: envFile });
const app: Express = express();
app.use(express.json());
app.use(cors);
app.use(authenticateUser);
app.use('/api', apiRouter);
app.use(errorHandler);
async function startServer(): Promise<void> {
await seedDatabase(envFile, true);
await initORM(true);
app.listen(9876, () => {
console.log('Server is running on http://localhost:9876/api');
});
}
await startServer();

View file

@ -1,7 +1,6 @@
import { spawn } from "child_process"; import { spawn } from "child_process";
import { ChildProcess, execSync } from 'node:child_process'; import { ChildProcess, spawnSync } from 'node:child_process';
let wasRunningBefore: boolean;
let backendProcess: ChildProcess; let backendProcess: ChildProcess;
async function waitForEndpoint(url: string, delay = 1000, retries = 60): Promise<void> { async function waitForEndpoint(url: string, delay = 1000, retries = 60): Promise<void> {
@ -16,32 +15,28 @@ async function waitForEndpoint(url: string, delay = 1000, retries = 60): Promise
} }
export async function setup(): Promise<void> { export async function setup(): Promise<void> {
// Check if the database container is already running // Precompile needed packages
const containerCheck = execSync("docker ps --filter 'name=db' --format '{{.Names}}'"); spawnSync("npm", ["run", "predev"], {
wasRunningBefore = !(containerCheck.toString().includes("db"));
// Spin up the database
execSync("docker compose up db --detach");
// Spin up the backend
backendProcess = spawn("npm", ["run", "dev"], {
cwd: "../backend", cwd: "../backend",
stdio: "inherit", stdio: "inherit",
}); });
// Spin up the backend
backendProcess = spawn("tsx", ["--env-file=.env.development.example", "tool/startTestApp.ts"], {
cwd: "../backend",
stdio: "inherit",
env: {
...process.env,
NODE_ENV: 'test',
}
});
// Wait until you can curl the backend // Wait until you can curl the backend
await waitForEndpoint("http://localhost:3000/api"); await waitForEndpoint("http://localhost:9876/api");
} }
export async function teardown(): Promise<void> { export async function teardown(): Promise<void> {
if (backendProcess) { if (backendProcess) {
backendProcess.kill(); backendProcess.kill();
} }
if (wasRunningBefore) {
spawn("docker", ["compose", "down"], {
cwd: "..",
stdio: "inherit",
});
}
} }