diff --git a/Backend/package-lock.json b/Backend/package-lock.json index bc96de7..e34c693 100644 --- a/Backend/package-lock.json +++ b/Backend/package-lock.json @@ -50,7 +50,7 @@ "prettier": "^3.4.2", "source-map-support": "^0.5.21", "supertest": "^7.0.0", - "ts-jest": "^29.2.5", + "ts-jest": "^29.4.11", "ts-loader": "^9.5.2", "ts-node": "^10.9.2", "tsconfig-paths": "^4.2.0", diff --git a/Backend/package.json b/Backend/package.json index 78f20b8..53208e9 100644 --- a/Backend/package.json +++ b/Backend/package.json @@ -17,7 +17,7 @@ "test:watch": "jest --watch", "test:cov": "jest --coverage", "test:debug": "node --inspect-brk -r tsconfig-paths/register -r ts-node/register node_modules/.bin/jest --runInBand", - "test:e2e": "jest --config ./test/jest-e2e.json", + "test:e2e": "set NODE_ENV=test && jest --config ./test/jest-e2e.json", "migration:run": "ts-node -r tsconfig-paths/register ./node_modules/typeorm/cli.js -d src/database/data-source.ts migration:run", "migration:revert": "ts-node -r tsconfig-paths/register ./node_modules/typeorm/cli.js -d src/database/data-source.ts migration:revert", "migration:generate": "ts-node -r tsconfig-paths/register ./node_modules/typeorm/cli.js -d src/database/data-source.ts migration:generate" @@ -43,7 +43,8 @@ "reflect-metadata": "^0.2.2", "rxjs": "^7.8.1", "sanitize-html": "^2.13.1", - "typeorm": "^0.3.28" + "typeorm": "^0.3.28", + "sqlite3": "^5.0.2" }, "devDependencies": { "@eslint/eslintrc": "^3.2.0", @@ -67,7 +68,7 @@ "prettier": "^3.4.2", "source-map-support": "^0.5.21", "supertest": "^7.0.0", - "ts-jest": "^29.2.5", + "ts-jest": "^29.4.11", "ts-loader": "^9.5.2", "ts-node": "^10.9.2", "tsconfig-paths": "^4.2.0", diff --git a/Backend/src/database/database.module.ts b/Backend/src/database/database.module.ts index f95834d..29bc90d 100644 --- a/Backend/src/database/database.module.ts +++ b/Backend/src/database/database.module.ts @@ -9,16 +9,18 @@ import { Gist } from '../gists/entities/gist.entity'; imports: [ConfigModule], inject: [ConfigService], useFactory: (config: ConfigService) => ({ - type: 'postgres', + type: config.get('NODE_ENV') === 'test' ? 'sqlite' : 'postgres', host: config.get('DATABASE_HOST', 'localhost'), port: config.get('DATABASE_PORT', 5432), username: config.get('DATABASE_USER', 'gist'), password: config.get('DATABASE_PASSWORD', 'gist'), database: config.get('DATABASE_NAME', 'gist'), + // Use SQLite in-memory DB for tests + ...(config.get('NODE_ENV') === 'test' ? { database: ':memory:' } : {}), entities: [Gist], migrations: [__dirname + '/migrations/*{.ts,.js}'], migrationsRun: false, - synchronize: false, + synchronize: config.get('NODE_ENV') === 'test', logging: config.get('NODE_ENV') !== 'production', extra: { max: config.get('DB_POOL_MAX', 10), diff --git a/Backend/test/gists.e2e.spec.ts b/Backend/test/gists.e2e.spec.ts index a4d1927..32b9808 100644 --- a/Backend/test/gists.e2e.spec.ts +++ b/Backend/test/gists.e2e.spec.ts @@ -46,7 +46,7 @@ describe('Gists (e2e)', () => { describe('POST /gists', () => { it('should reject POST /gists without CSRF token', async () => { await request(app.getHttpServer()) - .post('/gists') + .post('/v1/gists') .send({ content: 'e2e test gist', lat: 9.0579, lon: 7.4951 }) .expect(403); }); @@ -55,7 +55,7 @@ describe('Gists (e2e)', () => { const csrf = await getCsrfToken(app.getHttpServer()); const res = await request(app.getHttpServer()) - .post('/gists') + .post('/v1/gists') .set('Cookie', csrf.cookie) .set('x-csrf-token', csrf.token) .send({ content: 'e2e test gist', lat: 9.0579, lon: 7.4951 }) @@ -78,7 +78,7 @@ describe('Gists (e2e)', () => { const csrf = await getCsrfToken(app.getHttpServer()); const res = await request(app.getHttpServer()) - .post('/gists') + .post('/v1/gists') .set('Cookie', csrf.cookie) .set('x-csrf-token', csrf.token) .send({ content: 'bad lat', lat: 999, lon: 7.4951 }) @@ -92,7 +92,7 @@ describe('Gists (e2e)', () => { const csrf = await getCsrfToken(app.getHttpServer()); const res = await request(app.getHttpServer()) - .post('/gists') + .post('/v1/gists') .set('Cookie', csrf.cookie) .set('x-csrf-token', csrf.token) .send({ content: 'x'.repeat(281), lat: 9.0579, lon: 7.4951 }) @@ -105,7 +105,7 @@ describe('Gists (e2e)', () => { const csrf = await getCsrfToken(app.getHttpServer()); await request(app.getHttpServer()) - .post('/gists') + .post('/v1/gists') .set('Cookie', csrf.cookie) .set('x-csrf-token', csrf.token) .send({ content: 'missing coords' }) @@ -116,7 +116,7 @@ describe('Gists (e2e)', () => { const csrf = await getCsrfToken(app.getHttpServer()); await request(app.getHttpServer()) - .post('/gists') + .post('/v1/gists') .set('Cookie', csrf.cookie) .set('x-csrf-token', csrf.token) .send({ content: 'whitelist test', lat: 9.0579, lon: 7.4951, hack: 'injected' }) @@ -134,7 +134,7 @@ describe('Gists (e2e)', () => { }); it('should return paginated response with data and pagination', async () => { const res = await request(app.getHttpServer()) - .get('/gists') + .get('/v1/gists') .query({ lat: 9.0579, lon: 7.4951, radius: 1000 }) .expect(200); @@ -148,12 +148,12 @@ describe('Gists (e2e)', () => { }); it('should return 400 when lat/lon are missing', async () => { - await request(app.getHttpServer()).get('/gists').expect(400); + await request(app.getHttpServer()).get('/v1/gists').expect(400); }); it('should respect the limit parameter', async () => { const res = await request(app.getHttpServer()) - .get('/gists') + .get('/v1/gists') .query({ lat: 9.0579, lon: 7.4951, limit: 2 }) .expect(200);