Files
houseplan-card/test/testing-doc.test.mjs
T
Claude 708ed850f3 docs(hygiene): снять чек-листы testing-notes и дизайн-материалы выпущенных задач (#681)
Волна 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
2026-09-27 21:27:57 +03:00

43 lines
3.1 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
// #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')));
});