Files
chore/frontend/vue-app/e2e/create-child/validation.spec.ts
Ryan Kegel accf596bd7
All checks were successful
Chore App Build, Test, and Push Docker Images / build-and-push (push) Successful in 2m30s
more tests
2026-03-09 13:28:43 -04:00

77 lines
3.1 KiB
TypeScript

// spec: e2e/plans/create-child.plan.md
import { test, expect } from '@playwright/test'
test.describe('Create Child', () => {
test.beforeEach(async ({ page }, testInfo) => {
test.skip(testInfo.project.name === 'chromium-no-pin', 'Requires parent-authenticated mode')
// 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')
})
})