Модуль 6 · Урок 22

Web forms, controls і validation states

Form testing — це не лише happy submit. Перевіряйте label/name/type, constraints, keyboard/focus, serialization intent і повний state machine: pristine, editing, invalid, submitting, success, error та retry.

LabelsConstraint APIFocusState matrix

Native control дає поведінку

Label має бути програмно пов’язаний із control через `for/id` або wrapping. Appropriate input type додає keyboard, parsing і intrinsic constraints; `name` визначає ключ form data. Placeholder не замінює persistent label.

КонтрактПеревірка
IdentityУнікальний id, правильний name, label activates control.
TypeEmail/date/number semantics відповідають data й device input.
Staterequired/disabled/readonly/checked/value відображають реальний workflow.
SubmissionЛише successful controls із name входять до payload intent.

Constraint validation — один шар

`required`, `type`, `min/max`, `minlength/maxlength`, `pattern` створюють native constraints. `validity` пояснює причину, `checkValidity()` повертає boolean, `reportValidity()` також показує user-facing feedback. `novalidate` і direct `form.submit()` змінюють interactive behavior.

Client validation не є security boundary

HTML можна змінити в DevTools або обійти crafted request. Server завжди повторно перевіряє authorization, type, range, business rules та integrity.

State matrix важливіша за один input

Pristine/editingПідказка не виглядає як premature error.
InvalidMessage називає problem і пов’язаний із field; focus predictable.
SubmittingDuplicate action controlled; progress perceivable.
SuccessState committed once, message/action next clear.
Error/retryData не губляться без причини; retry не дублює side effect.

Boundary і cross-field cases

Окрім empty/valid/invalid format тестуйте trimmed Unicode, min/max inclusivity, timezones, paste/autofill, duplicate submit, browser back/refresh і cross-field rules. Native API не знає, що end date має бути після start date, доки application не задасть custom constraint.

Практика

Заповніть `form-test-matrix.csv`: control/state/input/constraint/UI/DOM-or-API/focus/evidence. Не використовуйте real email або payment data.

Офіційні джерела

Практична перевірка · урок 22 з 36

Закріпіть матеріал уроку

Три сценарні питання. Для зарахування уроку потрібно дати щонайменше дві правильні відповіді.

1. Як найнадійніше пов’язати label з input?
2. Чому placeholder не замінює label?
3. Що задає name у form control?