import { render, screen, waitFor } from '@testing-library/react' import userEvent from '@testing-library/user-event' import type { ComponentProps } from 'react' import { describe, expect, it, vi } from 'vitest' import { PLATFORM_WEBHOOKS_MOCK_DATA } from './PlatformWebhooks.mock' import { PlatformWebhooksEndpointDetails } from './PlatformWebhooksEndpointDetails' vi.mock('@/components/ui/DataTable/DataTableColumn/DataTableColumnStatusCode', () => ({ DataTableColumnStatusCode: ({ value }: { value: number }) => {value}, })) vi.mock('@/components/ui/ButtonTooltip', () => ({ ButtonTooltip: ({ icon, children, size: _size, tooltip: _tooltip, type: _type, ...props }: any) => ( ), })) vi.mock('ui-patterns', async () => { const actual = await vi.importActual('ui-patterns') return { ...actual, TimestampInfo: ({ utcTimestamp, className }: { utcTimestamp: string; className?: string }) => ( {utcTimestamp} ), } }) describe('PlatformWebhooksEndpointDetails', () => { const selectedEndpoint = PLATFORM_WEBHOOKS_MOCK_DATA.organization.endpoints[0] const allDeliveries = PLATFORM_WEBHOOKS_MOCK_DATA.organization.deliveries.filter( (delivery) => delivery.endpointId === selectedEndpoint.id ) const renderComponent = ( props?: Partial> ) => render( ) it('renders paginated deliveries with previous and next controls', async () => { const user = userEvent.setup() renderComponent() expect(screen.getByText('Showing 1 to 5 of 12 deliveries')).toBeInTheDocument() expect(screen.queryByText('organization.member_removed')).not.toBeInTheDocument() await user.click(screen.getByLabelText('Next page')) expect(screen.getByText('Showing 6 to 10 of 12 deliveries')).toBeInTheDocument() expect(screen.getByText('organization.member_removed')).toBeInTheDocument() await user.click(screen.getByLabelText('Previous page')) expect(screen.getByText('Showing 1 to 5 of 12 deliveries')).toBeInTheDocument() expect(screen.queryByText('organization.member_removed')).not.toBeInTheDocument() }) it('sorts deliveries by event type from the header', async () => { const user = userEvent.setup() renderComponent() await user.click(screen.getByRole('button', { name: 'Event type' })) expect(screen.getAllByRole('row')[1]).toHaveTextContent('organization.member_invited') await user.click(screen.getByRole('button', { name: 'Event type' })) expect(screen.getAllByRole('row')[1]).toHaveTextContent('project.updated') }) it('resets to the first page when the delivery search changes', async () => { const user = userEvent.setup() const projectDeliveries = allDeliveries.filter((delivery) => delivery.eventType.includes('project') ) const { rerender } = renderComponent() await user.click(screen.getByLabelText('Next page')) expect(screen.getByText('Showing 6 to 10 of 12 deliveries')).toBeInTheDocument() rerender( ) await waitFor(() => { expect(screen.getByText('Showing 1 to 5 of 8 deliveries')).toBeInTheDocument() }) }) it('retries a failed delivery without opening the delivery row', async () => { const user = userEvent.setup() const onOpenDelivery = vi.fn() const onRetryDelivery = vi.fn() renderComponent({ onOpenDelivery, onRetryDelivery }) await user.click(screen.getByLabelText('Retry org-delivery-2')) expect(onRetryDelivery).toHaveBeenCalledWith('org-delivery-2') expect(onOpenDelivery).not.toHaveBeenCalled() }) it('renders a zero response code instead of the placeholder', () => { renderComponent({ filteredDeliveries: [{ ...allDeliveries[0], id: 'org-delivery-zero', responseCode: 0 }], }) expect(screen.getByText('0')).toBeInTheDocument() expect(screen.queryByText('–')).not.toBeInTheDocument() }) })