import { fireEvent, render, screen } from '@testing-library/react' import * as React from 'react' import { Popover, PopoverContent, PopoverTrigger, } from '../base-ui-popover' type PopoverHarnessProps = { useRenderElement?: boolean preventDefaultOnTrigger?: boolean } const PopoverHarness = ({ useRenderElement = false, preventDefaultOnTrigger = false, }: PopoverHarnessProps) => { const [open, setOpen] = React.useState(false) return (
outside
{ if (preventDefaultOnTrigger) event.preventDefault() }} > toggle ) : undefined} > fallback trigger } popupProps={{ 'data-popup': 'true' } as unknown as React.HTMLAttributes} >
popover body
{open ? 'open' : 'closed'}
) } describe('base-ui-popover mock', () => { it('should toggle popover content from the fallback trigger and expose content props', () => { render() expect(screen.getByTestId('open-state')).toHaveTextContent('closed') expect(screen.queryByTestId('popover-content')).not.toBeInTheDocument() fireEvent.click(screen.getByTestId('popover-trigger')) expect(screen.getByTestId('open-state')).toHaveTextContent('open') expect(screen.getByTestId('popover-content')).toHaveAttribute('data-placement', 'bottom-start') expect(screen.getByTestId('popover-content')).toHaveAttribute('data-side-offset', '4') expect(screen.getByTestId('popover-content')).toHaveAttribute('data-align-offset', '8') expect(screen.getByTestId('popover-content')).toHaveAttribute('data-positioner', 'true') expect(screen.getByTestId('popover-content')).toHaveAttribute('data-popup', 'true') expect(screen.getByTestId('popover-content')).toHaveClass('custom-content') }) it('should keep the popover open on inside clicks and close it on outside clicks or escape', () => { render() fireEvent.click(screen.getByTestId('custom-trigger')) expect(screen.getByTestId('open-state')).toHaveTextContent('open') fireEvent.mouseDown(screen.getByTestId('popover-content')) expect(screen.getByTestId('open-state')).toHaveTextContent('open') fireEvent.keyDown(document, { key: 'Escape' }) expect(screen.getByTestId('open-state')).toHaveTextContent('closed') fireEvent.click(screen.getByTestId('custom-trigger')) expect(screen.getByTestId('open-state')).toHaveTextContent('open') fireEvent.mouseDown(screen.getByTestId('outside-area')) expect(screen.getByTestId('open-state')).toHaveTextContent('closed') }) it('should preserve rendered trigger props and respect preventDefault', () => { render() fireEvent.click(screen.getByTestId('custom-trigger')) expect(screen.getByTestId('custom-trigger')).toHaveAttribute('data-popover-trigger', 'true') expect(screen.getByTestId('open-state')).toHaveTextContent('closed') expect(screen.queryByTestId('popover-content')).not.toBeInTheDocument() }) it('should keep the popover closed when the fallback trigger click is prevented', () => { const handleClick = (event: React.MouseEvent) => { event.preventDefault() } render(
fallback trigger
popover body
, ) fireEvent.click(screen.getByTestId('popover-trigger')) expect(screen.queryByTestId('popover-content')).not.toBeInTheDocument() }) })