Files
interview-demo-code/frontend/spa/tests/unit/utils/AppMetaInitializer.test.ts

70 lines
2.2 KiB
TypeScript

import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest';
import AppMetaInitializer from '@/utils/AppMetaInitializer.ts';
describe('AppMetaInitializer', () => {
let initialHead: HTMLHeadElement;
let metaInitializer: AppMetaInitializer;
beforeEach(() => {
// Сохраняем исходный head
initialHead = document.head.cloneNode(true) as HTMLHeadElement;
// Очищаем head для тестов
document.head.innerHTML = '';
const settings = {
app_name: 'Test App',
};
metaInitializer = new AppMetaInitializer(settings);
});
afterEach(() => {
// Восстанавливаем исходный head
document.head.innerHTML = initialHead.innerHTML;
});
it('должен устанавливать title документа', () => {
metaInitializer.init();
expect(document.title).toBe('Test App');
});
it('должен создавать meta теги', () => {
metaInitializer.init();
const appNameMeta = document.querySelector('meta[name="application-name"]');
expect(appNameMeta).not.toBeNull();
expect(appNameMeta?.getAttribute('content')).toBe('Test App');
});
it('должен создавать apple-touch-icon теги', () => {
metaInitializer.init();
const appleIcons = document.querySelectorAll('link[rel="apple-touch-icon"]');
expect(appleIcons.length).toBeGreaterThan(0);
});
it('должен устанавливать theme-color', () => {
metaInitializer.init();
const themeColor = document.querySelector('meta[name="theme-color"]');
expect(themeColor?.getAttribute('content')).toBe('#000000');
});
it('должен обновлять существующие meta теги', () => {
// Создаем существующий meta тег
const existingMeta = document.createElement('meta');
existingMeta.setAttribute('name', 'application-name');
existingMeta.setAttribute('content', 'Old Name');
document.head.appendChild(existingMeta);
metaInitializer.init();
const metaTags = document.querySelectorAll('meta[name="application-name"]');
expect(metaTags.length).toBe(1);
expect(metaTags[0]?.getAttribute('content')).toBe('Test App');
});
});