// 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') }) })