Files
portal/app/tests/Frontend/metrika.spec.ts
T
Дмитрий 0e502c4072 feat(metrika): hit только для маршрутов кабинета (layout=app)
router.afterEach: при входе на layout=app лениво грузит Метрику и шлёт hit(fullPath).
Вход/публичные/админка/портал продаж — без Метрики. + убраны лишние @ts-expect-error
в тесте (type-check чист).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-08 04:38:45 +03:00

48 lines
1.8 KiB
TypeScript

import { describe, it, expect, beforeEach, vi } from 'vitest';
/**
* Тесты ленивого загрузчика Яндекс.Метрики (resources/js/plugins/metrika.ts).
* Загрузчик грузится только из роутера при входе в кабинет (см. router/index.ts).
*/
describe('metrika loader', () => {
beforeEach(() => {
document.head.innerHTML = '';
document.body.innerHTML = '';
delete window.ym;
vi.resetModules();
});
it('без meta-тега ничего не грузит и не падает', async () => {
const { ensureLoaded } = await import('../../resources/js/plugins/metrika');
ensureLoaded();
expect(document.querySelector('script[src*="mc.yandex.ru"]')).toBeNull();
});
it('с meta-тегом инжектит tag.js один раз (идемпотентно)', async () => {
const meta = document.createElement('meta');
meta.name = 'metrika-id';
meta.content = '99999999';
document.head.appendChild(meta);
const { ensureLoaded } = await import('../../resources/js/plugins/metrika');
ensureLoaded();
ensureLoaded();
const scripts = document.querySelectorAll('script[src*="mc.yandex.ru/metrika/tag.js"]');
expect(scripts.length).toBe(1);
});
it('hit() вызывает window.ym с id из meta и переданным url', async () => {
const meta = document.createElement('meta');
meta.name = 'metrika-id';
meta.content = '99999999';
document.head.appendChild(meta);
const ym = vi.fn();
window.ym = ym;
const { hit } = await import('../../resources/js/plugins/metrika');
hit('/dashboard');
expect(ym).toHaveBeenCalledWith(99999999, 'hit', '/dashboard');
});
});