temp changes
All checks were successful
Chore App Build, Test, and Push Docker Images / build-and-push (push) Successful in 2m59s
All checks were successful
Chore App Build, Test, and Push Docker Images / build-and-push (push) Successful in 2m59s
This commit is contained in:
74
frontend/vue-app/e2e/create-child/validation.spec.ts
Normal file
74
frontend/vue-app/e2e/create-child/validation.spec.ts
Normal file
@@ -0,0 +1,74 @@
|
||||
// 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')
|
||||
})
|
||||
})
|
||||
Reference in New Issue
Block a user