import '@testing-library/jest-dom'
import { fireEvent, render, screen } from '@testing-library/react'
import { axe, toHaveNoViolations } from 'jest-axe'
import { vi } from 'vitest'
import { PktHeader } from './Header'
expect.extend(toHaveNoViolations)
// Mock useWindowWidth hook to control viewport size
let mockedWidth = 1400
vi.mock('../../hooks/useWindowWidth', () => ({
useWindowWidth: () => mockedWidth,
}))
describe('PktHeader', () => {
beforeAll(() => {
// jsdom does not implement scrollTo; our scroll lock hook uses it
window.scrollTo = vi.fn()
})
beforeEach(() => {
mockedWidth = 1400 // Reset to desktop by default
vi.clearAllMocks()
})
const mockUser = {
name: 'John Doe',
lastLoggedIn: '2023-08-20T12:34:56Z',
}
const mockUserMenu = [
{ title: 'Profile', target: '/profile', iconName: 'profile' },
{ title: 'Settings', target: '/settings', iconName: 'settings' },
]
const mockRepresenting = {
name: 'Org Name',
orgNumber: '123456789',
}
it('renders header with service name', () => {
const { container } = render()
expect(container.querySelector('.pkt-header-service')).toBeInTheDocument()
expect(screen.getByText('Test Service')).toBeInTheDocument()
})
it('renders user menu when user is present', () => {
render()
const userButton = screen.getByRole('button', { name: /John Doe/ })
fireEvent.click(userButton)
expect(screen.getByText('Profile')).toBeInTheDocument()
expect(screen.getByText('Settings')).toBeInTheDocument()
})
it('renders representing organization when representing is present', () => {
render()
const userButton = screen.getByRole('button', { name: /Org Name/ })
fireEvent.click(userButton)
expect(screen.getByText('Org.nr. 123456789')).toBeInTheDocument()
})
it('calls logOut function when Log Out button is clicked', async () => {
const mockLogOut = vi.fn()
render()
const logOutButton = screen.getByRole('button', { name: 'Logg ut' })
await fireEvent.click(logOutButton)
expect(mockLogOut).toHaveBeenCalled()
})
it('toggles user menu when user button is clicked', () => {
render()
const userButton = screen.getByRole('button', { name: /John Doe/ })
fireEvent.click(userButton)
// User menu should be open - check for menu items
expect(screen.getByText('Profile')).toBeInTheDocument()
})
describe('accessibility', () => {
it('renders with no wcag errors with axe', async () => {
const { container } = render()
const results = await axe(container)
expect(results).toHaveNoViolations()
})
})
})