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.
|
* singleton) : l'etat tableau est propre a l'ecran et meurt avec lui.
|
||||||
*/
|
*/
|
||||||
export function useWeighingTicketsRepository() {
|
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