import { beforeEach, describe, expect, it, vi } from 'vitest' import type { Request, Response } from 'express' // ---------- Service mockeado ---------- const buscarMock = vi.hoisted(() => vi.fn()) vi.mock('../services/buscar.service.js', () => ({ buscar: buscarMock })) import { buscarEndpoint } from './buscar.controller.js' function req(query: Record = {}): Request { return { query } as unknown as Request } function res(): Response { const json = vi.fn() return { json } as unknown as Response } beforeEach(() => { vi.clearAllMocks() }) describe('buscarEndpoint (GET /api/buscar)', () => { it('extrae q del query string y llama buscar', async () => { buscarMock.mockResolvedValue([]) const r = res() await buscarEndpoint(req({ q: 'María' }), r) expect(buscarMock).toHaveBeenCalledWith('María', 20) expect(r.json).toHaveBeenCalledWith([]) }) it('q vacío (no string) → termino vacío', async () => { buscarMock.mockResolvedValue([]) const r = res() await buscarEndpoint(req({}), r) expect(buscarMock).toHaveBeenCalledWith('', 20) }) it('limite válido del query string', async () => { buscarMock.mockResolvedValue([]) const r = res() await buscarEndpoint(req({ q: 'x', limite: '10' }), r) expect(buscarMock).toHaveBeenCalledWith('x', 10) }) it('limite inválido o > 50 se clampa a 20', async () => { buscarMock.mockResolvedValue([]) const r = res() await buscarEndpoint(req({ q: 'x', limite: 'abc' }), r) expect(buscarMock).toHaveBeenCalledWith('x', 20) const r2 = res() await buscarEndpoint(req({ q: 'x', limite: '100' }), r2) expect(buscarMock).toHaveBeenCalledWith('x', 50) }) it('devuelve los resultados del service como JSON', async () => { const fakeResults = [ { tipo: 'lead', id: 'l1', nombre: 'Test', detalle: '', url: '/app/#leads' }, ] buscarMock.mockResolvedValue(fakeResults) const r = res() await buscarEndpoint(req({ q: 'Test' }), r) expect(r.json).toHaveBeenCalledWith(fakeResults) }) })