EdgeFunctionRenderer.test.tsx 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  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 { EdgeFunctionRenderer } from './EdgeFunctionRenderer'
  5. import { render } from '@/tests/helpers'
  6. const {
  7. mockSendEvent,
  8. mockUseEdgeFunctionQuery,
  9. mockUseParams,
  10. mockUseProjectSettingsV2Query,
  11. mockUseSelectedOrganizationQuery,
  12. } = vi.hoisted(() => ({
  13. mockSendEvent: vi.fn(),
  14. mockUseEdgeFunctionQuery: vi.fn(),
  15. mockUseParams: vi.fn(),
  16. mockUseProjectSettingsV2Query: vi.fn(),
  17. mockUseSelectedOrganizationQuery: vi.fn(),
  18. }))
  19. vi.mock('common', async () => {
  20. const actual = await vi.importActual<typeof import('common')>('common')
  21. return {
  22. ...actual,
  23. useParams: mockUseParams,
  24. }
  25. })
  26. vi.mock('@/data/config/project-settings-v2-query', () => ({
  27. useProjectSettingsV2Query: mockUseProjectSettingsV2Query,
  28. }))
  29. vi.mock('@/data/edge-functions/edge-function-query', () => ({
  30. useEdgeFunctionQuery: mockUseEdgeFunctionQuery,
  31. }))
  32. vi.mock('@/data/telemetry/send-event-mutation', () => ({
  33. useSendEventMutation: () => ({ mutate: mockSendEvent }),
  34. }))
  35. vi.mock('@/hooks/misc/useSelectedOrganization', () => ({
  36. useSelectedOrganizationQuery: mockUseSelectedOrganizationQuery,
  37. }))
  38. vi.mock('../EdgeFunctionBlock/EdgeFunctionBlock', () => ({
  39. EdgeFunctionBlock: ({
  40. showReplaceWarning,
  41. onCancelReplace,
  42. onConfirmReplace,
  43. }: {
  44. showReplaceWarning?: boolean
  45. onCancelReplace?: () => void
  46. onConfirmReplace?: () => void
  47. }) => (
  48. <div>
  49. {showReplaceWarning && (
  50. <div>
  51. <p>An edge function with this name already exists.</p>
  52. <button onClick={onCancelReplace}>Cancel</button>
  53. <button onClick={onConfirmReplace}>Replace function</button>
  54. </div>
  55. )}
  56. </div>
  57. ),
  58. }))
  59. vi.mock('./ConfirmFooter', () => ({
  60. ConfirmFooter: ({
  61. confirmLabel,
  62. onConfirm,
  63. }: {
  64. confirmLabel?: string
  65. onConfirm?: () => void
  66. }) => <button onClick={onConfirm}>{confirmLabel ?? 'Confirm'}</button>,
  67. }))
  68. describe('EdgeFunctionRenderer', () => {
  69. beforeEach(() => {
  70. mockSendEvent.mockReset()
  71. mockUseEdgeFunctionQuery.mockReset()
  72. mockUseParams.mockReturnValue({ ref: 'project-ref' })
  73. mockUseProjectSettingsV2Query.mockReturnValue({ data: undefined })
  74. mockUseSelectedOrganizationQuery.mockReturnValue({ data: { slug: 'org-slug' } })
  75. })
  76. it('only deploys an existing function from the replace warning confirmation', async () => {
  77. const user = userEvent.setup()
  78. const onApprove = vi.fn()
  79. mockUseEdgeFunctionQuery.mockReturnValue({ data: { slug: 'hello-world' } })
  80. render(
  81. <EdgeFunctionRenderer
  82. label="Deploy Edge Function"
  83. code="Deno.serve(() => new Response('ok'))"
  84. functionName="hello-world"
  85. onApprove={onApprove}
  86. />
  87. )
  88. await user.click(screen.getByRole('button', { name: 'Deploy' }))
  89. expect(screen.getByText('An edge function with this name already exists.')).toBeInTheDocument()
  90. expect(onApprove).not.toHaveBeenCalled()
  91. await user.click(screen.getByRole('button', { name: 'Deploy' }))
  92. expect(onApprove).not.toHaveBeenCalled()
  93. expect(mockSendEvent).not.toHaveBeenCalled()
  94. await user.click(screen.getByRole('button', { name: 'Replace function' }))
  95. expect(onApprove).toHaveBeenCalledTimes(1)
  96. expect(mockSendEvent).toHaveBeenCalledTimes(1)
  97. })
  98. it('deploys immediately when no existing function is found', async () => {
  99. const user = userEvent.setup()
  100. const onApprove = vi.fn()
  101. mockUseEdgeFunctionQuery.mockReturnValue({ data: undefined })
  102. render(
  103. <EdgeFunctionRenderer
  104. label="Deploy Edge Function"
  105. code="Deno.serve(() => new Response('ok'))"
  106. functionName="hello-world"
  107. onApprove={onApprove}
  108. />
  109. )
  110. await user.click(screen.getByRole('button', { name: 'Deploy' }))
  111. expect(onApprove).toHaveBeenCalledTimes(1)
  112. expect(mockSendEvent).toHaveBeenCalledTimes(1)
  113. })
  114. })