PlatformWebhooksEndpointDetails.test.tsx 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. import { render, screen, waitFor } from '@testing-library/react'
  2. import userEvent from '@testing-library/user-event'
  3. import type { ComponentProps } from 'react'
  4. import { describe, expect, it, vi } from 'vitest'
  5. import { PLATFORM_WEBHOOKS_MOCK_DATA } from './PlatformWebhooks.mock'
  6. import { PlatformWebhooksEndpointDetails } from './PlatformWebhooksEndpointDetails'
  7. vi.mock('@/components/ui/DataTable/DataTableColumn/DataTableColumnStatusCode', () => ({
  8. DataTableColumnStatusCode: ({ value }: { value: number }) => <span>{value}</span>,
  9. }))
  10. vi.mock('@/components/ui/ButtonTooltip', () => ({
  11. ButtonTooltip: ({
  12. icon,
  13. children,
  14. size: _size,
  15. tooltip: _tooltip,
  16. type: _type,
  17. ...props
  18. }: any) => (
  19. <button type="button" {...props}>
  20. {icon}
  21. {children}
  22. </button>
  23. ),
  24. }))
  25. vi.mock('ui-patterns', async () => {
  26. const actual = await vi.importActual<typeof import('ui-patterns')>('ui-patterns')
  27. return {
  28. ...actual,
  29. TimestampInfo: ({ utcTimestamp, className }: { utcTimestamp: string; className?: string }) => (
  30. <span className={className}>{utcTimestamp}</span>
  31. ),
  32. }
  33. })
  34. describe('PlatformWebhooksEndpointDetails', () => {
  35. const selectedEndpoint = PLATFORM_WEBHOOKS_MOCK_DATA.organization.endpoints[0]
  36. const allDeliveries = PLATFORM_WEBHOOKS_MOCK_DATA.organization.deliveries.filter(
  37. (delivery) => delivery.endpointId === selectedEndpoint.id
  38. )
  39. const renderComponent = (
  40. props?: Partial<ComponentProps<typeof PlatformWebhooksEndpointDetails>>
  41. ) =>
  42. render(
  43. <PlatformWebhooksEndpointDetails
  44. deliverySearch=""
  45. filteredDeliveries={allDeliveries}
  46. selectedEndpoint={selectedEndpoint}
  47. onDeliverySearchChange={vi.fn()}
  48. onOpenDelivery={vi.fn()}
  49. onRetryDelivery={vi.fn()}
  50. {...props}
  51. />
  52. )
  53. it('renders paginated deliveries with previous and next controls', async () => {
  54. const user = userEvent.setup()
  55. renderComponent()
  56. expect(screen.getByText('Showing 1 to 5 of 12 deliveries')).toBeInTheDocument()
  57. expect(screen.queryByText('organization.member_removed')).not.toBeInTheDocument()
  58. await user.click(screen.getByLabelText('Next page'))
  59. expect(screen.getByText('Showing 6 to 10 of 12 deliveries')).toBeInTheDocument()
  60. expect(screen.getByText('organization.member_removed')).toBeInTheDocument()
  61. await user.click(screen.getByLabelText('Previous page'))
  62. expect(screen.getByText('Showing 1 to 5 of 12 deliveries')).toBeInTheDocument()
  63. expect(screen.queryByText('organization.member_removed')).not.toBeInTheDocument()
  64. })
  65. it('sorts deliveries by event type from the header', async () => {
  66. const user = userEvent.setup()
  67. renderComponent()
  68. await user.click(screen.getByRole('button', { name: 'Event type' }))
  69. expect(screen.getAllByRole('row')[1]).toHaveTextContent('organization.member_invited')
  70. await user.click(screen.getByRole('button', { name: 'Event type' }))
  71. expect(screen.getAllByRole('row')[1]).toHaveTextContent('project.updated')
  72. })
  73. it('resets to the first page when the delivery search changes', async () => {
  74. const user = userEvent.setup()
  75. const projectDeliveries = allDeliveries.filter((delivery) =>
  76. delivery.eventType.includes('project')
  77. )
  78. const { rerender } = renderComponent()
  79. await user.click(screen.getByLabelText('Next page'))
  80. expect(screen.getByText('Showing 6 to 10 of 12 deliveries')).toBeInTheDocument()
  81. rerender(
  82. <PlatformWebhooksEndpointDetails
  83. deliverySearch="project"
  84. filteredDeliveries={projectDeliveries}
  85. selectedEndpoint={selectedEndpoint}
  86. onDeliverySearchChange={vi.fn()}
  87. onOpenDelivery={vi.fn()}
  88. onRetryDelivery={vi.fn()}
  89. />
  90. )
  91. await waitFor(() => {
  92. expect(screen.getByText('Showing 1 to 5 of 8 deliveries')).toBeInTheDocument()
  93. })
  94. })
  95. it('retries a failed delivery without opening the delivery row', async () => {
  96. const user = userEvent.setup()
  97. const onOpenDelivery = vi.fn()
  98. const onRetryDelivery = vi.fn()
  99. renderComponent({ onOpenDelivery, onRetryDelivery })
  100. await user.click(screen.getByLabelText('Retry org-delivery-2'))
  101. expect(onRetryDelivery).toHaveBeenCalledWith('org-delivery-2')
  102. expect(onOpenDelivery).not.toHaveBeenCalled()
  103. })
  104. it('renders a zero response code instead of the placeholder', () => {
  105. renderComponent({
  106. filteredDeliveries: [{ ...allDeliveries[0], id: 'org-delivery-zero', responseCode: 0 }],
  107. })
  108. expect(screen.getByText('0')).toBeInTheDocument()
  109. expect(screen.queryByText('–')).not.toBeInTheDocument()
  110. })
  111. })