diff --git a/backend/.env.test b/backend/.env.test index 535628cd..9020e581 100644 --- a/backend/.env.test +++ b/backend/.env.test @@ -11,3 +11,5 @@ DWENGO_PORT=3000 DWENGO_DB_NAME=":memory:" DWENGO_DB_UPDATE=true + +DWENGO_CORS_ALLOWED_ORIGINS=http://localhost:5173,http://localhost:3000 diff --git a/backend/tool/seed.ts b/backend/tool/seed.ts index 3ded9379..c781cdf4 100644 --- a/backend/tool/seed.ts +++ b/backend/tool/seed.ts @@ -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 { getLogger, Logger } from '../src/logging/initalize.js'; 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(); -export async function seedDatabase(): Promise { - dotenv.config({ path: '.env.development.local' }); - const orm = await initORM(); +export async function seedDatabase(envFile = '.env.development.local', testMode = false): Promise { + dotenv.config({ path: envFile }); + const orm = await initORM(testMode); await orm.schema.clearDatabase(); const em = forkEntityManager(); diff --git a/backend/tool/startTestApp.ts b/backend/tool/startTestApp.ts new file mode 100644 index 00000000..6dab054d --- /dev/null +++ b/backend/tool/startTestApp.ts @@ -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 { + await seedDatabase(envFile, true); + await initORM(true); + + app.listen(9876, () => { + console.log('Server is running on http://localhost:9876/api'); + }); +} + +await startServer(); diff --git a/frontend/tests/setup-backend.ts b/frontend/tests/setup-backend.ts index 722accb5..3b7aee24 100644 --- a/frontend/tests/setup-backend.ts +++ b/frontend/tests/setup-backend.ts @@ -1,7 +1,6 @@ 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; async function waitForEndpoint(url: string, delay = 1000, retries = 60): Promise { @@ -16,32 +15,28 @@ async function waitForEndpoint(url: string, delay = 1000, retries = 60): Promise } export async function setup(): Promise { - // Check if the database container is already running - const containerCheck = execSync("docker ps --filter 'name=db' --format '{{.Names}}'"); - wasRunningBefore = !(containerCheck.toString().includes("db")); - - // Spin up the database - execSync("docker compose up db --detach"); - - // Spin up the backend - backendProcess = spawn("npm", ["run", "dev"], { + // Precompile needed packages + spawnSync("npm", ["run", "predev"], { cwd: "../backend", 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 - await waitForEndpoint("http://localhost:3000/api"); + await waitForEndpoint("http://localhost:9876/api"); } export async function teardown(): Promise { if (backendProcess) { backendProcess.kill(); } - - if (wasRunningBefore) { - spawn("docker", ["compose", "down"], { - cwd: "..", - stdio: "inherit", - }); - } }