您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

index.spec.tsx 3.9KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. import React from 'react'
  2. import { cleanup, fireEvent, render } from '@testing-library/react'
  3. import '@testing-library/jest-dom'
  4. import { PortalToFollowElem, PortalToFollowElemContent, PortalToFollowElemTrigger } from '.'
  5. afterEach(cleanup)
  6. describe('PortalToFollowElem', () => {
  7. describe('Context and Provider', () => {
  8. test('should throw error when using context outside provider', () => {
  9. // Suppress console.error for this test
  10. const originalError = console.error
  11. console.error = jest.fn()
  12. expect(() => {
  13. render(
  14. <PortalToFollowElemTrigger>Trigger </PortalToFollowElemTrigger>,
  15. )
  16. }).toThrow('PortalToFollowElem components must be wrapped in <PortalToFollowElem />')
  17. console.error = originalError
  18. })
  19. test('should not throw when used within provider', () => {
  20. expect(() => {
  21. render(
  22. <PortalToFollowElem>
  23. <PortalToFollowElemTrigger>Trigger </PortalToFollowElemTrigger>
  24. </PortalToFollowElem>,
  25. )
  26. }).not.toThrow()
  27. })
  28. })
  29. describe('PortalToFollowElemTrigger', () => {
  30. test('should render children correctly', () => {
  31. const { getByText } = render(
  32. <PortalToFollowElem>
  33. <PortalToFollowElemTrigger>Trigger Text </PortalToFollowElemTrigger>
  34. </PortalToFollowElem>,
  35. )
  36. expect(getByText('Trigger Text')).toBeInTheDocument()
  37. })
  38. test('should handle asChild prop correctly', () => {
  39. const { getByRole } = render(
  40. <PortalToFollowElem>
  41. <PortalToFollowElemTrigger asChild >
  42. <button>Button Trigger </button>
  43. </PortalToFollowElemTrigger>
  44. </PortalToFollowElem>,
  45. )
  46. expect(getByRole('button')).toHaveTextContent('Button Trigger')
  47. })
  48. })
  49. describe('PortalToFollowElemContent', () => {
  50. test('should not render content when closed', () => {
  51. const { queryByText } = render(
  52. <PortalToFollowElem open={false} >
  53. <PortalToFollowElemTrigger>Trigger </PortalToFollowElemTrigger>
  54. <PortalToFollowElemContent > Popup Content </PortalToFollowElemContent>
  55. </PortalToFollowElem>,
  56. )
  57. expect(queryByText('Popup Content')).not.toBeInTheDocument()
  58. })
  59. test('should render content when open', () => {
  60. const { getByText } = render(
  61. <PortalToFollowElem open={true} >
  62. <PortalToFollowElemTrigger>Trigger </PortalToFollowElemTrigger>
  63. <PortalToFollowElemContent > Popup Content </PortalToFollowElemContent>
  64. </PortalToFollowElem>,
  65. )
  66. expect(getByText('Popup Content')).toBeInTheDocument()
  67. })
  68. })
  69. describe('Controlled behavior', () => {
  70. test('should call onOpenChange when interaction happens', () => {
  71. const handleOpenChange = jest.fn()
  72. const { getByText } = render(
  73. <PortalToFollowElem onOpenChange={handleOpenChange} >
  74. <PortalToFollowElemTrigger>Hover Me </PortalToFollowElemTrigger>
  75. <PortalToFollowElemContent > Content </PortalToFollowElemContent>
  76. </PortalToFollowElem>,
  77. )
  78. fireEvent.mouseEnter(getByText('Hover Me'))
  79. expect(handleOpenChange).toHaveBeenCalled()
  80. fireEvent.mouseLeave(getByText('Hover Me'))
  81. expect(handleOpenChange).toHaveBeenCalled()
  82. })
  83. })
  84. describe('Configuration options', () => {
  85. test('should accept placement prop', () => {
  86. // Since we can't easily test actual positioning, we'll check if the prop is passed correctly
  87. const useFloatingMock = jest.spyOn(require('@floating-ui/react'), 'useFloating')
  88. render(
  89. <PortalToFollowElem placement="top-start" >
  90. <PortalToFollowElemTrigger>Trigger </PortalToFollowElemTrigger>
  91. </PortalToFollowElem>,
  92. )
  93. expect(useFloatingMock).toHaveBeenCalledWith(
  94. expect.objectContaining({
  95. placement: 'top-start',
  96. }),
  97. )
  98. useFloatingMock.mockRestore()
  99. })
  100. })
  101. })