HelpOptionsList.test.tsx 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. import { screen } from '@testing-library/react'
  2. import userEvent from '@testing-library/user-event'
  3. import { beforeEach, describe, expect, it, vi } from 'vitest'
  4. import { HelpOptionsList } from './HelpOptionsList'
  5. import { DOCS_URL } from '@/lib/constants'
  6. import { customRender } from '@/tests/lib/custom-render'
  7. import { routerMock } from '@/tests/lib/route-mock'
  8. const { takeBreadcrumbSnapshotMock } = vi.hoisted(() => ({
  9. takeBreadcrumbSnapshotMock: vi.fn(),
  10. }))
  11. vi.mock('react-inlinesvg', () => ({
  12. __esModule: true,
  13. default: () => null,
  14. }))
  15. vi.mock('@/lib/breadcrumbs', () => ({
  16. takeBreadcrumbSnapshot: takeBreadcrumbSnapshotMock,
  17. }))
  18. describe('HelpOptionsList', () => {
  19. beforeEach(() => {
  20. routerMock.setCurrentUrl('/')
  21. takeBreadcrumbSnapshotMock.mockReset()
  22. vi.restoreAllMocks()
  23. })
  24. it('navigates to support after invoking the click callback by default', async () => {
  25. const onSupportClick = vi.fn()
  26. customRender(
  27. <HelpOptionsList
  28. isPlatform
  29. projectRef="project-1"
  30. supportLinkQueryParams={{ projectRef: 'project-1' }}
  31. onSupportClick={onSupportClick}
  32. />
  33. )
  34. await userEvent.click(screen.getByRole('button', { name: /contact support/i }))
  35. expect(onSupportClick).toHaveBeenCalledTimes(1)
  36. expect(takeBreadcrumbSnapshotMock).toHaveBeenCalledTimes(1)
  37. expect(routerMock.asPath).toBe('/support/new?projectRef=project-1')
  38. })
  39. it('allows the support callback to suppress navigation', async () => {
  40. customRender(
  41. <HelpOptionsList
  42. isPlatform
  43. projectRef="project-1"
  44. supportLinkQueryParams={{ projectRef: 'project-1' }}
  45. onSupportClick={() => false}
  46. />
  47. )
  48. await userEvent.click(screen.getByRole('button', { name: /contact support/i }))
  49. expect(takeBreadcrumbSnapshotMock).not.toHaveBeenCalled()
  50. expect(routerMock.asPath).toBe('/')
  51. })
  52. it('renders docs as an external link', () => {
  53. customRender(
  54. <HelpOptionsList
  55. isPlatform
  56. projectRef="project-1"
  57. supportLinkQueryParams={{ projectRef: 'project-1' }}
  58. />
  59. )
  60. const docsOption = screen.getByRole('link', { name: /docs/i })
  61. expect(docsOption).toHaveAttribute('href', `${DOCS_URL}/`)
  62. expect(docsOption).toHaveAttribute('target', '_blank')
  63. expect(docsOption).toHaveAttribute('rel', 'noreferrer noopener')
  64. })
  65. })