import { describe, it, expect } from 'vitest'; import { readFileSync } from 'node:fs'; import { resolve } from 'node:path'; /** * Админка и портал продаж не должны попадать в записи Вебвизора: там чужие * персональные данные — телефоны клиентов, сделки, карточки. * * Белого списка раскладок (metrikaScope) для этого НЕ ХВАТАЕТ. Он управляет * только отправкой заходов. Сама Метрика, единожды запустившись на странице * (например на общем /login, откуда входит администратор), продолжает писать * автономно при переходах внутри приложения — роутер её остановить не может. * * Поэтому на корне обеих раскладок обязан висеть ym-hide-content: запись * продолжится, но содержимое в ней будет размыто. * * Найдено 20.07.2026 при исполнении плана 2026-07-20-skvoznoy-put-do-vebvizora: * до включения Метрики на странице входа этой дыры не существовало, правка * создавала бы её сама. */ const RASKLADKI = ['AdminLayout.vue', 'SalesLayout.vue']; describe('раскладки с чужими ПДн закрыты от Вебвизора', () => { it.each(RASKLADKI)('%s несёт ym-hide-content на корневом v-app', (fayl) => { const put = resolve(__dirname, '../../resources/js/layouts', fayl); const ishodnik = readFileSync(put, 'utf-8'); // Именно на корне, а не где-то в файле: класс должен накрыть всё // поддерево раскладки, включая экраны, которые в неё подставляются. const koren = ishodnik.split('\n').find((s) => s.includes(' в ${fayl}`).toBeDefined(); expect(koren).toContain('ym-hide-content'); }); });