import { cleanup, fireEvent, render, screen } from '@testing-library/react'
import { afterEach, describe, expect, it } from 'vitest'
import { CampaignMobileMenu } from '@/components/CampaignMobileMenu'
afterEach(cleanup)
const openMenu = () => {
const trigger = screen.getByRole('button', { name: 'Abrir menu' })
fireEvent.click(trigger)
return trigger
}
describe('CampaignMobileMenu', () => {
it('abre no trigger e move o foco para o primeiro link', () => {
render()
const trigger = openMenu()
expect(trigger.getAttribute('aria-expanded')).toBe('true')
const nav = screen.getByRole('navigation', { name: 'Navegação móvel' })
expect(nav).toBeTruthy()
expect(screen.getByRole('link', { name: 'Artigos' }).getAttribute('href')).toBe('/artigos')
expect(screen.getByRole('link', { name: 'Bandeiras' }).getAttribute('href')).toBe('#bandeiras')
expect(screen.getByRole('link', { name: 'Fotos' }).getAttribute('href')).toBe('/fotos')
expect(screen.getByRole('link', { name: 'Início' }).getAttribute('href')).toBe('/')
expect(document.activeElement).toBe(screen.getByRole('link', { name: 'Artigos' }))
})
it('usa o hash absoluto da home no menu das páginas internas', () => {
render()
openMenu()
expect(screen.getByRole('link', { name: 'Bandeiras' }).getAttribute('href')).toBe('/#bandeiras')
})
it('fecha no Escape e devolve o foco ao trigger', () => {
render()
const trigger = openMenu()
fireEvent.keyDown(document, { key: 'Escape' })
expect(trigger.getAttribute('aria-expanded')).toBe('false')
expect(screen.queryByRole('navigation', { name: 'Navegação móvel' })).toBeNull()
expect(document.activeElement).toBe(trigger)
})
it('fecha no clique fora e no X', () => {
render()
openMenu()
fireEvent.pointerDown(document.body)
expect(screen.queryByRole('navigation', { name: 'Navegação móvel' })).toBeNull()
openMenu()
fireEvent.click(screen.getByRole('button', { name: 'Fechar painel' }))
expect(screen.queryByRole('navigation', { name: 'Navegação móvel' })).toBeNull()
})
it('fecha ao escolher um link', () => {
render()
openMenu()
fireEvent.click(screen.getByRole('link', { name: 'Artigos' }))
expect(screen.queryByRole('navigation', { name: 'Navegação móvel' })).toBeNull()
})
it('marca a seção atual no menu móvel', () => {
render()
openMenu()
expect(screen.getByRole('link', { name: 'Fotos' }).getAttribute('aria-current')).toBe('page')
expect(screen.getByRole('link', { name: 'Artigos' }).getAttribute('aria-current')).toBeNull()
})
})