import React, { useContext } from 'react'
import { act } from 'react-dom/test-utils'
import { mount, ReactWrapper } from 'enzyme'
import { KEYS } from '../keycodes'
import { FOCUS_VISIBLE_CSS_CLASS, FocusVisibleContext, FocusVisibleProvider } from './index'
let focusVisibleContext = null
let wrapper: ReactWrapper
const ChildComponent = () => {
focusVisibleContext = useContext(FocusVisibleContext)
return null
}
describe('FocusVisibleProvider', () => {
beforeEach(() => {
wrapper = mount(
,
)
})
afterEach(() => {
focusVisibleContext = null
})
it('Should provide "false" value for keyboard navigation context on mounting', () => {
expect(focusVisibleContext).toEqual(false)
})
it("Shouldn't apply className on the body element by default", () => {
expect(document.body.className).toEqual('')
act(() => {
document.body.dispatchEvent(new KeyboardEvent('keydown', { key: KEYS.TAB }))
})
wrapper.update()
expect(focusVisibleContext).toEqual(true)
expect(document.body.className).toEqual('')
})
it('Should update the context value by switching from keyboard to pointer interaction', () => {
act(() => {
document.body.dispatchEvent(new KeyboardEvent('keydown', { key: KEYS.TAB }))
})
wrapper.update()
expect(focusVisibleContext).toEqual(true)
act(() => {
document.body.dispatchEvent(new MouseEvent('mousedown'))
})
wrapper.update()
expect(focusVisibleContext).toEqual(false)
})
it('Should provide "false" value when using not whitelisted key', () => {
act(() => {
document.body.dispatchEvent(new KeyboardEvent('keydown', { key: 'Alt' }))
})
wrapper.update()
expect(focusVisibleContext).toEqual(false)
})
describe('FocusVisibleProvider with hasGlobalClassName', () => {
beforeEach(() => {
wrapper = mount(
,
)
})
afterEach(() => {
focusVisibleContext = null
})
it('Should update the body className by switching from keyboard to pointer interaction', () => {
expect(document.body.className).toEqual('')
act(() => {
document.body.dispatchEvent(new KeyboardEvent('keydown', { key: KEYS.TAB }))
})
wrapper.update()
expect(document.body.className).toEqual(FOCUS_VISIBLE_CSS_CLASS)
act(() => {
document.body.dispatchEvent(new MouseEvent('mousedown'))
})
wrapper.update()
expect(document.body.className).toEqual('')
})
})
})