Skip to content

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

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

fey merged 1 commit into
content-396-npmfrom
content-396-smoke

Conversation

@fey

@fey fey commented Sep 4, 2026

Copy link
Copy Markdown
Contributor

Тикет: CONTENT-396. Наложен на PR #19, потому что зависимость ставится в package-lock.json, который появляется там.

Зачем

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

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

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

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

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

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

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

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

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

Мелочи

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

У заготовки не было проверок вовсе: 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 commented Sep 4, 2026

Copy link
Copy Markdown
Contributor Author

Сложено в #19: Node CI подписан на pull_request в main, поэтому на наложенном PR сборка и тесты не прогонялись.

@fey
fey merged commit 061dc5d into content-396-npm Sep 4, 2026
1 check passed
@fey
fey deleted the content-396-smoke branch September 4, 2026 15:51
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