import { describe, expect, it, vi } from 'vitest'; const captureException = vi.fn(); const setTag = vi.fn(); vi.mock('@sentry/node', () => ({ withScope: (cb: (scope: { setTag: typeof setTag }) => void) => cb({ setTag }), captureException, })); vi.mock('hono/route', () => ({ routePath: () => '/test/path', })); vi.mock('@/utils/logger', () => ({ default: { error: vi.fn(), }, })); vi.mock('@/utils/otel', () => ({ requestMetric: { error: vi.fn(), }, })); describe('error handler sentry', () => { it('sends errors to sentry when enabled', async () => { process.env.SENTRY = 'dsn'; vi.resetModules(); const { errorHandler } = await import('@/errors'); const ctx = { req: { path: '/test/path', method: 'GET', query: () => 'json', }, res: { status: 500, headers: new Headers(), }, status: vi.fn(), header: vi.fn(), json: (payload: unknown) => payload, html: (payload: unknown) => payload, }; errorHandler(new Error('boom'), ctx as any); expect(setTag).toHaveBeenCalledWith('name', 'test'); expect(captureException).toHaveBeenCalled(); delete process.env.SENTRY; }); });