import express from 'express';
import request from 'supertest';
import { describe, expect, it, vi } from 'vitest';
import { apiErrorHandler, notFoundHandler } from '../error-handler';

describe('error handler middleware', () => {
  it('returns sanitized 500 responses', async () => {
    const logSpy = vi.spyOn(console, 'error').mockImplementation(() => {});
    const app = express();

    app.get('/boom', (_req, _res, next) => {
      next(new Error('database exploded'));
    });
    app.use(apiErrorHandler);

    const res = await request(app).get('/boom');

    expect(res.status).toBe(500);
    expect(res.body).toEqual({ error: 'Internal server error' });
    expect(logSpy).toHaveBeenCalled();
    logSpy.mockRestore();
  });

  it('returns explicit client errors when status is set', async () => {
    const app = express();

    app.get('/bad-request', (_req, _res, next) => {
      const err = new Error('Invalid input');
      (err as Error & { status?: number }).status = 400;
      next(err);
    });
    app.use(apiErrorHandler);

    const res = await request(app).get('/bad-request');

    expect(res.status).toBe(400);
    expect(res.body).toEqual({ error: 'Invalid input' });
  });

  it('returns JSON 404s for unknown API routes', async () => {
    const app = express();
    app.use(notFoundHandler);

    const res = await request(app).get('/missing');

    expect(res.status).toBe(404);
    expect(res.body).toEqual({ error: 'Route not found: GET /missing' });
  });
});
