efded9fd40
Auto Tag Develop / tag (push) Successful in 12s
## Objectif Introduit un `CategoryType` dédié **ADRESSE** (module Catalog) consommé par le champ « Catégorie » des blocs adresse, en remplacement de la réutilisation détournée des types CLIENT / FOURNISSEUR. ## Changements **Backend** - Migration de seed du type ADRESSE + 6 catégories : Siège, Contact issues, Facturation, Livraison, Approvisionnement, Méthaniseur (idempotente, réversible) ; fixtures alignées. - `ClientAddress` : validation blacklist (DISTRIBUTEUR/COURTIER) remplacée par une whitelist « catégories de type ADRESSE uniquement ». - `SupplierAddress` : type requis FOURNISSEUR → ADRESSE (le bloc principal fournisseur reste en FOURNISSEUR). **Frontend** - Ref dédiée `addressCategories` (`?typeCode=ADRESSE`) dans les composables référentiels client et fournisseur. - Pages new/edit client et fournisseur câblées sur les blocs adresse. **Tests** - `CategoryAdresseSeedTest` (miroir du test PRESTATAIRE). - Adaptation des tests d'adresse client/fournisseur (sémantique whitelist ADRESSE) + helper `createAddressCategory()`. ## Vérifications - Back : suites Catalog + Architecture + adresse/fournisseur vertes (le flake JWT connu du hook est sans rapport, tests verts en isolation). - Front : Vitest vert (composables référentiels + ciblés). - php-cs-fixer : 0 correction ; eslint : OK. Reviewed-on: #147 Co-authored-by: tristan <tristan@yuno.malio.fr> Co-committed-by: tristan <tristan@yuno.malio.fr>
74 lines
2.9 KiB
TypeScript
74 lines
2.9 KiB
TypeScript
import { describe, it, expect, vi, beforeEach } from 'vitest'
|
|
|
|
// `useApi` est un auto-import Nuxt : on le stubbe globalement pour intercepter
|
|
// les appels de chargement des referentiels et controler les reponses Hydra.
|
|
const mockGet = vi.hoisted(() => vi.fn())
|
|
vi.stubGlobal('useApi', () => ({ get: mockGet }))
|
|
|
|
const { useSupplierReferentials } = await import('../useSupplierReferentials')
|
|
|
|
describe('useSupplierReferentials', () => {
|
|
beforeEach(() => {
|
|
mockGet.mockReset()
|
|
mockGet.mockResolvedValue({ member: [] })
|
|
})
|
|
|
|
it('charge les categories filtrees sur le type FOURNISSEUR (RG-2.10)', async () => {
|
|
await useSupplierReferentials().loadCommon()
|
|
|
|
expect(mockGet).toHaveBeenCalledWith(
|
|
'/categories',
|
|
expect.objectContaining({ pagination: 'false', typeCode: 'FOURNISSEUR' }),
|
|
expect.objectContaining({ toast: false }),
|
|
)
|
|
})
|
|
|
|
it('charge les categories d\'adresse filtrees sur le type ADRESSE', async () => {
|
|
await useSupplierReferentials().loadCommon()
|
|
|
|
expect(mockGet).toHaveBeenCalledWith(
|
|
'/categories',
|
|
expect.objectContaining({ pagination: 'false', typeCode: 'ADRESSE' }),
|
|
expect.objectContaining({ toast: false }),
|
|
)
|
|
})
|
|
|
|
it('mappe les categories en options { value: IRI, label: name, code }', async () => {
|
|
mockGet.mockImplementation((url: string) => {
|
|
if (url === '/categories') {
|
|
return Promise.resolve({ member: [{ '@id': '/api/categories/9', code: 'NEGOCIANT', name: 'Négociant' }] })
|
|
}
|
|
return Promise.resolve({ member: [] })
|
|
})
|
|
|
|
const refs = useSupplierReferentials()
|
|
await refs.loadCommon()
|
|
|
|
expect(refs.categories.value).toEqual([{ value: '/api/categories/9', label: 'Négociant', code: 'NEGOCIANT' }])
|
|
})
|
|
|
|
it('ne charge ni distributeurs ni courtiers (absents du modele fournisseur)', async () => {
|
|
await useSupplierReferentials().loadCommon()
|
|
|
|
const urls = mockGet.mock.calls.map(c => c[0])
|
|
expect(urls).not.toContain('/clients')
|
|
expect(urls).toEqual(
|
|
expect.arrayContaining(['/categories', '/sites', '/tva_modes', '/payment_delays', '/payment_types', '/banks']),
|
|
)
|
|
})
|
|
|
|
it('reste resilient : un referentiel en echec n\'empeche pas les autres', async () => {
|
|
mockGet.mockImplementation((url: string) => {
|
|
if (url === '/categories') return Promise.reject(new Error('403'))
|
|
if (url === '/banks') return Promise.resolve({ member: [{ '@id': '/api/banks/1', code: 'SG', label: 'Société Générale' }] })
|
|
return Promise.resolve({ member: [] })
|
|
})
|
|
|
|
const refs = useSupplierReferentials()
|
|
await refs.loadCommon()
|
|
|
|
expect(refs.categories.value).toEqual([])
|
|
expect(refs.banks.value).toEqual([{ value: '/api/banks/1', label: 'Société Générale' }])
|
|
})
|
|
})
|