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()
})
})
})