mirror of
https://github.com/Matysh/houseplan-card
synced 2026-09-29 11:18:48 +00:00
Волна 4 эпика #674. docs/testing-notes/: восемь ручных чек-листов по поверхностям и индекс удалены — ни одного отмеченного пункта, ручной фазы в PROCESS.md §2 нет. Правило #650 (пустое совпадение --test-name-pattern) перенесено в TESTING.md; пункты [manual] без автоматического свидетеля сведены в раздел «Чего не проверяет автоматика» (реальный HA, сенсорное устройство, ресурсы сервера, несколько клиентов, визуальная оценка, пользовательское содержимое). В TESTING.md снят блок чек-листов v1.43–1.44 и приложения по issue в разделе golden (#197/#249/#272/#275/#288/#261) — сцены объявлены в demo/golden/matrix.mjs. Остался реестр браузерных гвардов #659 (mutation-browser-guards.md). test/testing-notes-index.test.mjs → test/testing-doc.test.mjs: лимит 800 строк, правила #85, раздел ручных проверок и живые ссылки TESTING.md; каталог testing-notes содержит только реестр. Мутант testing-notes-index-drops-section (удалял строку индекса) → testing-doc-drops-manual-section. golden-matrix: копия 67 id сцен #242/#250 в чек-листе снята, список и способ его измерения — в demo/golden/matrix.mjs. docs/design/505-summary-panel удалён вместе с demo/capture_summary_panel_505.mjs и маршрутом /reference/ фикстуры диалога. docs/design/600-settings-dialogs: reference/, screenshots/, pairs/, ARCHIVE-README, ISSUE-FORM, OPEN-POINTS удалены; SPEC, IMPLEMENTATION-GUIDE, field-maps, ACCEPTANCE остаются; вывод capture_design_pairs_600.mjs и verify_ha_form_shell_609.mjs --capture — в artifacts/. docs/design: 68 файлов / 4,08 МБ → 13 / 0,70 МБ. README-ha-dialog-505.md → README-ha-dialog.md (путь в release-review.yml); demo/guard/README.md: запись гварда — в verify-guard.mjs, не в README. docs/design/649-25d-stage6 не тронут — пункт после стабильного v1.78.0. Issue: #681 User-Visible: no Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_018qZfe7YS4rqEMKoVeS3GKd
43 lines
3.1 KiB
JavaScript
43 lines
3.1 KiB
JavaScript
// #634/#681: docs/TESTING.md — единственная инструкция по тестированию (AC3 #634:
|
||
// ≤ 800 строк). Ручных чек-листов по поверхностям и приложений по issue нет
|
||
// (#681): то, чего автоматика не видит, — один раздел в самой инструкции.
|
||
// В docs/testing-notes/ живёт только реестр браузерных гвардов #659.
|
||
import assert from 'node:assert/strict';
|
||
import { existsSync, readFileSync, readdirSync } from 'node:fs';
|
||
import { dirname, join } from 'node:path';
|
||
import test from 'node:test';
|
||
import { fileURLToPath } from 'node:url';
|
||
import { headings, markdownLinks } from '../scripts/md-anchors.mjs';
|
||
|
||
const ROOT = fileURLToPath(new URL('..', import.meta.url));
|
||
const read = (rel) => readFileSync(join(ROOT, rel), 'utf8').replace(/\r\n?/g, '\n');
|
||
const MANUAL_HEADING = '## Чего не проверяет автоматика';
|
||
|
||
test('#681 TESTING.md: инструкция не длиннее 800 строк и сама называет, чего не проверяет автоматика', () => {
|
||
const testing = read('docs/TESTING.md');
|
||
const lines = testing.split('\n').length - (testing.endsWith('\n') ? 1 : 0);
|
||
assert.ok(lines <= 800, `docs/TESTING.md: ${lines} строк > 800 — приложения по issue сюда не пишутся (#681)`);
|
||
// Правила для новых тестов остаются в инструкции — их читают все.
|
||
assert.match(testing, /^## Правила для новых тестов \(issue #85\) — обязательны$/m);
|
||
const lineOf = (heading) => testing.split('\n').indexOf(heading);
|
||
assert.ok(lineOf(MANUAL_HEADING) > 0, `нет раздела «${MANUAL_HEADING.slice(3)}» — ручные пункты без дома`);
|
||
const own = new Set(headings(testing).map((heading) => heading.anchor));
|
||
for (const link of markdownLinks(testing)) {
|
||
if (!link.file) { assert.ok(own.has(link.anchor), `TESTING.md: нет заголовка #${link.anchor}`); continue; }
|
||
if (/^[a-z]+:/i.test(link.file)) continue;
|
||
const target = join(ROOT, 'docs', link.file);
|
||
assert.ok(existsSync(target), `TESTING.md ссылается на отсутствующий ${link.file}`);
|
||
if (link.anchor && target.endsWith('.md')) {
|
||
const anchors = new Set(headings(readFileSync(target, 'utf8')).map((heading) => heading.anchor));
|
||
assert.ok(anchors.has(link.anchor), `TESTING.md: нет заголовка ${link.file}#${link.anchor}`);
|
||
}
|
||
}
|
||
});
|
||
|
||
test('#681 docs/testing-notes: только реестр браузерных гвардов #659, чек-листы не возвращаются', () => {
|
||
const notes = join(ROOT, 'docs/testing-notes');
|
||
assert.deepEqual(readdirSync(notes).sort(), ['mutation-browser-guards.md'],
|
||
'docs/testing-notes/ снова копит чек-листы: ручной пункт — в «Чего не проверяет автоматика», поведение — в тест');
|
||
assert.ok(existsSync(join(dirname(notes), 'TESTING.md')));
|
||
});
|