Skip to content

test(smoke): CONTENT-396 проверять контракт точки входа заготовки - #23

Merged
fey merged 1 commit into
mainfrom
content-396-smoke-test
Sep 4, 2026
Merged

fey merged 1 commit into
mainfrom
content-396-smoke-test

Conversation

@fey

@fey fey commented Sep 4, 2026

Copy link
Copy Markdown
Contributor

Тикет: CONTENT-396. Этот коммит был в ветке #19, но в мерж не попал: пуш пришёл после squash. Здесь он один, от main.

Зачем

У заготовки не было проверок вовсе. CI гонял сборку, и комментарий в воркфлоу это признавал прямо. Сборка ловит поломанный импорт и отсутствующую зависимость, но не ловит главное — контракт, которым заготовка связана с проектом.

Проверка проекта входит в приложение через init: зовёт его со своим сокетом и рендерит то, что он вернул. Сломать это можно было незаметно, и ровно это и было — init сокета не принимал, socket.io-client висел в зависимостях без использования, а снаружи заготовка выглядела рабочей.

Что проверяет

Тест повторяет путь проверки проекта: зовёт init с поддельным сокетом и рендерит результат.

  • разметка отрендерилась и содержит заголовок чата;
  • init подписался на событие сокета, то есть параметр действительно используется.

Рендер идёт через renderToString, поэтому ни браузера, ни jsdom не нужно, а react-dom уже в зависимостях. Прогон занимает 2 секунды, в CI добавлен шаг make test.

Проверено мутациями

Тест не декорация, я его сломал в обе стороны:

Мутация Результат
init игнорирует сокет падает, expected "spy" to be called at least once
init возвращает null вместо разметки падает на expect(markup).toContain("Hexlet Chat")
откат обеих зелёный

Плюс прогон с чистого дерева на этой ветке: npm ci, make test, make build (936 модулей), make lint — всё зелёное.

Мелочь

vitest взят третьей мажорной: четвёртая требует vite 6 и выше, а здесь стоит vite 5. Бампает его тикет по устаревшим зависимостям, тогда же поедет и vitest.

У заготовки не было проверок вовсе: CI гонял сборку, а она ловит только
поломанный импорт и отсутствующую зависимость. Контракт, которым заготовка
связана с проектом, не проверял никто, и сломать его можно было незаметно —
именно это и произошло, когда init перестал принимать сокет.

Тест повторяет путь проверки проекта: зовёт init с поддельным сокетом и
рендерит то, что он вернул. Рендер идёт renderToString, поэтому ни браузера,
ни jsdom не нужно, а react-dom уже в зависимостях.

Проверен мутациями: если init игнорирует сокет, тест падает на неподписанном
слушателе; если возвращает null вместо разметки, падает на отсутствии
заголовка. После откатa обеих мутаций зелёный.

vitest взят третьей мажорной: четвёртая требует vite 6 и выше, а здесь стоит
vite 5. Бампает его тикет по устаревшим зависимостям, тогда же поедет и vitest.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@fey
fey merged commit adef1b9 into main Sep 4, 2026
2 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant