Files
strapi/tests/migration/framework/validators.js
Ben Irvin 446b9ebb19 feat(migration): add declarative fixture spec and pluggable validators
Replace the monolithic validate-migration.js with a thin orchestrator
backed by tests/migration/fixture: spec-driven expectations, registry
profiles, and modular check modules.
2026-05-28 19:09:43 +02:00

105 lines
2.7 KiB
JavaScript

'use strict';
const path = require('path');
const execa = require('execa');
/**
* @param {Record<string, string>} baseEnv
* @param {{ multiplier: number, dbEnv: object, validatorProfile: string, dataOrigin?: string }} extra
*/
function buildValidateEnv(ctx, { multiplier, dbEnv, validatorProfile, dataOrigin }) {
return {
...process.env,
...dbEnv,
MIGRATION_MULTIPLIER: String(multiplier),
SEED_MULTIPLIER: String(multiplier),
MIGRATION_VALIDATOR_PROFILE: validatorProfile,
...(dataOrigin ? { MIGRATION_DATA_ORIGIN: dataOrigin } : {}),
};
}
async function runValidationScript(ctx, validateEnv, multiplier) {
await execa(
'node',
[path.join('scripts', 'validate-migration.js'), '--multiplier', String(multiplier)],
{
cwd: ctx.COMPLEX_DIR,
stdio: 'inherit',
env: validateEnv,
}
);
}
const REGISTRY = {
/**
* v4 canonical seed → workspace expectations (default origin v4). Alias for `full-v4-origin`.
*/
full: async (ctx, opts) => {
return REGISTRY['full-v4-origin'](ctx, opts);
},
'full-v4-origin': async (ctx, { multiplier, dbEnv, dataOrigin = 'v4' }) => {
await runValidationScript(
ctx,
buildValidateEnv(ctx, {
multiplier,
dbEnv,
validatorProfile: 'full-v4-origin',
dataOrigin: dataOrigin || 'v4',
}),
multiplier
);
},
'full-v5-origin': async (ctx, { multiplier, dbEnv, dataOrigin = 'v5' }) => {
await runValidationScript(
ctx,
buildValidateEnv(ctx, {
multiplier,
dbEnv,
validatorProfile: 'full-v5-origin',
dataOrigin: dataOrigin || 'v5',
}),
multiplier
);
},
/**
* Same as full-v4-origin but skips DP join-table source parity (ladder / double discard-drafts).
* Origin defaults to v4; pass scenario.dataOrigin for mixed cases.
*/
'full-ladder': async (ctx, { multiplier, dbEnv, dataOrigin = 'v4' }) => {
await runValidationScript(
ctx,
buildValidateEnv(ctx, {
multiplier,
dbEnv,
validatorProfile: 'full-ladder',
dataOrigin,
}),
multiplier
);
},
};
/**
* @param {object} ctx
* @param {string[]} names
* @param {{ multiplier: number, dbEnv: object, dataOrigin: string }} opts
*/
async function runValidators(ctx, names, { multiplier, dbEnv, dataOrigin = 'v4' }) {
const list = Array.isArray(names) ? names : [];
for (const name of list) {
const fn = REGISTRY[name];
if (!fn) {
throw new Error(
`Unknown migration validator "${name}". Known: ${Object.keys(REGISTRY).join(', ')}`
);
}
console.log(`\n✅ Validator: ${name}`);
await fn(ctx, { multiplier, dbEnv, dataOrigin });
}
}
module.exports = { runValidators, REGISTRY };