Files
floci-ui/packages/frontend/src/components/LambdaCreatePanel.test.tsx
T
2026-09-24 22:34:04 -04:00

103 lines
4.8 KiB
TypeScript

import {render, screen} from '@testing-library/react'
import userEvent from '@testing-library/user-event'
import {expect, test, vi} from 'vitest'
import {LambdaCreatePanel} from './LambdaCreatePanel'
import type {ServiceSchema} from '@/types/schema'
const schema: ServiceSchema = {
cloud: 'aws', service: 'serverless', displayName: 'AWS Lambda', actions: ['create'], columns: [], filters: [], capabilities: {resourceActions: []},
fields: [
{name: 'functionName', label: 'Function Name', type: 'text', required: true},
{name: 'runtime', label: 'Runtime', type: 'select', required: true, options: [{label: 'Node.js 22.x', value: 'nodejs22.x'}]},
{name: 'handler', label: 'Handler', type: 'text', required: true},
{name: 'role', label: 'Execution Role ARN', type: 'text', required: true},
{name: 'description', label: 'Description', type: 'text', required: false},
{name: 'code', label: 'Hello World Source', type: 'textarea', required: false},
],
}
function renderPanel(onSubmit = vi.fn()) {
render(<LambdaCreatePanel schema={schema} isSubmitting={false} submitError={null} onCancel={vi.fn()} onSubmit={onSubmit}/>)
return onSubmit
}
test('offers scratch and blueprint Lambda creation paths', () => {
renderPanel()
expect(screen.getByRole('button', {name: /start from scratch/i})).toBeVisible()
expect(screen.getByRole('button', {name: /^blueprints/i})).toBeVisible()
})
test('prefills the reviewed S3 upload processor blueprint', async () => {
const user = userEvent.setup()
renderPanel()
await user.click(screen.getByRole('button', {name: /^blueprints/i}))
expect(screen.getByText('Lambda Blueprints')).toBeVisible()
await user.click(screen.getByRole('button', {name: /s3 upload processor/i}))
expect(screen.getByText('Blueprint: S3 upload processor')).toBeVisible()
expect(screen.getByDisplayValue('Processes S3 object-created events.')).toBeVisible()
expect(screen.getByDisplayValue(/record\.s3\.bucket\.name/)).toBeVisible()
expect(screen.getByText(/create lambda, create bucket/i)).toBeVisible()
expect(screen.getByLabelText(/s3 bucket name/i)).toBeRequired()
})
test('keeps the blank creation form available', async () => {
const user = userEvent.setup()
renderPanel()
await user.click(screen.getByRole('button', {name: /start from scratch/i}))
expect(screen.getByText('Start from scratch')).toBeVisible()
expect(screen.getByLabelText(/function name/i)).toHaveValue('')
})
test('prefills the REST Lambda API blueprint and its deployment plan', async () => {
const user = userEvent.setup()
renderPanel()
await user.click(screen.getByRole('button', {name: /^blueprints/i}))
await user.click(screen.getByRole('button', {name: /rest lambda api/i}))
expect(screen.getByText('Blueprint: REST Lambda API')).toBeVisible()
expect(screen.getByDisplayValue(/event\.httpMethod/)).toBeVisible()
expect(screen.getByLabelText(/api name/i)).toBeVisible()
expect(screen.getByText(/grant api gateway permission/i)).toBeVisible()
})
test('prefills the scheduled Lambda blueprint and its EventBridge schedule', async () => {
const user = userEvent.setup()
renderPanel()
await user.click(screen.getByRole('button', {name: /^blueprints/i}))
await user.click(screen.getByRole('button', {name: /scheduled lambda/i}))
expect(screen.getByText('Blueprint: Scheduled Lambda')).toBeVisible()
expect(screen.getByDisplayValue(/scheduled event received/i)).toBeVisible()
expect(screen.getByLabelText(/rule name/i)).toBeVisible()
expect(screen.getByLabelText(/schedule expression/i)).toHaveValue('rate(5 minutes)')
expect(screen.getByText(/create eventbridge rule/i)).toBeVisible()
})
test('prefills the SQS worker blueprint and submits queue mapping settings', async () => {
const user = userEvent.setup()
const onSubmit = renderPanel()
await user.click(screen.getByRole('button', {name: /^blueprints/i}))
await user.click(screen.getByRole('button', {name: /sqs worker/i}))
expect(screen.getByText('Blueprint: SQS Worker')).toBeVisible()
expect(screen.getByDisplayValue(/event\.Records/)).toBeVisible()
await user.type(screen.getByLabelText(/sqs queue name/i), 'orders-queue')
await user.clear(screen.getByLabelText(/batch size/i))
await user.type(screen.getByLabelText(/batch size/i), '5')
await user.type(screen.getByLabelText(/function name/i), 'orders-worker')
await user.type(screen.getByLabelText(/execution role arn/i), 'arn:aws:iam::000000000000:role/lambda')
await user.click(screen.getByRole('button', {name: 'Create Lambda'}))
expect(onSubmit).toHaveBeenCalledWith(expect.objectContaining({
blueprintQueueName: 'orders-queue', blueprintSqsBatchSize: 5,
code: expect.stringContaining('event.Records'),
}))
})