/** * Jest Test Setup * Configure testing environment for YT2AI Bookmarklet */ // Mock performance API with proper Jest mocks const performanceMocks = { now: jest.fn(() => Date.now()), mark: jest.fn(), measure: jest.fn() }; global.performance = performanceMocks; // Ensure window.performance is available window.performance = global.performance; beforeEach(() => { // Reset DOM document.head.innerHTML = ''; document.body.innerHTML = ''; document.body.style.overflow = ''; // Reset window properties delete window.__YT2AI_INITIALIZED__; delete window.__YT2AI_VERSION__; delete window.__YT2AI__; // Reset performance mocks performanceMocks.mark.mockClear(); performanceMocks.measure.mockClear(); performanceMocks.now.mockClear(); // Clear module cache to allow fresh requires jest.resetModules(); }); afterEach(() => { // Clear timers jest.clearAllTimers(); // Clear mocks jest.clearAllMocks(); }); // Global test utilities global.mockYouTubeUrl = (videoId = 'dQw4w9WgXcQ') => { Object.defineProperty(window, 'location', { value: { href: `https://www.youtube.com/watch?v=${videoId}`, hostname: 'youtube.com', search: '' }, writable: true }); }; global.mockMobileEnvironment = () => { Object.defineProperty(navigator, 'userAgent', { writable: true, value: 'Mozilla/5.0 (Linux; Android 10; SM-G975F) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.120 Mobile Safari/537.36' }); Object.defineProperty(window, 'innerWidth', { writable: true, value: 375 }); Object.defineProperty(window, 'innerHeight', { writable: true, value: 667 }); };