import { describe, it, expect, vi } from 'vitest' import { mount } from '@vue/test-utils' import { defineComponent, h, ref, computed } from 'vue' import { emptyContact } from '~/modules/commercial/types/supplierForm' import SupplierContactBlock from '../SupplierContactBlock.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 data-* attribut. */ 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(SupplierContactBlock, { props: { modelValue: emptyContact(), title: 'Contact 1', ...(errors ? { errors } : {}), }, global: { stubs: { MalioButtonIcon: true, MalioInputPhone: true, MalioInputText: errorProbe('contact-text'), MalioInputEmail: errorProbe('contact-email'), }, }, }) } describe('SupplierContactBlock — 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.' }) expect(wrapper.find('[data-testid="contact-email"]').attributes('data-error')).toBe('Adresse e-mail invalide.') }) it('laisse les champs sans erreur quand errors est absent', () => { const wrapper = mountBlock() expect(wrapper.find('[data-testid="contact-email"]').attributes('data-error')).toBe('') }) })