import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest' import { ref, nextTick, type Ref, defineComponent } from 'vue' import { mount } from '@vue/test-utils' import { useMonthButtonCustomization } from '../useMonthButtonCustomization' describe('useMonthButtonCustomization', () => { let isPickerVisibleGetter: () => boolean // Définir explicitement le type pour éviter les erreurs de compatibilité let monthName: Ref let yearName: Ref const mountUseMonthButtonCustomization = (options?: { isVisibleGetter?: () => boolean month?: Ref year?: Ref }) => { const exposed = {} as ReturnType const TestComponent = defineComponent({ setup() { Object.assign( exposed, useMonthButtonCustomization( options?.isVisibleGetter ?? isPickerVisibleGetter, options?.month ?? monthName, options?.year ?? yearName, ), ) return () => null }, }) const wrapper = mount(TestComponent) return { exposed, wrapper } } beforeEach(() => { // Réinitialiser les refs pour chaque test avec le type exact attendu par le composable monthName = ref(null) yearName = ref(null) document.body.innerHTML = `
` isPickerVisibleGetter = () => true }) afterEach(() => { document.body.innerHTML = '' }) // Test de l'affichage des mois personnalisés via les noms de mois fournis it('personnalise correctement les noms de mois (janvier -> Janv.)', async () => { monthName.value = 'janvier' const { exposed } = mountUseMonthButtonCustomization() await exposed.customizeMonthButton() await nextTick() const monthBtn = document.querySelector('.v-date-picker-controls__month-btn')! expect(monthBtn.textContent).toContain('janv.') }) it('personnalise correctement les noms de mois (février -> févr.)', async () => { monthName.value = 'février' const { exposed } = mountUseMonthButtonCustomization() await exposed.customizeMonthButton() await nextTick() const monthBtn = document.querySelector('.v-date-picker-controls__month-btn')! expect(monthBtn.textContent).toContain('févr.') }) it('capitalise le premier caractère si le mois n\'est pas reconnu', async () => { monthName.value = 'pluviose' const { exposed } = mountUseMonthButtonCustomization() await exposed.customizeMonthButton() await nextTick() const monthBtn = document.querySelector('.v-date-picker-controls__month-btn')! expect(monthBtn.textContent).toContain('Pluviose') }) it('customise les boutons du mois et de l’année', async () => { // S'assurer que monthName est null pour ce test monthName.value = null const { exposed } = mountUseMonthButtonCustomization() await exposed.customizeMonthButton() await nextTick() const monthBtn = document.querySelector('.v-date-picker-controls__month-btn')! const yearBtn = document.querySelector('.v-date-picker-controls__mode-btn')! expect(monthBtn.innerHTML).toContain(' { monthName.value = 'mars' yearName.value = '2030' const { exposed } = mountUseMonthButtonCustomization() await exposed.customizeMonthButton() await nextTick() const monthBtn = document.querySelector('.v-date-picker-controls__month-btn')! const yearBtn = document.querySelector('.v-date-picker-controls__mode-btn')! expect(monthBtn.textContent).toContain('mars') expect(yearBtn.textContent).toContain('2030') }) it('observe les changements du DOM et personnalise automatiquement', async () => { const { exposed } = mountUseMonthButtonCustomization({ isVisibleGetter: () => true }) const spy = vi.spyOn(document, 'querySelectorAll') exposed.setupMonthButtonObserver() await nextTick() expect(spy).toHaveBeenCalledWith('.v-date-picker-controls') }) })