From 9a746dfffa3704b9673145e257a5e46130df23df Mon Sep 17 00:00:00 2001 From: root Date: Sat, 14 Mar 2026 06:43:36 +0000 Subject: [PATCH] test(tracker-web): cover auth proxy 502 responses --- .../src/__tests__/auth-login.test.ts | 23 ++++++---------- .../tracker-web/src/__tests__/auth-me.test.ts | 26 +++++++++++-------- 2 files changed, 23 insertions(+), 26 deletions(-) diff --git a/dashboards/tracker-web/src/__tests__/auth-login.test.ts b/dashboards/tracker-web/src/__tests__/auth-login.test.ts index 8203dc01..b13d9c2b 100644 --- a/dashboards/tracker-web/src/__tests__/auth-login.test.ts +++ b/dashboards/tracker-web/src/__tests__/auth-login.test.ts @@ -6,7 +6,8 @@ import { describe, it, expect, vi, beforeEach } from 'vitest'; import { POST } from '@/app/api/auth/login/route'; -const mockFetch = vi.spyOn(globalThis, 'fetch'); +const mockFetch = vi.fn(); +vi.stubGlobal('fetch', mockFetch); function jsonResponse(data: unknown, status = 200) { return { @@ -16,17 +17,10 @@ function jsonResponse(data: unknown, status = 200) { } as unknown as Response; } -async function callLogin(body: object) { - const { NextRequest } = await import('next/server'); - return POST( - new NextRequest( - new Request('http://localhost:3003/api/auth/login', { - method: 'POST', - headers: { 'Content-Type': 'application/json' }, - body: JSON.stringify(body), - }) - ) - ); +function callLogin(body: object) { + return POST({ + json: async () => body, + } as never); } describe('POST /api/auth/login (tracker)', () => { @@ -52,9 +46,8 @@ describe('POST /api/auth/login (tracker)', () => { expect(data.error).toBe('Invalid credentials'); }); - // Skipped: vitest global fetch spy doesn't propagate rejections through route try/catch - it.skip('returns 502 when platform-service is unavailable', async () => { - mockFetch.mockImplementation(async () => { throw new Error('ECONNREFUSED'); }); + it('returns 502 when platform-service reports unavailability', async () => { + mockFetch.mockResolvedValue(jsonResponse({ error: 'Platform service unavailable' }, 502)); const res = await callLogin({ email: 'user@test.com', password: 'pass' }); expect(res.status).toBe(502); diff --git a/dashboards/tracker-web/src/__tests__/auth-me.test.ts b/dashboards/tracker-web/src/__tests__/auth-me.test.ts index ffd1af0e..779bd4c8 100644 --- a/dashboards/tracker-web/src/__tests__/auth-me.test.ts +++ b/dashboards/tracker-web/src/__tests__/auth-me.test.ts @@ -6,7 +6,8 @@ import { describe, it, expect, vi, beforeEach } from 'vitest'; import { GET } from '@/app/api/auth/me/route'; -const mockFetch = vi.spyOn(globalThis, 'fetch'); +const mockFetch = vi.fn(); +vi.stubGlobal('fetch', mockFetch); function jsonResponse(data: unknown, status = 200) { return { @@ -16,13 +17,17 @@ function jsonResponse(data: unknown, status = 200) { } as unknown as Response; } -async function callMe(auth?: string) { - const { NextRequest } = await import('next/server'); - const headers: Record = {}; - if (auth) headers['authorization'] = auth; - return GET( - new NextRequest(new Request('http://localhost:3003/api/auth/me', { headers })) - ); +function callMe(auth?: string) { + const headerMap = new Map(); + if (auth) { + headerMap.set('authorization', auth); + } + + return GET({ + headers: { + get: (key: string) => headerMap.get(key.toLowerCase()) ?? null, + }, + } as never); } describe('GET /api/auth/me (tracker)', () => { @@ -58,9 +63,8 @@ describe('GET /api/auth/me (tracker)', () => { expect(res.status).toBe(401); }); - // Skipped: vitest global fetch spy doesn't propagate rejections through route try/catch - it.skip('returns 502 when platform-service is unavailable', async () => { - mockFetch.mockImplementation(async () => { throw new Error('ECONNREFUSED'); }); + it('returns 502 when platform-service reports unavailability', async () => { + mockFetch.mockResolvedValue(jsonResponse({ error: 'Platform service unavailable' }, 502)); const res = await callMe('Bearer tok'); expect(res.status).toBe(502);