import { beforeEach, describe, expect, it, vi } from 'vitest' /** * Tests de la saisie assistée QUALIMAT (M4 Transport, ERP-166 — RG-4.01). * * `useQualimatSearch` interroge `GET /api/qualimat_carriers?search=`. On vérifie le * CONTRAT (pas le timing du debounce, couvert par `debounce.test.ts`) via `fetchNow` : * - ressource ciblée + paramètre `search` (trimé) + header `Accept: application/ld+json` ; * - consommation de l'enveloppe Hydra (`member`) ; * - échec réseau → résultats vidés, pas de throw (recherche non bloquante). */ const mockGet = vi.hoisted(() => vi.fn()) vi.stubGlobal('useApi', () => ({ get: mockGet, post: vi.fn(), put: vi.fn(), patch: vi.fn(), delete: vi.fn(), })) const { useQualimatSearch } = await import('../useQualimatSearch') describe('useQualimatSearch', () => { beforeEach(() => { mockGet.mockReset() }) it('fetchNow cible /qualimat_carriers (search trimé, ld+json) et consomme member', async () => { mockGet.mockResolvedValueOnce({ member: [{ '@id': '/api/qualimat_carriers/1', id: '1', name: 'ACME', validityDate: '2027-01-01' }], }) const q = useQualimatSearch() await q.fetchNow(' acme ') expect(mockGet).toHaveBeenCalledWith( '/qualimat_carriers', { search: 'acme' }, { headers: { Accept: 'application/ld+json' }, toast: false }, ) expect(q.results.value).toHaveLength(1) expect(q.results.value[0]?.name).toBe('ACME') expect(q.loading.value).toBe(false) }) it('échec réseau : résultats vidés, pas de throw', async () => { mockGet.mockRejectedValueOnce(new Error('network')) const q = useQualimatSearch() await expect(q.fetchNow('x')).resolves.toBeUndefined() expect(q.results.value).toEqual([]) expect(q.loading.value).toBe(false) }) })