/** * devAuthBypass() middleware — unit tests. * * Tests the three behavioral cases: * 1. NODE_ENV='production' → pure passthrough (hard guard), regardless of DEV_AUTH_BYPASS * 2. NODE_ENV!='production' + DEV_AUTH_BYPASS unset → passthrough (no user injected) * 3. NODE_ENV!='production' + DEV_AUTH_BYPASS='true' → DEV_USER injected into context */ import { describe, it, expect, afterEach } from 'vitest'; import { Hono } from 'hono'; // We import after env manipulation since devAuthBypass() reads env vars at call time. // Each test resets the module registry via vi.resetModules() to re-evaluate the function // with the current process.env values. describe('devAuthBypass middleware', () => { const originalNodeEnv = process.env.NODE_ENV; const originalBypassFlag = process.env.DEV_AUTH_BYPASS; afterEach(() => { // Restore env after each test process.env.NODE_ENV = originalNodeEnv; if (originalBypassFlag === undefined) { delete process.env.DEV_AUTH_BYPASS; } else { process.env.DEV_AUTH_BYPASS = originalBypassFlag; } }); it('is a pure passthrough in production (NODE_ENV=production), even when DEV_AUTH_BYPASS=true', async () => { process.env.NODE_ENV = 'production'; process.env.DEV_AUTH_BYPASS = 'true'; // Import after env setup const { devAuthBypass } = await import('../../src/auth/devBypass.js'); const app = new Hono(); app.use('/api/*', devAuthBypass()); let capturedUser: unknown = undefined; app.get('/api/test', (c) => { capturedUser = c.get('user'); return c.json({ ok: true }); }); const res = await app.request('/api/test'); expect(res.status).toBe(200); // Hard guard: user must NOT be injected in production expect(capturedUser).toBeUndefined(); }); it('is a passthrough when NODE_ENV!=production and DEV_AUTH_BYPASS is not set', async () => { process.env.NODE_ENV = 'test'; delete process.env.DEV_AUTH_BYPASS; const { devAuthBypass } = await import('../../src/auth/devBypass.js'); const app = new Hono(); app.use('/api/*', devAuthBypass()); let capturedUser: unknown = undefined; app.get('/api/test', (c) => { capturedUser = c.get('user'); return c.json({ ok: true }); }); const res = await app.request('/api/test'); expect(res.status).toBe(200); expect(capturedUser).toBeUndefined(); }); it('injects DEV_USER when NODE_ENV!=production and DEV_AUTH_BYPASS=true', async () => { process.env.NODE_ENV = 'test'; process.env.DEV_AUTH_BYPASS = 'true'; const { devAuthBypass, DEV_USER } = await import('../../src/auth/devBypass.js'); const app = new Hono(); app.use('/api/*', devAuthBypass()); let capturedUser: unknown = undefined; app.get('/api/test', (c) => { capturedUser = c.get('user'); return c.json({ ok: true }); }); const res = await app.request('/api/test'); expect(res.status).toBe(200); // User must be the fixed DEV_USER expect(capturedUser).toBeDefined(); expect(capturedUser).toEqual(DEV_USER); expect((capturedUser as typeof DEV_USER).displayName).toBe('Dev User'); expect((capturedUser as typeof DEV_USER).oidcSub).toBe('dev-user'); }); });