mirror of
https://github.com/mauriceboe/TREK.git
synced 2026-06-19 13:21:46 +00:00
0b218d53b2
Co-hosted NestJS app behind the existing Express server via a strangler-fig dispatcher, sharing the same better-sqlite3 connection and JWT httpOnly cookie. Additive and dormant: default routing stays on Express, Nest only serves its own /api/_nest diagnostics until a module opts in. F1 @trek/shared Zod contract package; F2 Nest bootstrap co-hosted (fall-through, single Dockerfile/port); F3 shared better-sqlite3 provider; F4 JWT cookie auth guard (+ @CurrentUser, admin guard); F5 Zod validation pipe + error-envelope parity; F6 Nest test + coverage gates; F7 per-prefix strangler toggle (env, default Express); F8 CI build/typecheck/test/coverage. Remaining F4/F6/F8 checklist items (trip-access + permission levels + MFA policy, e2e harness/seed + 80% gate, Nest↔Express parity test, Playwright PR-comment workflow) are tracked on the first consuming module cards (L1/A1/C1).
26 lines
880 B
TypeScript
26 lines
880 B
TypeScript
import { describe, it, expect } from 'vitest';
|
|
import { z } from 'zod';
|
|
import { HttpException } from '@nestjs/common';
|
|
import { ZodValidationPipe } from '../../../src/nest/common/zod-validation.pipe';
|
|
|
|
describe('ZodValidationPipe', () => {
|
|
const pipe = new ZodValidationPipe(z.object({ name: z.string().min(1) }));
|
|
const meta = {} as never;
|
|
|
|
it('returns the parsed value for valid input', () => {
|
|
expect(pipe.transform({ name: 'x' }, meta)).toEqual({ name: 'x' });
|
|
});
|
|
|
|
it('throws TREK { error } envelope with status 400 on invalid input', () => {
|
|
let thrown: unknown;
|
|
try {
|
|
pipe.transform({ name: '' }, meta);
|
|
} catch (e) {
|
|
thrown = e;
|
|
}
|
|
expect(thrown).toBeInstanceOf(HttpException);
|
|
expect((thrown as HttpException).getStatus()).toBe(400);
|
|
expect((thrown as HttpException).getResponse()).toHaveProperty('error');
|
|
});
|
|
});
|