mirror of
https://github.com/Matysh/houseplan-card
synced 2026-09-30 03:38:47 +00:00
fix(gates): ключ смоков покрывает оснастку и пробы гарда
Прогон #2371 (ee678352) добавил в demo/guard/verify-guard.mjs пробу
гарда benchmark — и job «Смоки в браузере» была ПРОПУЩЕНА как
переиспользованная. Причина в HARNESS.smoke: ключ держал ровно
demo/smoke_*.mjs, а `demo/serve.mjs`, `demo/guard/**` и benchmark, который
проба запускает, в него не входили. Файл исполняется только в этой job,
его правка её ключ не меняла — проба уехала в dev, ни разу не
запустившись.
Пропущенная проверка выглядит точно как пройденная: это тот же дефект,
против которого заведён #430, только этажом выше — не тест не умеет
падать, а job не запускается. Заодно это значит, что правки #404 в
serve.mjs и любой из четырёх проб гарда всё это время могли быть
реюзнуты.
Критерий ключа теперь один и читаемый: всё, что job исполняет.
Benchmark'и берутся все, а не по имени, — любой может быть подключён к
пробам позже, и лишний прогон дешевле молчания. demo/fixtures/** не
добавлен: он в корпусе sourceFingerprint, который уже подмешан в ключ.
Тест проверяет обе половины: файлы попадают в оснастку И правка каждого
меняет ключ. На прежнем предикате он краснеет (проверено).
Гейты: npm test 1791 tests, 1790 pass, 0 fail. Этот коммит меняет ключ
смоков, поэтому job со смоками на нём прогонится по-настоящему — вместе
с той пробой, ради которой всё и затевалось.
Issue: #430
User-Visible: no
This commit is contained in:
+22
-1
@@ -34,8 +34,29 @@ import { sourceFingerprint } from './source-fingerprint.mjs';
|
||||
*/
|
||||
export const HARNESS = {
|
||||
smoke: {
|
||||
// Всё, что job «Смоки в браузере» ИСПОЛНЯЕТ, а не только сами смоки (#430).
|
||||
//
|
||||
// До этой задачи ключ держал ровно `demo/smoke_*.mjs`. Из него выпадали:
|
||||
// `demo/serve.mjs` — сама оснастка, включая гард исключений; `demo/guard/**`
|
||||
// — отрицательные пробы этого гарда и запускающий их `verify-guard.mjs`;
|
||||
// benchmark, который одна из проб запускает с `--guard-probe`.
|
||||
//
|
||||
// Стоило это ровно того, чего и должно было. Прогон #2371 (ee678352)
|
||||
// добавлял в `verify-guard.mjs` пробу гарда benchmark — и job со смоками
|
||||
// была ПРОПУЩЕНА как переиспользованная: правка файла, который исполняется
|
||||
// только в ней, её ключ не меняла. Проба уехала в `dev`, ни разу не
|
||||
// запустившись. Пропущенная проверка выглядит точно как пройденная — и это
|
||||
// тот же дефект, против которого заведён весь #430.
|
||||
//
|
||||
// Benchmark'и берутся все, а не по имени: любой из них может быть подключён
|
||||
// к пробам позже, а платить за лишний прогон дешевле, чем за молчание.
|
||||
// `demo/fixtures/**` в ключ не входит — он в корпусе `sourceFingerprint`,
|
||||
// который уже подмешан в ключ строкой выше.
|
||||
roots: ['demo'],
|
||||
keep: (rel) => /^demo\/smoke_[^/]+\.mjs$/.test(rel),
|
||||
keep: (rel) => /^demo\/smoke_[^/]+\.mjs$/.test(rel)
|
||||
|| rel === 'demo/serve.mjs'
|
||||
|| /^demo\/guard\//.test(rel)
|
||||
|| /^demo\/benchmark_[^/]+\.mjs$/.test(rel),
|
||||
},
|
||||
golden: {
|
||||
// demo/golden/** целиком: и сценарии, и эталоны — эталон тоже вход
|
||||
|
||||
@@ -176,6 +176,38 @@ test('the CLI prints the key and writes it to GITHUB_OUTPUT', (t) => {
|
||||
}
|
||||
});
|
||||
|
||||
test('#430 ключ смоков покрывает всё, что эта job исполняет', () => {
|
||||
// Прогон #2371 (ee678352) добавил в verify-guard.mjs пробу гарда benchmark,
|
||||
// и job со смоками была пропущена как переиспользованная: файл исполняется
|
||||
// только там, а в её ключ не входил. Проба уехала в dev, не запустившись ни
|
||||
// разу. Здесь закреплено, что так больше не выйдет.
|
||||
const { dir, put } = makeTree();
|
||||
try {
|
||||
put('demo/serve.mjs', '// harness\n');
|
||||
put('demo/guard/verify-guard.mjs', '// probes\n');
|
||||
put('demo/guard/guard_tail_exception.mjs', '// probe\n');
|
||||
put('demo/benchmark_backdrop_decode.mjs', '// benchmark\n');
|
||||
const files = harnessFiles(dir, 'smoke');
|
||||
for (const rel of [
|
||||
'demo/serve.mjs',
|
||||
'demo/guard/verify-guard.mjs',
|
||||
'demo/guard/guard_tail_exception.mjs',
|
||||
'demo/benchmark_backdrop_decode.mjs',
|
||||
]) {
|
||||
assert.ok(files.includes(rel), `${rel} вне ключа смоков — его правка будет реюзнута`);
|
||||
}
|
||||
// И ключ обязан меняться от правки каждого из них: список файлов сам по
|
||||
// себе ничего не гарантирует, если хэш их не читает.
|
||||
for (const rel of files) {
|
||||
const before = reuseKey(dir, 'smoke');
|
||||
put(rel, '// changed\n');
|
||||
assert.notEqual(reuseKey(dir, 'smoke'), before, `${rel}: правка не меняет ключ`);
|
||||
}
|
||||
} finally {
|
||||
rmSync(dir, { recursive: true, force: true });
|
||||
}
|
||||
});
|
||||
|
||||
test('HARNESS keeps scripts/** out of the keys on purpose', () => {
|
||||
// Инфраструктурная работа правит scripts/** постоянно. Если бы каталог
|
||||
// целиком попал в ключ, переиспользование не срабатывало бы никогда — ровно
|
||||
|
||||
Reference in New Issue
Block a user