import { describe, it, expect, beforeEach, vi } from 'vitest' import { useDatePickerAccessibility } from '../useDatePickerAccessibility' import { mount } from '@vue/test-utils' // Créer un composant vide pour servir de contexte à l'exécution des hooks import { defineComponent } from 'vue' // Composant vide qui servira de contexte pour les hooks Vue const TestComponent = defineComponent({ setup() { const { updateAccessibility, handleKeyDown, fixAriaAttributes } = useDatePickerAccessibility() return { updateAccessibility, handleKeyDown, fixAriaAttributes, } }, template: '
', }) describe('useDatePickerAccessibility', () => { // Variables pour stocker les méthodes du composable let updateAccessibility: ReturnType['updateAccessibility'] let handleKeyDown: ReturnType['handleKeyDown'] // Wrapper pour le composant de test let wrapper: ReturnType['updateAccessibility'] handleKeyDown: ReturnType['handleKeyDown'] fixAriaAttributes: ReturnType['fixAriaAttributes'] }>> beforeEach(() => { // Monter le composant de test pour fournir un contexte aux hooks Vue wrapper = mount(TestComponent) as unknown as ReturnType['updateAccessibility'] handleKeyDown: ReturnType['handleKeyDown'] fixAriaAttributes: ReturnType['fixAriaAttributes'] }>> // Obtenir les fonctions du composable directement depuis le composant monté updateAccessibility = wrapper.vm.updateAccessibility! handleKeyDown = wrapper.vm.handleKeyDown! // Créer une structure DOM simulée pour les tests document.body.innerHTML = `
` }) it('sets correct aria-label attributes on navigation buttons', async () => { // Appeler la fonction updateAccessibility await updateAccessibility() // Récupérer les boutons const buttons = document.querySelectorAll('.v-date-picker-header button') // Vérifier que les attributs aria-label sont correctement définis expect(buttons[0]?.getAttribute('aria-label')).toBe('Mois précédent') expect(buttons[1]?.getAttribute('aria-label')).toBe(null) // Pas d'icône, donc pas d'attribu expect(buttons[2]?.getAttribute('aria-label')).toBe('Mois suivant') }) it('handles missing elements gracefully', async () => { // Supprimer les éléments du DOM document.body.innerHTML = '' // La fonction ne devrait pas générer d'erreur même si les éléments n'existent pas await expect(updateAccessibility()).resolves.not.toThrow() }) it('handles different icons correctly', async () => { // Modifier les icônes document.body.innerHTML = `
` // Appeler la fonction updateAccessibility await updateAccessibility() // Récupérer les boutons const buttons = document.querySelectorAll('.v-date-picker-header button') // Vérifier que les attributs aria-label sont correctement définis expect(buttons[0]?.getAttribute('aria-label')).toBe(null) // Pas de chevron-lef expect(buttons[1]?.getAttribute('aria-label')).toBe(null) // Pas d'icône expect(buttons[2]?.getAttribute('aria-label')).toBe(null) // Pas de chevron-righ }) it('ne crée pas de bloc sr-only instructions (comportement actuel)', async () => { await updateAccessibility() const srOnlyEl = document.querySelector('.sr-only-instructions') expect(srOnlyEl).toBeNull() }) describe('handleKeyDown', () => { it('simulates a click event when Enter key is pressed', () => { // Créer une fonction d'espionnage autonome plutôt que d'espionner une méthode existante const clickHandlerSpy = vi.fn() // Créer un élément bouton avec un gestionnaire de clic espion const button = document.createElement('button') button.addEventListener('click', clickHandlerSpy) document.body.appendChild(button) button.focus() // Créer un événement clavier pour la touche Entrée const enterEvent = new KeyboardEvent('keydown', { key: 'Enter', bubbles: true, cancelable: true, }) // Espionner la méthode preventDefault de l'événement const preventDefaultSpy = vi.spyOn(enterEvent, 'preventDefault') // Appeler la fonction handleKeyDown avec l'événement handleKeyDown(enterEvent) // Vérifier que preventDefault a été appelé expect(preventDefaultSpy).toHaveBeenCalled() // Vérifier que le gestionnaire de clic a été déclenché suite à l'événement simulé expect(clickHandlerSpy).toHaveBeenCalled() }) it('does nothing when a key other than Enter is pressed', () => { // Créer une fonction d'espionnage autonome const clickHandlerSpy = vi.fn() // Créer un élément bouton avec un gestionnaire de clic espion const button = document.createElement('button') button.addEventListener('click', clickHandlerSpy) document.body.appendChild(button) button.focus() // Créer un événement clavier pour une touche autre qu'Entrée (par ex: Espace) const spaceEvent = new KeyboardEvent('keydown', { key: 'Space', bubbles: true, cancelable: true, }) // Espionner la méthode preventDefault de l'événement const preventDefaultSpy = vi.spyOn(spaceEvent, 'preventDefault') // Appeler la fonction handleKeyDown avec l'événement handleKeyDown(spaceEvent) // Vérifier que preventDefault n'a pas été appelé expect(preventDefaultSpy).not.toHaveBeenCalled() // Vérifier qu'aucun événement de clic n'a été déclenché expect(clickHandlerSpy).not.toHaveBeenCalled() }) it('handles the case when no element is focused', () => { // S'assurer qu'aucun élément n'est focalisé document.body.focus() // Créer un événement clavier pour la touche Entrée const enterEvent = new KeyboardEvent('keydown', { key: 'Enter', bubbles: true, cancelable: true, }) // Vérifier que la fonction ne génère pas d'erreur expect(() => handleKeyDown(enterEvent)).not.toThrow() }) }) })