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');
  });
});

