/** @vitest-environment jsdom */ import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest'; import { render, screen, cleanup, fireEvent } from '@testing-library/react'; import { DemoResultView } from './DemoResultView'; import { en } from '../i18n/en'; import { it as italian } from '../i18n/it'; const sharePanel = vi.hoisted(() => vi.fn()); vi.mock('../components/SharePanel', () => ({ SharePanel: (props: unknown) => { sharePanel(props); return
Share your look
; }, })); const RESULT = 'data:image/png;base64,RESULT'; const PHOTO = 'data:image/png;base64,SHOPPER'; const GARMENT = 'data:image/png;base64,GARMENT'; type Props = React.ComponentProps; function renderResult(overrides: Partial = {}) { const props: Props = { resultImage: RESULT, originalPhotoImage: PHOTO, originalClothingImage: GARMENT, productTitle: 'Amalfi Linen Dress', productUrl: 'https://shop.test/product/amalfi-linen-dress', productId: '42', variantId: '7', onShareIntent: vi.fn(), onTryAnother: vi.fn(), onClose: vi.fn(), t: en.result, ...overrides, }; return { props, ...render() }; } beforeEach(() => vi.clearAllMocks()); afterEach(() => { cleanup(); }); describe('shared result comparison in the demo', () => { it.each([en, italian])('opens the localized shopper Before/After slider', (t) => { renderResult({ t: t.result }); expect(screen.getByRole('slider', { name: t.result.beforeAfterSlider }).getAttribute('value')).toBe('50'); expect(screen.getByRole('img', { name: t.result.beforePhoto }).getAttribute('src')).toBe(PHOTO); expect(screen.getByRole('img', { name: t.result.afterTryOn }).getAttribute('src')).toBe(RESULT); }); it('compares the inference garment and result, then restores the shopper split', () => { renderResult(); fireEvent.change(screen.getByRole('slider'), { target: { value: '73' } }); fireEvent.click(screen.getByRole('button', { name: en.result.toggleCompare })); expect(screen.queryByRole('slider')).toBeNull(); expect(screen.getByRole('img', { name: en.result.compareOriginal }).getAttribute('src')).toBe(GARMENT); expect(screen.getByRole('img', { name: en.result.compareTryOn }).getAttribute('src')).toBe(RESULT); fireEvent.click(screen.getByRole('button', { name: en.result.toggleResult })); expect(screen.getByRole('slider').getAttribute('value')).toBe('73'); }); it('shows the result alone without a shopper photo, retaining garment comparison', () => { renderResult({ originalPhotoImage: undefined }); expect(screen.queryByRole('slider')).toBeNull(); expect(screen.getByRole('img', { name: en.result.toggleResult }).getAttribute('src')).toBe(RESULT); fireEvent.click(screen.getByRole('button', { name: en.result.toggleCompare })); expect(screen.getByRole('img', { name: en.result.compareOriginal }).getAttribute('src')).toBe(GARMENT); }); it('keeps the shopper slider available without a garment', () => { renderResult({ originalClothingImage: undefined }); expect(screen.queryByRole('button', { name: en.result.toggleCompare })).toBeNull(); expect(screen.getByRole('slider')).toBeTruthy(); }); }); describe('sharing the result', () => { it('always includes the branded Share your look panel', () => { renderResult(); expect(screen.getByRole('region', { name: 'Share your look' })).toBeDefined(); }); }); describe('the way onward', () => { it('offers a different photo and a way back to the store', () => { const { props } = renderResult(); fireEvent.click(screen.getByText(en.result.tryDifferent)); expect(props.onTryAnother).toHaveBeenCalledTimes(1); fireEvent.click(screen.getByText(en.result.continueShopping)); expect(props.onClose).toHaveBeenCalledTimes(1); }); it('names what was tried on', () => { renderResult(); expect(screen.getByText(en.result.tryingOn('Amalfi Linen Dress'))).toBeTruthy(); }); }); it('passes the decoded brand and product image to the shared card', () => { renderResult({ brandName: "Tom & Jerry's", productImage: GARMENT }); expect(sharePanel).toHaveBeenCalledWith(expect.objectContaining({ brandName: "Tom & Jerry's", productImage: GARMENT, productName: 'Amalfi Linen Dress' })); });