feat(front) : liste des tickets de pesée à 25 lignes/page par défaut (ERP-188)
Le tableau des tickets démarre désormais à 25 items/page (au lieu de 10) via defaultItemsPerPage de usePaginatedList. 25 fait partie des options [10, 25, 50] et reste sous le max serveur (50) ; l'utilisateur peut toujours rebasculer via le sélecteur. Test de contrat du repository ajouté.
This commit is contained in:
+58
@@ -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<WeighingTicket>` 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)
|
||||
})
|
||||
})
|
||||
@@ -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<WeighingTicket, WeighingTicketFilters>({ 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<WeighingTicket, WeighingTicketFilters>({
|
||||
url: '/weighing_tickets',
|
||||
defaultItemsPerPage: 25,
|
||||
})
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user