All checks were successful
Chore App Build, Test, and Push Docker Images / build-and-push (push) Successful in 2m59s
75 lines
3.0 KiB
TypeScript
75 lines
3.0 KiB
TypeScript
// spec: e2e/plans/create-child.plan.md
|
|
|
|
import { test, expect } from '@playwright/test'
|
|
|
|
test.describe('Create Child', () => {
|
|
test.beforeEach(async ({ page }) => {
|
|
// Navigate to app root - router redirects to /parent (children list) when parent-authenticated
|
|
await page.goto('/')
|
|
await page.getByRole('button', { name: 'Add Child' }).click()
|
|
await expect(page.getByRole('heading', { name: 'Create Child' })).toBeVisible()
|
|
})
|
|
|
|
test('Reject submission when Name is empty', async ({ page }) => {
|
|
// 2. Leave Name empty, enter '7' in Age, click Create
|
|
await page.getByLabel('Age').fill('7')
|
|
await page.getByRole('button', { name: 'Create' }).click()
|
|
|
|
// expect: error message and still on create form
|
|
await expect(page.locator('.error')).toHaveText('Child name is required.')
|
|
await expect(page).toHaveURL('/parent/children/create')
|
|
})
|
|
|
|
test('Reject submission when Name is whitespace only', async ({ page }) => {
|
|
// 2. Enter only spaces in Name, enter '7' in Age, click Create
|
|
await page.getByLabel('Name').fill(' ')
|
|
await page.getByLabel('Age').fill('7')
|
|
await page.getByRole('button', { name: 'Create' }).click()
|
|
|
|
// expect: error message and still on create form
|
|
await expect(page.locator('.error')).toHaveText('Child name is required.')
|
|
await expect(page).toHaveURL('/parent/children/create')
|
|
})
|
|
|
|
test('Reject submission when Age is empty', async ({ page }) => {
|
|
// 2. Enter 'Charlie', clear Age - Create button should be disabled
|
|
await page.getByLabel('Name').fill('Charlie')
|
|
await page.getByLabel('Age').clear()
|
|
|
|
await expect(page.getByRole('button', { name: 'Create' })).toBeDisabled()
|
|
await expect(page).toHaveURL('/parent/children/create')
|
|
})
|
|
|
|
test('Reject negative age', async ({ page }) => {
|
|
// 2. Enter 'Dave', enter '-1', click Create
|
|
await page.getByLabel('Name').fill('Dave')
|
|
await page.getByLabel('Age').fill('-1')
|
|
await page.getByRole('button', { name: 'Create' }).click()
|
|
|
|
// expect: error message and still on create form
|
|
await expect(page.locator('.error')).toHaveText('Age must be a non-negative number.')
|
|
await expect(page).toHaveURL('/parent/children/create')
|
|
})
|
|
|
|
test('Enforce maximum Name length of 64 characters', async ({ page }) => {
|
|
// 2. Type a 65-character name - HTML maxlength caps it at 64
|
|
const longName = 'A'.repeat(65)
|
|
await page.getByLabel('Name').fill(longName)
|
|
await expect(page.getByLabel('Name')).toHaveValue('A'.repeat(64))
|
|
|
|
// 3. Enter '5' in Age and submit successfully
|
|
await page.getByLabel('Age').fill('5')
|
|
await page.getByRole('button', { name: 'Create' }).click()
|
|
await expect(page).toHaveURL('/parent')
|
|
})
|
|
|
|
test('Reject age greater than 120', async ({ page }) => {
|
|
// 2. Enter 'Eve', enter '121' in Age - Create button should be disabled
|
|
await page.getByLabel('Name').fill('Eve')
|
|
await page.getByLabel('Age').fill('121')
|
|
|
|
await expect(page.getByRole('button', { name: 'Create' })).toBeDisabled()
|
|
await expect(page).toHaveURL('/parent/children/create')
|
|
})
|
|
})
|