Files
catalyst/ui/tests/e2e/reactions.spec.ts
2025-09-02 21:58:08 +02:00

104 lines
3.5 KiB
TypeScript

import { expect } from '@playwright/test'
import { randomUUID } from 'crypto'
import { login, test } from './util'
const createReaction = async (page, name: string) => {
await page.goto('reactions')
await page.getByRole('button', { name: 'New Reaction' }).click()
await page.waitForURL('**/reactions/new')
await page.locator('#name').fill(name)
await page.locator('#trigger').selectOption('Schedule')
await page.locator('#expression').fill('* * * * *')
await page.locator('#action').selectOption('Python')
await page.locator('#script').fill('print("Hello, world!")')
const saveBtn = page.getByRole('button', { name: 'Save' }).last()
await expect(saveBtn).toBeEnabled()
await saveBtn.click()
await page.waitForURL('**/reactions/r*')
}
test('reactions list shows existing reactions', async ({ page }) => {
await login(page)
await page.goto('reactions')
await expect(page.getByRole('heading', { name: 'Reactions' })).toBeVisible()
})
test('can create a reaction', async ({ page }) => {
await login(page)
const name = `playwright-${randomUUID()}`
await createReaction(page, name)
await expect(page.locator('#name')).toHaveValue(name)
await expect(page.locator('#trigger')).toHaveValue('schedule')
await expect(page.locator('#expression')).toHaveValue('* * * * *')
await expect(page.locator('#action')).toHaveValue('python')
await expect(page.locator('#script')).toHaveValue('print("Hello, world!")')
})
test.describe('update a reaction', () => {
const updates = [
{
field: 'name',
update: async (page) => {
await page.waitForSelector('#name')
await page.locator('#name').fill("Updated Reaction")
},
selector: '#name',
value: 'Updated Reaction'
},
{
field: 'trigger',
update: async (page) => {
await page.waitForSelector('#trigger')
await page.locator('button').filter({ hasText: 'Schedule' }).click()
await page.getByRole('option', { name: 'HTTP / Webhook' }).click()
await page.locator('#path').fill('webhook')
},
selector: '#trigger',
value: 'webhook'
},
{
field: 'action',
update: async (page) => {
await page.waitForSelector('#action')
await page.locator('button').filter({ hasText: 'Python' }).click()
await page.getByRole('option', { name: 'HTTP / Webhook' }).click()
await page.locator('#url').fill('https://example.com')
},
selector: '#action',
value: 'webhook'
},
{
field: 'script',
update: async (page) => {
await page.waitForSelector('#script')
await page.locator('#script').fill('pass')
},
selector: '#script',
value: 'pass'
},
]
for (const { field, update, selector, value } of updates) {
test(`can update ${field}`, async ({ page }) => {
await login(page)
const name = `playwright-${randomUUID()}`
await createReaction(page, name)
await update(page)
const saveBtn = page.getByRole('button', { name: 'Save' }).last()
await expect(saveBtn).toBeEnabled()
await saveBtn.click()
await expect(page.locator(selector)).toHaveValue(value)
})
}
})
test('can delete a reaction', async ({ page }) => {
await login(page)
const name = `playwright-${randomUUID()}`
await createReaction(page, name)
await page.getByRole('button', { name: 'Delete Reaction' }).click()
await page.getByRole('dialog').getByRole('button', { name: 'Delete' }).click()
await page.waitForURL('**/reactions')
await expect(page.locator(`text=${name}`)).toHaveCount(0)
})