import { GET } from './route'; import { NextRequest } from 'next/server'; jest.mock('@/lib/monitoring', () => ({ monitor: { recordMetric: jest.fn(), getStats: jest.fn(() => ({ count: 100, min: 10, max: 100, average: 50, p95: 90, p99: 95, })), getCount: jest.fn(() => 1000), }, })); describe('/api/health', () => { beforeEach(() => { jest.clearAllMocks(); }); it('should return health status with all required fields', async () => { const response = await GET(); const data = await response.json(); expect(response.status).toBe(200); expect(data.status).toBe('ok'); expect(data.timestamp).toBeDefined(); expect(data.uptime).toBeDefined(); expect(data.version).toBeDefined(); expect(data.environment).toBeDefined(); }); it('should return memory usage information', async () => { const response = await GET(); const data = await response.json(); expect(data.memory).toBeDefined(); expect(data.memory.heapUsed).toBeGreaterThan(0); expect(data.memory.heapTotal).toBeGreaterThan(0); expect(data.memory.rss).toBeGreaterThan(0); }); it('should return performance metrics', async () => { const response = await GET(); const data = await response.json(); expect(data.metrics).toBeDefined(); expect(data.metrics.responseTime).toBeDefined(); expect(data.metrics.requestCount).toBeDefined(); }); it('should include database check', async () => { const response = await GET(); const data = await response.json(); expect(data.checks).toBeDefined(); expect(data.checks.database).toBeDefined(); expect(data.checks.database.status).toBeDefined(); }); it('should include memory check', async () => { const response = await GET(); const data = await response.json(); expect(data.checks.memory).toBeDefined(); expect(data.checks.memory.status).toBeDefined(); expect(data.checks.memory.usage).toBeDefined(); }); it('should record response time metric', async () => { const { monitor } = require('@/lib/monitoring'); await GET(); expect(monitor.recordMetric).toHaveBeenCalledWith('response_time', expect.any(Number)); }); it('should handle errors gracefully', async () => { const { monitor } = require('@/lib/monitoring'); monitor.getStats.mockImplementation(() => { throw new Error('Monitoring error'); }); const response = await GET(); const data = await response.json(); expect(response.status).toBe(503); expect(data.status).toBe('error'); expect(data.error).toBeDefined(); }); });