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).
27 lines
827 B
TypeScript
27 lines
827 B
TypeScript
import { describe, it, expect } from 'vitest';
|
|
import { HttpException } from '@nestjs/common';
|
|
import { JwtAuthGuard } from '../../../src/nest/auth/jwt-auth.guard';
|
|
|
|
function context(req: unknown) {
|
|
return { switchToHttp: () => ({ getRequest: () => req }) } as never;
|
|
}
|
|
|
|
describe('JwtAuthGuard', () => {
|
|
const guard = new JwtAuthGuard();
|
|
|
|
it('rejects with the legacy 401 { error, code } when no token is present', () => {
|
|
let thrown: unknown;
|
|
try {
|
|
guard.canActivate(context({ headers: {}, cookies: {} }));
|
|
} catch (e) {
|
|
thrown = e;
|
|
}
|
|
expect(thrown).toBeInstanceOf(HttpException);
|
|
expect((thrown as HttpException).getStatus()).toBe(401);
|
|
expect((thrown as HttpException).getResponse()).toEqual({
|
|
error: 'Access token required',
|
|
code: 'AUTH_REQUIRED',
|
|
});
|
|
});
|
|
});
|