diff --git a/frontend/modules/logistique/composables/__tests__/useWeighingTicketsRepository.spec.ts b/frontend/modules/logistique/composables/__tests__/useWeighingTicketsRepository.spec.ts new file mode 100644 index 0000000..88ec0e5 --- /dev/null +++ b/frontend/modules/logistique/composables/__tests__/useWeighingTicketsRepository.spec.ts @@ -0,0 +1,58 @@ +import { describe, it, expect, vi, beforeEach } from 'vitest' +import { useWeighingTicketsRepository, type WeighingTicket } from '../useWeighingTicketsRepository' + +const mockApiGet = vi.hoisted(() => vi.fn()) +vi.stubGlobal('useApi', () => ({ get: mockApiGet })) + +/** + * Tests du repertoire des tickets de pesee (M5, ERP-188). + * + * `useWeighingTicketsRepository` est une fine enveloppe de + * `usePaginatedList` sur `/weighing_tickets`. Les invariants + * generiques de pagination sont deja couverts par `usePaginatedList.test.ts` ; + * on verifie ici le CONTRAT propre au repertoire : + * - la ressource ciblee est bien `/weighing_tickets` ; + * - le header `Accept: application/ld+json` est envoye (sinon API Platform 4 + * renvoie un tableau plat sans pagination) ; + * - DEFAUT 25 ITEMS/PAGE : la liste etant consultee en volume, le premier + * fetch demande 25 items (et non le defaut 10) — l'utilisateur peut toujours + * rebasculer via le selecteur. + */ +describe('useWeighingTicketsRepository', () => { + beforeEach(() => { + mockApiGet.mockReset() + }) + + /** Une page de tickets Hydra minimale. */ + const PAGE: WeighingTicket[] = [ + { + id: 1, + status: 'VALIDATED', + number: '86-TP-0001', + client: { id: 7, companyName: 'ACME' }, + supplier: null, + otherLabel: null, + displayDate: '2026-06-17T09:12:00+02:00', + netWeight: 7150, + }, + ] + + it('cible /weighing_tickets en Hydra avec 25 items/page par defaut', async () => { + mockApiGet.mockResolvedValueOnce({ member: PAGE, totalItems: 1 }) + const repo = useWeighingTicketsRepository() + + await repo.fetch() + + expect(mockApiGet).toHaveBeenCalledTimes(1) + const [url, query, opts] = mockApiGet.mock.calls[0] + expect(url).toBe('/weighing_tickets') + expect(query).toMatchObject({ page: 1, itemsPerPage: 25 }) + expect(opts).toMatchObject({ + toast: false, + headers: { Accept: 'application/ld+json' }, + }) + expect(repo.itemsPerPage.value).toBe(25) + expect(repo.items.value).toEqual(PAGE) + expect(repo.totalItems.value).toBe(1) + }) +}) diff --git a/frontend/modules/logistique/composables/useWeighingTicketsRepository.ts b/frontend/modules/logistique/composables/useWeighingTicketsRepository.ts index c670f5b..0e059e5 100644 --- a/frontend/modules/logistique/composables/useWeighingTicketsRepository.ts +++ b/frontend/modules/logistique/composables/useWeighingTicketsRepository.ts @@ -62,5 +62,11 @@ export interface WeighingTicketFilters { * singleton) : l'etat tableau est propre a l'ecran et meurt avec lui. */ export function useWeighingTicketsRepository() { - return usePaginatedList({ url: '/weighing_tickets' }) + // Defaut 25 items/page (au lieu de 10) : la liste des tickets de pesee est + // consultee en volume. 25 fait partie des options [10, 25, 50] et reste sous le + // max serveur (50). L'utilisateur peut toujours basculer via le selecteur. + return usePaginatedList({ + url: '/weighing_tickets', + defaultItemsPerPage: 25, + }) }