|
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121 |
- import React from 'react'
- import { cleanup, fireEvent, render } from '@testing-library/react'
- import '@testing-library/jest-dom'
- import { PortalToFollowElem, PortalToFollowElemContent, PortalToFollowElemTrigger } from '.'
-
- afterEach(cleanup)
-
- describe('PortalToFollowElem', () => {
- describe('Context and Provider', () => {
- test('should throw error when using context outside provider', () => {
- // Suppress console.error for this test
- const originalError = console.error
- console.error = jest.fn()
-
- expect(() => {
- render(
- <PortalToFollowElemTrigger>Trigger </PortalToFollowElemTrigger>,
- )
- }).toThrow('PortalToFollowElem components must be wrapped in <PortalToFollowElem />')
-
- console.error = originalError
- })
-
- test('should not throw when used within provider', () => {
- expect(() => {
- render(
- <PortalToFollowElem>
- <PortalToFollowElemTrigger>Trigger </PortalToFollowElemTrigger>
- </PortalToFollowElem>,
- )
- }).not.toThrow()
- })
- })
-
- describe('PortalToFollowElemTrigger', () => {
- test('should render children correctly', () => {
- const { getByText } = render(
- <PortalToFollowElem>
- <PortalToFollowElemTrigger>Trigger Text </PortalToFollowElemTrigger>
- </PortalToFollowElem>,
- )
- expect(getByText('Trigger Text')).toBeInTheDocument()
- })
-
- test('should handle asChild prop correctly', () => {
- const { getByRole } = render(
- <PortalToFollowElem>
- <PortalToFollowElemTrigger asChild >
- <button>Button Trigger </button>
- </PortalToFollowElemTrigger>
- </PortalToFollowElem>,
- )
-
- expect(getByRole('button')).toHaveTextContent('Button Trigger')
- })
- })
-
- describe('PortalToFollowElemContent', () => {
- test('should not render content when closed', () => {
- const { queryByText } = render(
- <PortalToFollowElem open={false} >
- <PortalToFollowElemTrigger>Trigger </PortalToFollowElemTrigger>
- <PortalToFollowElemContent > Popup Content </PortalToFollowElemContent>
- </PortalToFollowElem>,
- )
-
- expect(queryByText('Popup Content')).not.toBeInTheDocument()
- })
-
- test('should render content when open', () => {
- const { getByText } = render(
- <PortalToFollowElem open={true} >
- <PortalToFollowElemTrigger>Trigger </PortalToFollowElemTrigger>
- <PortalToFollowElemContent > Popup Content </PortalToFollowElemContent>
- </PortalToFollowElem>,
- )
-
- expect(getByText('Popup Content')).toBeInTheDocument()
- })
- })
-
- describe('Controlled behavior', () => {
- test('should call onOpenChange when interaction happens', () => {
- const handleOpenChange = jest.fn()
-
- const { getByText } = render(
- <PortalToFollowElem onOpenChange={handleOpenChange} >
- <PortalToFollowElemTrigger>Hover Me </PortalToFollowElemTrigger>
- <PortalToFollowElemContent > Content </PortalToFollowElemContent>
- </PortalToFollowElem>,
- )
-
- fireEvent.mouseEnter(getByText('Hover Me'))
- expect(handleOpenChange).toHaveBeenCalled()
-
- fireEvent.mouseLeave(getByText('Hover Me'))
- expect(handleOpenChange).toHaveBeenCalled()
- })
- })
-
- describe('Configuration options', () => {
- test('should accept placement prop', () => {
- // Since we can't easily test actual positioning, we'll check if the prop is passed correctly
- const useFloatingMock = jest.spyOn(require('@floating-ui/react'), 'useFloating')
-
- render(
- <PortalToFollowElem placement="top-start" >
- <PortalToFollowElemTrigger>Trigger </PortalToFollowElemTrigger>
- </PortalToFollowElem>,
- )
-
- expect(useFloatingMock).toHaveBeenCalledWith(
- expect.objectContaining({
- placement: 'top-start',
- }),
- )
-
- useFloatingMock.mockRestore()
- })
- })
- })
|