import { describe, it, expect } from 'vitest' import { mount } from '@vue/test-utils' import { defineComponent, h, ref, computed } from 'vue' import { emptyContact } from '~/modules/commercial/types/clientForm' import ClientContactBlock from '../ClientContactBlock.vue' // Auto-imports Nuxt/Vue utilises sans import explicite par le composant. vi.stubGlobal('useI18n', () => ({ t: (key: string) => key })) vi.stubGlobal('ref', ref) vi.stubGlobal('computed', computed) /** * Stub d'un champ Malio qui re-expose la prop `error` recue dans un attribut * data-* : permet de verifier que le bloc propage bien `:errors[champ]` sur le * bon champ (ERP-101 — mapping erreur 422 par champ, par ligne de collection). */ function errorProbe(testid: string) { return defineComponent({ name: `Probe-${testid}`, props: { modelValue: { type: [String, Number, null], default: undefined }, error: { type: String, default: '' }, label: { type: String, default: '' }, readonly: { type: Boolean, default: false }, }, setup(props) { return () => h('div', { 'data-testid': testid, 'data-error': props.error }) }, }) } function mountBlock(errors?: Record) { return mount(ClientContactBlock, { props: { modelValue: emptyContact(), title: 'Contact 1', ...(errors ? { errors } : {}), }, global: { stubs: { MalioButtonIcon: true, MalioInputPhone: true, MalioInputText: errorProbe('contact-text'), MalioInputEmail: errorProbe('contact-email'), }, }, }) } describe('ClientContactBlock — mapping erreur par champ (ERP-101)', () => { it('affiche l\'erreur serveur sur le champ email via la prop errors', () => { const wrapper = mountBlock({ email: 'Adresse e-mail invalide.' }) const email = wrapper.find('[data-testid="contact-email"]') expect(email.attributes('data-error')).toBe('Adresse e-mail invalide.') }) it('laisse les champs sans erreur quand errors est absent', () => { const wrapper = mountBlock() const email = wrapper.find('[data-testid="contact-email"]') expect(email.attributes('data-error')).toBe('') }) })