test(frontend): Backend in memory
This commit is contained in:
		
							parent
							
								
									e4945fac66
								
							
						
					
					
						commit
						04ac71dbed
					
				
					 4 changed files with 53 additions and 23 deletions
				
			
		|  | @ -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 | ||||||
|  |  | ||||||
|  | @ -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(); | ||||||
|  |  | ||||||
							
								
								
									
										33
									
								
								backend/tool/startTestApp.ts
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										33
									
								
								backend/tool/startTestApp.ts
									
										
									
									
									
										Normal 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(); | ||||||
|  | @ -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", |  | ||||||
|         }); |  | ||||||
|     } |  | ||||||
| } | } | ||||||
|  |  | ||||||
		Reference in a new issue