fix(transport) : pré-validation front du bloc prix — erreurs inline sous tous les champs requis (selects branche) (ERP-169)
This commit is contained in:
@@ -842,9 +842,16 @@ describe('useCarrierForm — onglet Prix (ERP-169)', () => {
|
||||
it('submitPrices : PATCH des prix existants sur /carrier_prices/{id}', async () => {
|
||||
mockPatch.mockResolvedValueOnce({})
|
||||
const form = createdForm()
|
||||
form.addPrice()
|
||||
const p = form.prices.value[0]
|
||||
if (p) { p.id = 50; p.direction = 'FOURNISSEUR'; p.supplierIri = '/api/suppliers/5'; p.price = '10' }
|
||||
if (p) {
|
||||
p.id = 50
|
||||
p.direction = 'FOURNISSEUR'
|
||||
p.supplierIri = '/api/suppliers/5'
|
||||
p.supplierSupplyAddressIri = '/api/supplier_addresses/9'
|
||||
p.deliverySiteIri = '/api/sites/1'
|
||||
p.price = '10'
|
||||
p.priceState = 'VALIDE'
|
||||
}
|
||||
|
||||
await form.submitPrices(vi.fn())
|
||||
|
||||
@@ -852,19 +859,42 @@ describe('useCarrierForm — onglet Prix (ERP-169)', () => {
|
||||
expect(mockPatch).toHaveBeenCalledWith('/carrier_prices/50', expect.objectContaining({ direction: 'FOURNISSEUR' }), { toast: false })
|
||||
})
|
||||
|
||||
it('submitPrices : mappe les 422 par ligne et ne finalise pas', async () => {
|
||||
it('front : bloc prix incomplet → erreurs inline sous chaque champ requis, pas d\'appel back', async () => {
|
||||
const form = createdForm()
|
||||
// Bloc CLIENT par défaut, rien d'autre rempli.
|
||||
const ok = await form.submitPrices(vi.fn())
|
||||
|
||||
expect(ok).toBe(false)
|
||||
expect(mockPost).not.toHaveBeenCalled()
|
||||
const errs = form.priceErrors.value[0]
|
||||
expect(errs?.client).toBeTruthy()
|
||||
expect(errs?.clientDeliveryAddress).toBeTruthy()
|
||||
expect(errs?.departureSite).toBeTruthy()
|
||||
expect(errs?.price).toBeTruthy()
|
||||
expect(errs?.priceState).toBeTruthy()
|
||||
})
|
||||
|
||||
it('submitPrices : mappe les 422 back par ligne (appartenance adresse) et ne finalise pas', async () => {
|
||||
mockPost.mockRejectedValueOnce({
|
||||
response: { status: 422, _data: { violations: [{ propertyPath: 'departureSite', message: 'Le site de depart est obligatoire pour un prix client.' }] } },
|
||||
response: { status: 422, _data: { violations: [{ propertyPath: 'clientDeliveryAddress', message: 'L\'adresse de livraison doit appartenir au client selectionne.' }] } },
|
||||
})
|
||||
const form = createdForm()
|
||||
form.addPrice()
|
||||
// Tous les champs requis remplis (le pré-check front passe) ; le back 422 sur
|
||||
// une RG qu'il est seul à connaître (appartenance de l'adresse au client).
|
||||
const p = form.prices.value[0]
|
||||
if (p) { p.direction = 'CLIENT'; p.clientIri = '/api/clients/3'; p.price = '10' }
|
||||
if (p) {
|
||||
p.direction = 'CLIENT'
|
||||
p.clientIri = '/api/clients/3'
|
||||
p.clientDeliveryAddressIri = '/api/client_addresses/8'
|
||||
p.departureSiteIri = '/api/sites/1'
|
||||
p.price = '10'
|
||||
p.priceState = 'EN_COURS'
|
||||
}
|
||||
|
||||
const ok = await form.submitPrices(vi.fn())
|
||||
|
||||
expect(ok).toBe(false)
|
||||
expect(form.priceErrors.value[0]?.departureSite).toBe('Le site de depart est obligatoire pour un prix client.')
|
||||
expect(form.priceErrors.value[0]?.clientDeliveryAddress).toBe('L\'adresse de livraison doit appartenir au client selectionne.')
|
||||
expect(form.isValidated('prices')).toBe(false)
|
||||
})
|
||||
|
||||
|
||||
Reference in New Issue
Block a user