import {QueryClient, QueryClientProvider} from '@tanstack/react-query' import {render, screen, waitFor} from '@testing-library/react' import userEvent from '@testing-library/user-event' import {expect, test, vi} from 'vitest' import {ScheduledLambdaTriggerPanel} from './ScheduledLambdaTriggerPanel' import type {CloudResource} from '@/types/resource' const apiMocks = vi.hoisted(() => ({ createEventBridgeLambdaTrigger: vi.fn(), deleteEventBridgeLambdaTrigger: vi.fn(), listEventBridgeLambdaTriggers: vi.fn(), })) vi.mock('@/api/cloudProxyClient', () => apiMocks) const lambda: CloudResource = { id: 'reporter', name: 'reporter', cloud: 'aws', service: 'serverless', type: 'lambda', region: null, createdAt: null, metadata: {}, } function renderPanel() { const queryClient = new QueryClient({defaultOptions: {queries: {retry: false}}}) render() } test('creates a scheduled EventBridge Lambda trigger', async () => { apiMocks.listEventBridgeLambdaTriggers.mockResolvedValue([]) apiMocks.createEventBridgeLambdaTrigger.mockResolvedValue({id: 'hourly-report', ruleName: 'hourly-report', scheduleExpression: 'rate(1 hour)'}) const user = userEvent.setup() renderPanel() await user.type(screen.getByLabelText(/rule name/i), 'hourly-report') await user.clear(screen.getByLabelText(/schedule expression/i)) await user.type(screen.getByLabelText(/schedule expression/i), 'rate(1 hour)') await user.click(screen.getByRole('button', {name: 'Add schedule'})) await waitFor(() => expect(apiMocks.createEventBridgeLambdaTrigger).toHaveBeenCalledWith('aws', 'reporter', { ruleName: 'hourly-report', scheduleExpression: 'rate(1 hour)', })) }) test('confirms before deleting a scheduled trigger', async () => { apiMocks.listEventBridgeLambdaTriggers.mockResolvedValue([{id: 'hourly-report', ruleName: 'hourly-report', scheduleExpression: 'rate(1 hour)', state: 'ENABLED'}]) apiMocks.deleteEventBridgeLambdaTrigger.mockResolvedValue(undefined) const user = userEvent.setup() renderPanel() await user.click(await screen.findByRole('button', {name: 'Remove schedule hourly-report'})) expect(screen.getByText('Remove schedule?')).toBeVisible() await user.click(screen.getByRole('button', {name: 'Remove'})) await waitFor(() => expect(apiMocks.deleteEventBridgeLambdaTrigger).toHaveBeenCalledWith('aws', 'reporter', 'hourly-report')) })