// eslint-disable-next-line @typescript-eslint/ban-ts-comment
// @ts-nocheck
import React from 'react'
import Expander, { ExpanderProps } from '../../index'
import { ExpanderClient } from '../../client'
import { render, screen } from '@testing-library/react'
//mock IntersectionObserver
class IntersectionObserver {
//mock constructor
constructor(callback) {
this.callback = callback
}
observe() {
this.active = true
}
disconnect() {
this.active = false
}
intersects() {
if (this.active) {
this.callback([{ isIntersecting: true }])
}
}
}
//mock scrollIntoView
window.HTMLElement.prototype.scrollIntoView = jest.fn()
describe('Expander client test', () => {
beforeEach(() => {
window.IntersectionObserver = IntersectionObserver
})
it('find expanders markup and initialises it', () => {
const props: ExpanderProps = {
id: 'test-id',
}
render(
Children 1
)
const expanders = ExpanderClient.init()
expect(expanders.length).toBe(1)
expect(
document.querySelectorAll("[data-component='expander']").length
).toBe(1)
expect(expanders[0].container.id).toBe('test-id__container')
expect(
expanders[0].container.classList.contains('cp-expander--initialised')
).toBe(true)
})
it('does not initialise expanders twice', () => {
const props: ExpanderProps = {
id: 'test-id',
}
render(
Children 1
)
ExpanderClient.init()
const expanders = ExpanderClient.init()
expect(expanders.length).toBe(0)
expect(
document.querySelectorAll("[data-component='expander']").length
).toBe(1)
})
it('expands and collapse', async () => {
const props: ExpanderProps = {
id: 'test-id',
}
render(
Children 1
)
const expanders = ExpanderClient.init()
const expanderButton = screen.getByText('Expand')
const collapserButton = screen.getByText('Collapse')
expect(expanderButton.getAttribute('aria-expanded')).toBe('false')
expect(expanderButton.getAttribute('aria-hidden')).toBe('false')
expect(collapserButton.getAttribute('aria-expanded')).toBe('false')
expect(collapserButton.getAttribute('aria-hidden')).toBe('true')
await expanderButton.click()
expect(expanderButton.getAttribute('aria-expanded')).toBe('true')
expect(expanders[0].container?.getAttribute('data-state')).toBe('expanded')
expect(expanderButton.getAttribute('aria-expanded')).toBe('true')
expect(expanderButton.getAttribute('aria-hidden')).toBe('true')
expect(collapserButton.getAttribute('aria-expanded')).toBe('true')
expect(collapserButton.getAttribute('aria-hidden')).toBe('false')
await collapserButton.click()
expect(expanders[0].container?.getAttribute('data-state')).toBe('collapsed')
expect(expanderButton.getAttribute('aria-expanded')).toBe('false')
expect(expanderButton.getAttribute('aria-hidden')).toBe('false')
expect(collapserButton.getAttribute('aria-expanded')).toBe('false')
expect(collapserButton.getAttribute('aria-hidden')).toBe('true')
})
it('track entire read only once', () => {
const props: ExpanderProps = {
id: 'test-id',
}
render(
Children 1
)
const expanders = ExpanderClient.init()
const spy = jest.spyOn(document.body, 'dispatchEvent')
spy.mockImplementation((event) => {
expect(event.detail.action).toBe('entire_read')
})
expanders[0].trackingEntireRead.observer.intersects()
expect(spy).toHaveBeenCalledTimes(1)
expanders[0].trackingEntireRead.observer.intersects()
expect(spy).toHaveBeenCalledTimes(1)
})
})