Методы проверки статуса

Состояние результата в Vest формируется как итог выполнения тестового набора и представляет собой структурированный объект, содержащий информацию о валидности, ошибках, предупреждениях и текущих асинхронных процессах. Работа с этим состоянием строится вокруг набора предикатов и селекторов, позволяющих определить статус всей формы или отдельных её полей без необходимости ручного обхода внутренних структур.

Результат выполнения validation suite в Vest представляет собой объект, содержащий несколько ключевых категорий данных:

  • состояние валидности (успешно/ошибки присутствуют)
  • коллекции ошибок и предупреждений
  • флаги асинхронной активности
  • метаданные выполнения тестов

Основной принцип заключается в том, что состояние всегда вычисляется детерминированно на основе выполненных правил, а не изменяется вручную.

Ключевыми свойствами обычно выступают:

  • isValid — итоговая валидность набора
  • errors — структура ошибок по полям
  • warnings — предупреждения, не блокирующие валидность
  • pending — наличие незавершённых асинхронных проверок
  • tests — результаты отдельных проверок

Проверка общей валидности

Наиболее часто используемый метод определения состояния — проверка общей валидности результата.

Логическое свойство isValid позволяет определить, прошла ли форма все правила проверки без ошибок:

if (result.isValid) {
  // все проверки пройдены
}

Данный флаг вычисляется на основе отсутствия ошибок в структуре errors. Даже при наличии предупреждений результат может считаться валидным, поскольку warnings не влияют на блокирующую логику.

Противоположное состояние часто проверяется через отрицание:

if (!result.isValid) {
  // есть ошибки валидации
}

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

Работа с ошибками

Ошибки в Vest структурируются по полям, что позволяет точно определять проблемные участки данных. Объект errors обычно имеет вид отображения ключей полей на массивы сообщений.

Проверка наличия ошибок в целом:

const hasErrors = Object.keys(result.errors).length > 0;

Однако в рамках Vest чаще применяется готовая логика:

if (result.hasErrors) {
  // существуют ошибки
}

Некоторые реализации используют производные селекторы для проверки конкретных полей:

const emailErrors = result.errors.email;
const hasEmailError = Boolean(emailErrors);

Подобный подход позволяет локализовать обработку ошибок на уровне UI-компонентов.

Предупреждения и некритические состояния

Предупреждения отделяются от ошибок и не влияют на итоговую валидность, но могут использоваться для отображения дополнительной информации пользователю.

Проверка наличия предупреждений:

const hasWarnings = Object.keys(result.warnings).length > 0;

Либо через предикат:

if (result.hasWarnings) {
  // есть предупреждения
}

Предупреждения часто применяются в сценариях частичной валидации, когда данные допустимы, но требуют уточнения или рекомендаций.

Асинхронное состояние и pending-проверки

Одной из ключевых особенностей Vest является поддержка асинхронной валидации. Это приводит к появлению промежуточного состояния pending, которое указывает на незавершённые проверки (например, запросы к серверу).

Проверка выполняется через:

if (result.pending) {
  // идёт асинхронная проверка
}

Также часто используется отрицательная форма:

if (!result.pending) {
  // все проверки завершены
}

Это состояние критично для предотвращения преждевременной отправки формы, когда часть данных ещё не прошла серверную проверку уникальности или доступности.

Проверка состояния отдельных полей

Vest предоставляет возможность проверять статус не только всей формы, но и отдельных полей. Это особенно важно при построении реактивных интерфейсов.

Пример проверки валидности конкретного поля:

const isEmailValid = !result.errors.email;

Проверка наличия ошибок у поля:

const hasEmailError = Boolean(result.errors.email);

Проверка предупреждений для поля:

const hasEmailWarning = Boolean(result.warnings.email);

Подобная гранулярность позволяет строить интерфейсы, где каждое поле независимо отображает свой статус.

Производные селекторы состояния

Для упрощения работы с результатом часто используются производные функции, которые инкапсулируют логику проверки статуса.

Пример логического селектора:

const isFormValid = (result) => result.isValid && !result.pending;

Такой подход позволяет учитывать не только отсутствие ошибок, но и завершённость всех асинхронных операций.

Другой вариант:

const isFormReadyToSubmit = (result) =>
  result.isValid && Object.keys(result.errors).length === 0 && !result.pending;

Эти селекторы часто применяются в архитектуре UI-слоя для унификации условий отправки данных.

Состояние выполнения тестов

Каждое правило в Vest представлено тестом, результат которого сохраняется в объекте tests. Это позволяет анализировать состояние на уровне отдельных проверок.

Пример структуры:

tests: {
  email: [
    { message: "Invalid email", passed: false },
    { message: "Required", passed: true }
  ]
}

Проверка статуса конкретного теста:

const emailTests = result.tests.email;
const hasFailedEmailTests = emailTests.some(t => !t.passed);

Этот уровень детализации используется в сложных формах, где важно понимать не только факт ошибки, но и её источник.

Интеграция статуса в реактивные интерфейсы

Состояние проверки часто используется в связке с реактивными библиотеками. Логика строится вокруг автоматического пересчёта статуса при изменении данных.

Типичный сценарий:

const canSubmit = result.isValid && !result.pending;

<button disabled={!canSubmit}>
  Отправить
</button>

При этом важно учитывать, что isValid не всегда достаточно, поскольку асинхронные проверки могут находиться в процессе выполнения.

Композитные проверки состояния

В реальных приложениях статус часто определяется комбинацией нескольких факторов:

  • отсутствие ошибок
  • отсутствие активных асинхронных операций
  • наличие обязательных полей
  • отсутствие критических предупреждений

Пример:

const isReady =
  result.isValid &&
  !result.pending &&
  Object.keys(result.errors).length === 0;

Такая композиция позволяет точно контролировать момент перехода формы в состояние готовности.

Проверка состояния через декомпозицию результата

Иногда результат проверки деструктурируется для удобства работы:

const { isValid, errors, pending, warnings } = result;

Далее логика строится на основе локальных переменных, что упрощает чтение условий:

const hasBlockingIssues = !isValid || pending;

Подобный стиль часто применяется в крупных формах с множеством зависимых полей.

Сравнение состояний между изменениями

При динамической валидации важно отслеживать изменения статуса:

const wasValid = previous.isValid;
const isNowValid = result.isValid;

const becameValid = !wasValid && isNowValid;

Это позволяет запускать побочные эффекты при переходе формы в корректное состояние, например активацию кнопок или автосохранение.

Приоритеты состояний

При анализе результата проверки используется иерархия состояний:

  1. pending (незавершённость)
  2. errors (ошибки)
  3. warnings (предупреждения)
  4. valid (успешное состояние)

Такой порядок важен для UI-логики, где незавершённые операции имеют более высокий приоритет, чем итоговая валидность.

if (result.pending) {
  // блокировка действий
} else if (result.hasErrors) {
  // отображение ошибок
} else if (result.hasWarnings) {
  // отображение рекомендаций
}

Локальная проверка состояния в сложных формах

В формах с вложенными структурами данных статус может проверяться на уровне сегментов:

const addressValid = !result.errors.address;
const userValid = !result.errors.user;

Затем формируется общий статус:

const formValid = addressValid && userValid;

Такой подход позволяет распределять ответственность между частями формы и избегать монолитной логики проверки.