Skip to content

test(web): Playwright-смоук фронтенда + регрессионный XSS-тест #263

Description

@ArtVsMark

Источник: аудит 2026-07-10, находка A-6

Контекст

Backend покрыт (1000+ тестов), фронтенд (app.js, ~1121 строка, 41
использование innerHTML) не тестируется вообще. esc() централизован
(issue #214), но каждое из 41 мест гарантируется только ревью. В DOM попадает
управляемый решением текст (stdout/stderr).

Проблема

Нет автоматической защиты от регрессии XSS/вёрстки во фронтенд-слое; изменения
в app.js проходят только визуальным ревью.

Предлагаемое решение

  • Опциональная dev-группа e2e в [project.optional-dependencies]
    (playwright>=1.40) — согласовать с запретом CLAUDE.md на новые
    зависимости: это dev-extra, в runtime не попадает; зафиксировать решение
    в тексте PR.
  • 4 journey: (1) режим 2 — грейдинг папки, таблица и detail-вкладка;
    (2) режим 1 — пикер файла, редактирование, сохранение, запуск;
    (3) глоссарий — поиск и карточка; (4) command palette открывается и
    исполняет команду.
  • XSS-регрессия: решение с print('``<img src=x onerror=window.__xss=1>``')
    после рендера window.__xss === undefined и в detail-вкладке текст, не
    элемент img.
  • CI: отдельный job (Linux only), не в общую матрицу, допустимо
    continue-on-error: false, кэш браузера. Внимание: правка workflow —
    только в рамках этого issue как явной задачи (снимает запрет CLAUDE.md).

Acceptance criteria

  • 4 journey + XSS-тест зелёные локально и в CI.
  • README/CONTRIBUTING: как запускать e2e (pip install -e ".[e2e]",
    playwright install chromium, команда запуска).

Затронутые файлы

pyproject.toml, .github/workflows/ci.yml (явно в рамках этого issue),
новая директория tests/e2e/, README.md, CONTRIBUTING.md.

Тесты

Сами 4 journey + XSS-регрессия — это и есть предмет issue.

Документация

README/CONTRIBUTING — инструкция по запуску e2e.

Зависимости

Независим; после #262 (A-5) добавить journey для runs (отдельным PR).

Metadata

Metadata

Assignees

No one assigned

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions