Files
cc-1c-skills/tests/web-test/_suite-root/nested/01-nested.test.mjs
T
Nick ShirokovandClaude Opus 4.8 90d8263a05 fix(web-test): резолвить корень сьюта подъёмом вверх, а не от переданного пути
Конфиг и хуки резолвились строго от каталога первого позиционного пути, поэтому
запуск подкаталога сьюта был невозможен: `test tests/app/00-smoke/` падал с
«No URL provided and no webtest.config.mjs found» — хотя спека прямо обещает
запуск подкаталога («Фильтр по пути с CLI»).

Опаснее отказа по URL были два молчаливых следствия: при `--url=` прогон
подкаталога терял `_hooks.mjs` и ехал по неподготовленному стенду без единого
предупреждения, а `_allure/` не находился. Плюс `file:` в отчёте считался от
переданного пути, из-за чего один и тот же тест получал разный ID в зависимости
от способа запуска и рвал историю Allure/JUnit.

Введён корень сьюта: подъём от каталога пути до первого `webtest.config.mjs`
ИЛИ `_hooks.mjs` (конфиг необязателен — сьют только с хуками иначе снова терял
бы подготовку), с ограничением подъёма каталогом `.git`/`.v8-project.json`, а
при их отсутствии — cwd. Граница ничего не выбирает, только останавливает, так
что ложная граница даёт «корень не найден», а не чужой корень. От найденного
корня берутся все пять ролей: конфиг, хуки, каталог отчёта, пути в отчёте,
`_allure/`.

Попутно: пути из разных сьютов в одном прогоне теперь отвергаются (раньше
молча выигрывал первый путь, и сьют B ехал по подготовке сьюта A); найденный
корень печатается в шапке; отсутствие корня — предупреждение в stderr;
диагностика говорит про корень сьюта, а не только про URL.

Проверено: 12/12 офлайн-кейсов резолвера; полный регресс 29/29 до и после —
`file`/`name`/`status` идентичны; `_suite-root/nested/` (сценарий, который
падал) проходит с подхваченными конфигом и хуками; `_hang/` 6/6.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-20 14:41:16 +03:00

23 lines
1.2 KiB
JavaScript

// The only test of the suite-root fixture. Kept as light as possible — it is not here to test
// the application, it is here to be run as `test tests/web-test/_suite-root/nested/` and prove
// that config (URL) and hooks were resolved one level up. Before v1.9 that invocation died with
// "No URL provided and no webtest.config.mjs found".
import { existsSync } from 'fs';
import { resolve, dirname } from 'path';
import { fileURLToPath } from 'url';
const SUITE_ROOT = resolve(dirname(fileURLToPath(import.meta.url)), '..');
export const name = 'suite-root: конфиг и хуки подхвачены на уровень выше';
export const tags = ['suite-root'];
export const timeout = 60000;
export default async function({ getPageState, assert, log }) {
const state = await getPageState();
const names = (state.sections || []).map(s => s.name);
log('sections: ' + names.join(', '));
assert.ok(names.length >= 1, 'сеанс открыт → URL взят из конфига в корне сюиты');
assert.ok(existsSync(resolve(SUITE_ROOT, 'prepare-ran.txt')),
'prepare() отработал → _hooks.mjs взят из корня сюиты, а не потерян');
}