diff --git a/scripts/mutation-gate.mjs b/scripts/mutation-gate.mjs index fb7f80c5..958cecd9 100644 --- a/scripts/mutation-gate.mjs +++ b/scripts/mutation-gate.mjs @@ -122,6 +122,19 @@ export const MUTANTS = [ replace: ' const span = centre;', }], }, + { + id: 'docs-fixture-splits-posix-only', + guard: 'node --test --test-name-pattern="не зависит от разделителя платформы" ' + + 'test/docs-accept.test.mjs', + because: 'фикстура приёмки разбирала путь только по «/» и на Windows отдавала весь путь ' + + 'вместо имени файла: три проверки краснели на верной реализации, а Linux этого не ' + + 'видел вовсе — регресс обязан краснеть на любой платформе (#247)', + patches: [{ + file: 'test/docs-accept.test.mjs', + find: "export const basename = (path) => String(path).split(/[\\\\/]/).filter(Boolean).pop() ?? '';", + replace: "export const basename = (path) => String(path).split('/').pop() ?? '';", + }], + }, { id: 'docs-accept-takes-any-chromium', guard: 'node --test --test-name-pattern="без названного Chromium" test/docs-accept.test.mjs', diff --git a/test/docs-accept.test.mjs b/test/docs-accept.test.mjs index 6775aa39..9526ca8f 100644 --- a/test/docs-accept.test.mjs +++ b/test/docs-accept.test.mjs @@ -39,8 +39,15 @@ const candidate = (overrides = {}) => { }; }; +// Разделитель зависит от платформы, а фикстура — нет (#247). `resolve()` на +// Windows отдаёт `C:\\artifact\\01-view-desktop.png`, и разбор только по «/» +// возвращал весь путь целиком: `idOf` давал undefined, синтетический хэш не +// сходился, и три проверки краснели на верной реализации. Linux этого не ловил +// вовсе — поэтому ниже отдельный тест на сам разбор. +export const basename = (path) => String(path).split(/[\\/]/).filter(Boolean).pop() ?? ''; + const idOf = (path) => { - const file = String(path).split('/').pop(); + const file = basename(path); return DOC_SCREENSHOTS.find((scenario) => scenario.file === file)?.id; }; @@ -112,3 +119,12 @@ test('кандидат чужой версии манифеста не прин assert.throws(() => verify(candidate({ version: DOC_SCREENSHOT_VERSION + 1 })), /версии/); }); + +test('разбор пути фикстуры не зависит от разделителя платформы (#247)', () => { + // Тест существует, чтобы регресс к `split('/')` краснел и на Linux: сам по + // себе набор проверок выше на POSIX-путях проходит при любом разборе. + assert.equal(basename('C:\\artifact\\01-view-desktop.png'), '01-view-desktop.png'); + assert.equal(basename('/artifact/01-view-desktop.png'), '01-view-desktop.png'); + assert.equal(basename('C:/artifact/sub\\02-view-touch.png'), '02-view-touch.png'); + assert.equal(basename('01-view-desktop.png'), '01-view-desktop.png'); +});