// @vitest-environment jsdom
import 'fake-indexeddb/auto';
import type { ReactNode } from 'react';
import { afterEach, beforeEach, expect, it, vi } from 'vitest';
import { cleanup, fireEvent, render, waitFor, screen } from '@testing-library/react';
import { App } from './App';
import { setConsent } from './storage';
import { clearTryOns } from './demo/tryOnStore';
const { sharePanel, tryOnSync, fetchImageAsBase64 } = vi.hoisted(() => ({
sharePanel: vi.fn(),
tryOnSync: vi.fn(),
fetchImageAsBase64: vi.fn(),
}));
vi.mock('./api', () => ({
VirtualTryOnAPI: vi.fn(() => ({ tryOnSync })),
QuotaExhaustedError: class extends Error {},
VisitorRateLimitedError: class extends Error {},
}));
vi.mock('./imageUtils', () => ({
fetchImageAsBase64,
compressGarmentImage: async (image: string) => image,
UndecodableImageError: class extends Error {},
}));
vi.mock('./components/Modal', () => ({
Modal: ({ isOpen, children }: { isOpen: boolean; children: ReactNode }) => isOpen ?
{children}
: null,
}));
vi.mock('./components/SharePanel', () => ({
SharePanel: (props: unknown) => { sharePanel(props); return null; },
}));
beforeEach(async () => {
await clearTryOns();
localStorage.clear();
vi.clearAllMocks();
tryOnSync.mockResolvedValue({ image: 'RESULT', cached: false });
fetchImageAsBase64.mockResolvedValue('data:image/png;base64,SELECTED_GARMENT');
vi.stubGlobal('fetch', vi.fn().mockResolvedValue({ ok: true }));
});
afterEach(() => {
cleanup();
document.body.innerHTML = '';
vi.unstubAllGlobals();
});
it.each([false, true])('uses the generated look garment for the share thumbnail (demo=%s)', async demo => {
localStorage.setItem('aisthetix-avatar', JSON.stringify({ imageData: 'data:image/png;base64,AVATAR', createdAt: new Date().toISOString() }));
setConsent();
const trigger = document.createElement('button');
trigger.id = 'aisthetix-tryon-trigger';
document.body.appendChild(trigger);
render();
fireEvent(document, new CustomEvent('aisthetix:variation-changed', {
detail: { variationId: '7', productImage: 'https://shop.test/selected.png' },
}));
fireEvent.click(trigger);
fireEvent.click(screen.getByRole('button', {name: 'Use This Photo'}));
await waitFor(() => expect(sharePanel).toHaveBeenCalled());
expect(fetchImageAsBase64).toHaveBeenCalledWith('https://shop.test/selected.png');
expect(sharePanel).toHaveBeenLastCalledWith(expect.objectContaining({
productImage: 'data:image/png;base64,SELECTED_GARMENT', variantId: '7',
}));
});