import { Test } from '@nestjs/testing'; import type { INestApplication } from '@nestjs/common'; import type { NestExpressApplication } from '@nestjs/platform-express'; // Valores ficticios: los e2e no se conectan a SAP ni a un archivo SQLite. process.env.SAPB1_SL_URL ??= 'https://sap.invalid:50000/b1s/v1'; process.env.SAPB1_SL_COMPANYDB ??= 'DB'; process.env.SAPB1_SL_USER ??= 'u'; process.env.SAPB1_SL_PASSWORD ??= 'p'; process.env.SQLITE_PATH = ':memory:'; export interface FakeEmployee { EmployeeID: number; FirstName: string; LastName: string; Active: string; U_WEB_USER: string; U_WEB_PASS: string; } export const employee = (webUser: string, id = 1, pass = 'secreto'): FakeEmployee => ({ EmployeeID: id, FirstName: webUser, LastName: 'Test', Active: 'tYES', U_WEB_USER: webUser, U_WEB_PASS: pass, }); export interface FakeSapRequest { method: string; path: string; query?: Record; body?: unknown; headers?: Record; } /** Llamadas que llegaron al "Service Layer" simulado (se vacía en cada createTestApp). */ export const sapCalls: FakeSapRequest[] = []; /** App completa con EmployeesInfo y la sesión SAP simulados. */ export async function createTestApp( employees: FakeEmployee[], adminWebUsers = '', onSapRequest: (req: FakeSapRequest) => unknown = () => ({}), ): Promise { sapCalls.length = 0; process.env.ADMIN_WEB_USERS = adminWebUsers; const { AppModule } = await import('../../src/app.module.js'); const { SapClientService } = await import('../../src/sap/sap-client.service.js'); const { SapSessionService } = await import('../../src/sap/sap-session.service.js'); const moduleRef = await Test.createTestingModule({ imports: [AppModule] }) .overrideProvider(SapClientService) .useValue({ get: async (_path: string, q: { $filter: string }) => ({ data: { value: employees.filter((e) => q.$filter === `U_WEB_USER eq '${e.U_WEB_USER}'`) }, }), request: async (req: FakeSapRequest) => { sapCalls.push(req); return { status: 200, headers: {}, data: onSapRequest(req) }; }, }) .overrideProvider(SapSessionService) .useValue({ getSession: async () => ({}), status: () => ({ connected: true }), onModuleDestroy: () => undefined }) .compile(); const { configureApp } = await import('../../src/app.setup.js'); const app = moduleRef.createNestApplication(); configureApp(app); await app.init(); return app; }