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( Trigger , ) }).toThrow('PortalToFollowElem components must be wrapped in ') console.error = originalError }) test('should not throw when used within provider', () => { expect(() => { render( Trigger , ) }).not.toThrow() }) }) describe('PortalToFollowElemTrigger', () => { test('should render children correctly', () => { const { getByText } = render( Trigger Text , ) expect(getByText('Trigger Text')).toBeInTheDocument() }) test('should handle asChild prop correctly', () => { const { getByRole } = render( , ) expect(getByRole('button')).toHaveTextContent('Button Trigger') }) }) describe('PortalToFollowElemContent', () => { test('should not render content when closed', () => { const { queryByText } = render( Trigger Popup Content , ) expect(queryByText('Popup Content')).not.toBeInTheDocument() }) test('should render content when open', () => { const { getByText } = render( Trigger Popup Content , ) expect(getByText('Popup Content')).toBeInTheDocument() }) }) describe('Controlled behavior', () => { test('should call onOpenChange when interaction happens', () => { const handleOpenChange = jest.fn() const { getByText } = render( Hover Me Content , ) 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( Trigger , ) expect(useFloatingMock).toHaveBeenCalledWith( expect.objectContaining({ placement: 'top-start', }), ) useFloatingMock.mockRestore() }) }) })