0e502c4072
router.afterEach: при входе на layout=app лениво грузит Метрику и шлёт hit(fullPath). Вход/публичные/админка/портал продаж — без Метрики. + убраны лишние @ts-expect-error в тесте (type-check чист). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
48 lines
1.8 KiB
TypeScript
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');
|
|
});
|
|
});
|