mirror of
https://github.com/mauriceboe/TREK.git
synced 2026-06-19 13:21:46 +00:00
0257e4e71e
First strangler migration (L1): /api/weather is served by a NestJS module.
- @trek/shared/weather Zod contract; Nest controller byte-identical to the legacy Express route (paths, query params, status codes, { error } bodies, lang default, ApiError/500 passthrough). Service reuses getWeather/getDetailedWeather (+ shared cache; MCP tools unchanged).
- Strangler routes /api/weather to Nest by default; the legacy Express route + its migration-time parity test were decommissioned in this PR.
- Frontend (FE2): weatherApi typed against the @trek/shared WeatherResult contract.
- Harness: reusable Nest-vs-Express parity harness, e2e harness (temp SQLite + seed/cookie helpers, real JwtAuthGuard), src/nest coverage gate raised to >=80%, src/nest test guide.
- Verified end-to-end on a prod mirror (dev1): 401/400/200 via Nest with real Open-Meteo data, Express route gone.
34 lines
1.2 KiB
TypeScript
34 lines
1.2 KiB
TypeScript
import { describe, it, expect, afterEach } from 'vitest';
|
|
import { getNestPrefixes, makeNestPathMatcher } from '../../../src/nest/strangler';
|
|
|
|
describe('strangler toggle', () => {
|
|
const original = process.env.NEST_PREFIXES;
|
|
afterEach(() => {
|
|
if (original === undefined) delete process.env.NEST_PREFIXES;
|
|
else process.env.NEST_PREFIXES = original;
|
|
});
|
|
|
|
it('defaults to the migrated prefixes (/api/_nest + /api/weather) when NEST_PREFIXES is unset', () => {
|
|
delete process.env.NEST_PREFIXES;
|
|
expect(getNestPrefixes()).toEqual(['/api/_nest', '/api/weather']);
|
|
});
|
|
|
|
it('parses NEST_PREFIXES (comma-separated, trimmed)', () => {
|
|
process.env.NEST_PREFIXES = '/api/weather, /api/airports';
|
|
expect(getNestPrefixes()).toEqual(['/api/weather', '/api/airports']);
|
|
});
|
|
|
|
it('treats an empty NEST_PREFIXES as "all routes on legacy"', () => {
|
|
process.env.NEST_PREFIXES = '';
|
|
expect(getNestPrefixes()).toEqual([]);
|
|
});
|
|
|
|
it('matches exact prefixes and subpaths but not lookalikes', () => {
|
|
const match = makeNestPathMatcher(['/api/_nest']);
|
|
expect(match('/api/_nest')).toBe(true);
|
|
expect(match('/api/_nest/health')).toBe(true);
|
|
expect(match('/api/_nestxyz')).toBe(false);
|
|
expect(match('/api/health')).toBe(false);
|
|
});
|
|
});
|