import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest'; import { mount } from '@vue/test-utils'; import SearchBox from './SearchBox.vue'; describe('SearchBox (interaction composant + v-model debouncé)', () => { beforeEach(() => vi.useFakeTimers()); afterEach(() => vi.useRealTimers()); it('n’émet la valeur qu’après le délai de debounce', async () => { const wrapper = mount(SearchBox, { props: { modelValue: '', delay: 300 } }); const input = wrapper.find('input'); await input.setValue('vue'); // Avant le délai : rien n'est émis vers le parent. expect(wrapper.emitted('update:modelValue')).toBeFalsy(); vi.advanceTimersByTime(300); await wrapper.vm.$nextTick(); const emitted = wrapper.emitted('update:modelValue'); expect(emitted).toBeTruthy(); expect(emitted![emitted!.length - 1]).toEqual(['vue']); }); it('le bouton clear vide la valeur immédiatement', async () => { const wrapper = mount(SearchBox, { props: { modelValue: 'déjà', delay: 300 } }); await wrapper.find('input').setValue('texte'); await wrapper.find('.search-clear').trigger('click'); const emitted = wrapper.emitted('update:modelValue'); expect(emitted).toBeTruthy(); expect(emitted![emitted!.length - 1]).toEqual(['']); }); });