Тесты: покрыть инъекцию trackerHead в ShareSeoController (+ no-op ветка аудита trackerHead) #100
Reference in New Issue
Block a user
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Контекст
Code review изменений по sandbox HTML-embed + админский tracker (диапазон
81823fce^..HEAD) выявил пробел в тестовом покрытии новой security-релевантной логики. Сам код корректен и проверен — это задача именно на регрессионные тесты, не на исправление поведения.1. Инъекция
trackerHeadвShareSeoControllerне покрыта тестами (основное)apps/server/src/core/share/share-seo.controller.ts— единственное место, где админский HTML/JS-сниппет вставляется дословно (без экранирования) в<head>публичной share-страницы. Ни один спек не ссылается наShareSeoController(grepпо*.spec.ts/*.e2e-spec.ts— пусто); единственный тест сtrackerHead(workspace-html-embed.spec.ts) покрывает только путь сохранения настройки, а не инъекции.Без тестов остаются 4 ветки:
trackerHeadзадан + в шаблоне есть</head>→ сниппет вставляется перед</head>.trackerHeadзадан, но</head>в index-HTML не найден →logger.warn+ пропуск (HTML без изменений).trackerHeadпустой / только пробелы / отсутствует → пропуск (typeof === 'string' && trim().length > 0).() => ...: именно функция-replacer защищает от того, что$&,$`,$',$$внутри сниппета будут истолкованыString.prototype.replaceкак шаблоны подстановки и исказят тег. Это самый тонкий инвариант — он молча сломается, если кто-то «упростит» replacer обратно в строковый аргумент.Предлагаемый тест
Добавить
apps/server/src/core/share/share-seo.controller.spec.ts:fs.readFileSyncминимальным index-HTML с</head>и маркером мета-тегов;shareService/workspaceRepo/environmentService;res.sendи проверить:</head>, когдаtrackerHeadзадан;$&/$$попадает в вывод дословно (этот кейс упадёт на строковом replacer'е — он и фиксирует инвариант);</head>вызываетсяlogger.warn, а HTML не меняется;undefinedtrackerHead.2. (Минор) No-op ветка аудита
trackerHeadвworkspace.service.tsapps/server/src/core/workspace/services/workspace.service.ts(~528-540): приprev === trackerHead(повторное сохранение того же значения)updateSettingвызывается, ноbefore/after.trackerHeadне должны по��адать в аудит. Покрыт только путь с изменением значения; no-op-ветка не проверена (та же форма у соседнегоhtmlEmbed). Влияние — только шум в аудите.Предлагаемый тест
Кейс с одинаковыми
settingsBeforeи входным значением: проверить, чтоupdateSettingвызван, а изменение поtrackerHeadв аудит-payload не попало.Источник: code-review-orchestrator, диапазон
81823fce^..HEAD.