import * as React from 'react'
import { render, screen, fireEvent, waitFor } from '@testing-library/react'
import '@testing-library/jest-dom'
import {
CDropdown,
CDropdownToggle,
CDropdownMenu,
CDropdownItem,
CDropdownItemPlain,
CDropdownHeader,
CDropdownDivider,
} from '../index'
test('loads and displays CDropdown component', async () => {
const { container } = render(Test)
expect(container).toMatchSnapshot()
})
test('CDropdown customize', async () => {
const { container } = render(
Test
)
expect(container).toMatchSnapshot()
expect(container.firstChild).toHaveClass('bazinga')
expect(container.firstChild).toHaveClass('nav-item')
expect(container.firstChild).toHaveClass('dropdown')
expect(container.firstChild).toHaveClass('dropstart')
})
// test('CDropdown change visible prop', async () => {
// jest.useFakeTimers()
// const { rerender } = render(Test)
// expect(screen.getByText('Test')).not.toHaveClass('show')
// rerender(Test)
// jest.runAllTimers()
// expect(screen.getByText('Test')).toHaveClass('show')
// rerender(Test)
// expect(screen.getByText('Test')).not.toHaveClass('show')
// jest.runAllTimers()
// jest.useRealTimers()
// })
test('CDropdown opens on toggle click and closes on clicking outside', async () => {
render(
{/* External element to simulate clicking outside the dropdown */}
External Area
{/* The dropdown component */}
Test
A
B
)
// Ensure the dropdown is initially closed
const toggleButton = screen.getByText('Test')
expect(toggleButton).toBeInTheDocument()
// Assuming the 'show' class is applied to the CDropdownMenu
const dropdownMenu = screen.getByRole('menu', { hidden: true }) // Adjust role if different
expect(dropdownMenu).not.toHaveClass('show')
// Click on the toggle to open the dropdown
fireEvent.click(toggleButton)
// Wait for the dropdown menu to become visible
await waitFor(() => {
const openedMenu = screen.getByRole('menu') // Adjust role if different
expect(openedMenu).toBeVisible()
expect(openedMenu).toHaveClass('show')
})
// Click outside the dropdown to close it
const externalArea = screen.getByTestId('external-area')
fireEvent.click(externalArea)
// Wait for the dropdown menu to be hidden
await waitFor(() => {
const closedMenu = screen.getByRole('menu', { hidden: true }) // Adjust role if different
expect(closedMenu).not.toHaveClass('show')
})
})
test('CDropdown example', async () => {
jest.useFakeTimers()
const { container } = render(
Test
A
B
C
D
)
expect(container).toMatchSnapshot()
})