Source: tests/helpers/formValidation.mjs

import { AuthenticationController } from "../../controllers/AuthenticationController.mjs";
import { UsersController } from "../../controllers/UsersController.mjs";
import { LocationController } from "../../controllers/LocationController.mjs";
import { ActivitiesController } from "../../controllers/ActivitiesController.mjs";
import { BlogController } from "../../controllers/BlogController.mjs";
import { SessionsController } from "../../controllers/SessionsController.mjs";
import { BookingsController } from "../../controllers/BookingsController.mjs";

/** Validation middleware for each form, keyed by the name used in tests. */
export const formValidation = {
  login: AuthenticationController.loginValidation,
  register: AuthenticationController.registerValidation,
  users: UsersController.formValidation,
  locations: LocationController.formValidation,
  activities: ActivitiesController.formValidation,
  blogs: BlogController.formValidation,
  sessions: SessionsController.formValidation,
  bookings: BookingsController.formValidation,
};

/**
 * Runs a form's validation middleware in order without starting Express.
 * Fills in `originalUrl` and a session stub when the request does not have them.
 * @param {string} form Key of `formValidation` to run.
 * @param {object} req Mock request with `body` and optional `params`.
 * @param {object} res Mock response.
 * @returns {Promise<boolean>} True when every middleware called `next()`; false
 *   when validation redirected back to the form.
 */
export const runFormValidation = async (form, req, res) => {
  const base =
    form === "login"
      ? "/authenticate"
      : form === "register"
        ? "/authenticate/register"
        : `/${form}`;
  req.originalUrl ??= `${base}${req.params?.id ? `/${req.params.id}` : ""}`;
  req.session ??= {};
  req.session.save ??= (callback) => callback();
  for (const middleware of formValidation[form]) {
    let continued = false;
    await middleware(req, res, (error) => {
      if (error) {
        throw error;
      }
      continued = true;
    });
    if (!continued) {
      return false;
    }
  }
  return true;
};