Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.

index.spec.tsx 4.8KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. import React from 'react'
  2. import { act, cleanup, fireEvent, render, screen } from '@testing-library/react'
  3. import '@testing-library/jest-dom'
  4. import Tooltip from './index'
  5. afterEach(cleanup)
  6. describe('Tooltip', () => {
  7. describe('Rendering', () => {
  8. test('should render default tooltip with question icon', () => {
  9. const triggerClassName = 'custom-trigger'
  10. const { container } = render(<Tooltip popupContent="Tooltip content" triggerClassName={triggerClassName} />)
  11. const trigger = container.querySelector(`.${triggerClassName}`)
  12. expect(trigger).not.toBeNull()
  13. expect(trigger?.querySelector('svg')).not.toBeNull() // question icon
  14. })
  15. test('should render with custom children', () => {
  16. const { getByText } = render(
  17. <Tooltip popupContent="Tooltip content">
  18. <button>Hover me</button>
  19. </Tooltip>,
  20. )
  21. expect(getByText('Hover me').textContent).toBe('Hover me')
  22. })
  23. })
  24. describe('Disabled state', () => {
  25. test('should not show tooltip when disabled', () => {
  26. const triggerClassName = 'custom-trigger'
  27. const { container } = render(<Tooltip popupContent="Tooltip content" disabled triggerClassName={triggerClassName} />)
  28. const trigger = container.querySelector(`.${triggerClassName}`)
  29. act(() => {
  30. fireEvent.mouseEnter(trigger!)
  31. })
  32. expect(screen.queryByText('Tooltip content')).not.toBeInTheDocument()
  33. })
  34. })
  35. describe('Trigger methods', () => {
  36. test('should open on hover when triggerMethod is hover', () => {
  37. const triggerClassName = 'custom-trigger'
  38. const { container } = render(<Tooltip popupContent="Tooltip content" triggerClassName={triggerClassName} />)
  39. const trigger = container.querySelector(`.${triggerClassName}`)
  40. act(() => {
  41. fireEvent.mouseEnter(trigger!)
  42. })
  43. expect(screen.queryByText('Tooltip content')).toBeInTheDocument()
  44. })
  45. test('should close on mouse leave when triggerMethod is hover', () => {
  46. const triggerClassName = 'custom-trigger'
  47. const { container } = render(<Tooltip popupContent="Tooltip content" triggerClassName={triggerClassName} />)
  48. const trigger = container.querySelector(`.${triggerClassName}`)
  49. act(() => {
  50. fireEvent.mouseEnter(trigger!)
  51. fireEvent.mouseLeave(trigger!)
  52. })
  53. expect(screen.queryByText('Tooltip content')).not.toBeInTheDocument()
  54. })
  55. test('should toggle on click when triggerMethod is click', () => {
  56. const triggerClassName = 'custom-trigger'
  57. const { container } = render(<Tooltip popupContent="Tooltip content" triggerMethod="click" triggerClassName={triggerClassName} />)
  58. const trigger = container.querySelector(`.${triggerClassName}`)
  59. act(() => {
  60. fireEvent.click(trigger!)
  61. })
  62. expect(screen.queryByText('Tooltip content')).toBeInTheDocument()
  63. })
  64. test('should not close immediately on mouse leave when needsDelay is true', () => {
  65. const triggerClassName = 'custom-trigger'
  66. const { container } = render(<Tooltip popupContent="Tooltip content" triggerMethod="hover" needsDelay triggerClassName={triggerClassName} />)
  67. const trigger = container.querySelector(`.${triggerClassName}`)
  68. act(() => {
  69. fireEvent.mouseEnter(trigger!)
  70. fireEvent.mouseLeave(trigger!)
  71. })
  72. expect(screen.queryByText('Tooltip content')).toBeInTheDocument()
  73. })
  74. })
  75. describe('Styling and positioning', () => {
  76. test('should apply custom trigger className', () => {
  77. const triggerClassName = 'custom-trigger'
  78. const { container } = render(<Tooltip popupContent="Tooltip content" triggerClassName={triggerClassName} />)
  79. const trigger = container.querySelector(`.${triggerClassName}`)
  80. expect(trigger?.className).toContain('custom-trigger')
  81. })
  82. test('should apply custom popup className', async () => {
  83. const triggerClassName = 'custom-trigger'
  84. const { container } = render(<Tooltip popupContent="Tooltip content" triggerClassName={triggerClassName} popupClassName="custom-popup" />)
  85. const trigger = container.querySelector(`.${triggerClassName}`)
  86. act(() => {
  87. fireEvent.mouseEnter(trigger!)
  88. })
  89. expect((await screen.findByText('Tooltip content'))?.className).toContain('custom-popup')
  90. })
  91. test('should apply noDecoration when specified', async () => {
  92. const triggerClassName = 'custom-trigger'
  93. const { container } = render(<Tooltip
  94. popupContent="Tooltip content"
  95. triggerClassName={triggerClassName}
  96. noDecoration
  97. />)
  98. const trigger = container.querySelector(`.${triggerClassName}`)
  99. act(() => {
  100. fireEvent.mouseEnter(trigger!)
  101. })
  102. expect((await screen.findByText('Tooltip content'))?.className).not.toContain('bg-components-panel-bg')
  103. })
  104. })
  105. })