diff --git a/apps/backend/test/app.e2e-spec.ts b/apps/backend/test/app.e2e-spec.ts index 569012b..1ab26c7 100644 --- a/apps/backend/test/app.e2e-spec.ts +++ b/apps/backend/test/app.e2e-spec.ts @@ -1,6 +1,6 @@ import { Test, TestingModule } from '@nestjs/testing'; import { INestApplication } from '@nestjs/common'; -import * as request from 'supertest'; +import request from 'supertest'; import { AppModule } from '../src/app.module'; describe('AppController (e2e)', () => { diff --git a/apps/backend/test/integration/redis-cache.spec.ts b/apps/backend/test/integration/redis-cache.spec.ts new file mode 100644 index 0000000..4b9bcb2 --- /dev/null +++ b/apps/backend/test/integration/redis-cache.spec.ts @@ -0,0 +1,45 @@ +import { randomUUID } from 'crypto'; +import { ConfigService } from '@nestjs/config'; +import { RedisCacheAdapter } from '../../src/infrastructure/cache/redis-cache.adapter'; + +describe('Redis cache integration', () => { + let cache: RedisCacheAdapter; + const prefix = `integration:${randomUUID()}:`; + const keys = ['value', 'expires'].map(key => `${prefix}${key}`); + + beforeAll(async () => { + cache = new RedisCacheAdapter( + new ConfigService({ + REDIS_HOST: process.env.REDIS_HOST, + REDIS_PORT: Number(process.env.REDIS_PORT), + REDIS_PASSWORD: process.env.REDIS_PASSWORD || undefined, + REDIS_DB: Number(process.env.REDIS_DB), + }) + ); + await cache.onModuleInit(); + }); + + afterAll(async () => { + try { + // Delete only this suite's keys; never flush a shared database. + await cache.deleteMany(keys); + } finally { + await cache.onModuleDestroy(); + } + }); + + it('round-trips cached application data and invalidates it', async () => { + const value = { amount: 125.5, currency: 'EUR', ports: ['FRLEH', 'USNYC'] }; + await cache.set(keys[0], value, 60); + expect(await cache.get(keys[0])).toEqual(value); + await cache.delete(keys[0]); + expect(await cache.get(keys[0])).toBeNull(); + }); + + it('expires cached data using the server TTL', async () => { + await cache.set(keys[1], { valid: true }, 1); + expect(await cache.exists(keys[1])).toBe(true); + await new Promise(resolve => setTimeout(resolve, 1200)); + expect(await cache.exists(keys[1])).toBe(false); + }); +}); diff --git a/apps/backend/test/jest-integration.json b/apps/backend/test/jest-integration.json index ff52b85..f6f086d 100644 --- a/apps/backend/test/jest-integration.json +++ b/apps/backend/test/jest-integration.json @@ -1,7 +1,10 @@ { "moduleFileExtensions": ["js", "json", "ts"], "rootDir": "../", - "testMatch": ["**/test/integration/**/*.spec.ts"], + "testMatch": [ + "/test/integration/**/*.spec.ts", + "/src/infrastructure/persistence/typeorm/repositories/typeorm-trade-quota.repository.spec.ts" + ], "transform": { "^.+\\.(t|j)s$": [ "ts-jest", @@ -19,7 +22,7 @@ "testEnvironment": "node", "moduleNameMapper": { "^@domain/(.*)$": "/src/domain/$1", - "@application/(.*)$": "/src/application/$1", + "^@application/(.*)$": "/src/application/$1", "^@infrastructure/(.*)$": "/src/infrastructure/$1" }, "transformIgnorePatterns": ["node_modules/(?!(@faker-js)/)"], diff --git a/apps/backend/test/setup-integration.ts b/apps/backend/test/setup-integration.ts index ffc57aa..fada399 100644 --- a/apps/backend/test/setup-integration.ts +++ b/apps/backend/test/setup-integration.ts @@ -11,6 +11,18 @@ process.env.TEST_DB_USER = process.env.TEST_DB_USER || 'postgres'; process.env.TEST_DB_PASSWORD = process.env.TEST_DB_PASSWORD || 'postgres'; process.env.TEST_DB_NAME = process.env.TEST_DB_NAME || 'xpeditis_test'; +// Enable the repository integration suite using the disposable CI service. +// Never fall back to DATABASE_* (the application's deployment connection). +if (!process.env.TRADE_TEST_DATABASE_URL) { + const database = new URL('postgresql://localhost'); + database.hostname = process.env.TEST_DB_HOST; + database.port = process.env.TEST_DB_PORT; + database.username = process.env.TEST_DB_USER; + database.password = process.env.TEST_DB_PASSWORD; + database.pathname = `/${process.env.TEST_DB_NAME}`; + process.env.TRADE_TEST_DATABASE_URL = database.toString(); +} + // Redis test configuration process.env.REDIS_HOST = process.env.REDIS_HOST || 'localhost'; process.env.REDIS_PORT = process.env.REDIS_PORT || '6379';