Batch валидация

Batch-валидация в контексте Vest представляет собой механизм объединённого выполнения множества правил проверки данных в рамках одной сессии валидации. Основная цель подхода — минимизация количества повторных проходов по данным, синхронизация асинхронных проверок и консолидация ошибок в единый структурированный результат.

Vest устроен вокруг концепции «сьютов» (suites), где набор правил выполняется последовательно или частично параллельно в зависимости от условий. Batch-валидация в этом контексте означает выполнение группы проверок как единого вычислительного блока с контролем состояния ошибок и оптимизацией повторных вычислений.


Архитектурная основа batch-валидации

Внутри Vest каждая валидация строится как функция-сценарий, в которой описываются правила проверки полей. Batch-подход опирается на несколько ключевых механизмов:

  • накопление ошибок в локальном контексте сьюта
  • ленивое выполнение проверок до момента вызова validate
  • объединение синхронных и асинхронных правил
  • дедупликация повторяющихся проверок
  • контроль зависимости между полями

Суть batch-валидации заключается в том, что все правила, относящиеся к одному прогону, рассматриваются как единая транзакция проверки.


Принцип группировки правил

Vest позволяет объединять проверки по полям и логическим блокам. Batch-валидация строится вокруг идеи, что набор правил не должен выполняться изолированно, если они относятся к одной модели данных.

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

import { suite, test } from 'vest';

const validateUser = (data) =>
  suite('user', () => {

    test('email', 'Invalid email', () => {
      expect(data.email).toMatch(/.+@.+\..+/);
    });

    test('password', 'Password too short', () => {
      expect(data.password.length).toBeGreaterThan(6);
    });

    test('age', 'User must be adult', () => {
      expect(data.age).toBeGreaterThanOrEqual(18);
    });

  });

Все три проверки выполняются как единый batch-процесс при вызове validateUser(data).


Оптимизация повторных прогонов

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

Vest использует механизм кеширования состояния:

  • идентификация сьюта по имени
  • отслеживание входных параметров
  • сравнение предыдущего состояния с текущим
  • пропуск неизменённых тестов

Это особенно важно при работе в UI-среде, где каждый ввод символа может запускать повторную валидацию формы.


Асинхронные batch-проверки

Batch-валидация в Vest поддерживает асинхронные правила, например запросы к серверу для проверки уникальности email.

test('email', 'Email already exists', async () => {
  await delay(200);
  const exists = await api.checkEmail(data.email);
  expect(exists).toBe(false);
});

В batch-режиме такие проверки:

  • объединяются в общий поток выполнения
  • могут выполняться параллельно с другими асинхронными тестами
  • не блокируют синхронные проверки
  • возвращают агрегированный результат после завершения всех промисов

Аггрегация ошибок в batch-режиме

Одной из ключевых задач batch-валидации является формирование единой структуры ошибок. Vest не останавливается на первой ошибке, а собирает полный набор проблем.

Результат batch-валидации содержит:

  • состояние каждого поля
  • список всех ошибок
  • статус валидности сьюта
  • метаданные выполнения

Пример результата:

{
  isValid: false,
  errors: {
    email: ['Invalid email', 'Email already exists'],
    password: ['Password too short'],
    age: []
  }
}

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


Инкрементальная batch-валидация

В сложных формах важно не пересчитывать весь набор правил при изменении одного поля. Vest поддерживает инкрементальный batch-подход:

  • изменённое поле триггерит только связанные тесты
  • независимые проверки пропускаются
  • результат объединяется с предыдущим состоянием

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


Контроль порядка выполнения

Batch-валидация не означает произвольное выполнение правил. Vest сохраняет строгий порядок:

  1. синхронные проверки
  2. быстрые логические проверки
  3. асинхронные операции
  4. зависимые проверки

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


Условные batch-группы

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

test.onlyIf(data.role === 'admin')('adminCode', 'Invalid code', () => {
  expect(data.adminCode).toBeDefined();
});

Такие конструкции создают логические подгруппы внутри batch-валидации, которые активируются только при выполнении условий.


Повторное использование batch-сценариев

Batch-валидация в Vest хорошо сочетается с композиционным подходом. Сценарии можно переиспользовать:

const emailValidation = (email) => {
  test('email format', () => {
    expect(email).toMatch(/.+@.+\..+/);
  });

  test('email domain', () => {
    expect(email.endsWith('.com')).toBe(true);
  });
};

И включать их в разные сьюты без дублирования логики. Это превращает batch-проверки в модульные блоки валидации.


Производительность batch-валидации

Основные факторы оптимизации:

  • сокращение повторных вычислений через кеширование
  • группировка асинхронных запросов
  • раннее завершение при критических ошибках (fail-fast режим)
  • минимизация пересоздания сьютов

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


Интеграция batch-валидации с UI-состоянием

Batch-результаты обычно напрямую связываются с состоянием интерфейса:

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

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


Управление зависимостями между полями

Batch-валидация особенно важна при наличии перекрёстных зависимостей:

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

Vest обрабатывает такие зависимости через общий контекст сьюта, где изменения одного значения могут триггерить пересчёт связанных правил в рамках одного batch-прогона.