/** @vitest-environment jsdom */ import { afterEach, describe, expect, it } from 'vitest'; import { cleanup, fireEvent, render, screen } from '@testing-library/react'; import { ResultComparison } from './ResultComparison'; import { resultComparisonEn, resultComparisonIt } from '../i18n/resultComparison'; const photo = 'data:image/png;base64,PHOTO'; const result = 'data:image/png;base64,RESULT'; const garment = 'data:image/png;base64,GARMENT'; afterEach(cleanup); describe.each([['EN', resultComparisonEn], ['IT', resultComparisonIt]] as const)('%s result comparison', (_locale, t) => { const props = { resultImage: result, originalPhotoImage: photo, originalClothingImage: garment, t }; it('labels the distinct private images and starts halfway with a native range', () => { const { container } = render(); expect(screen.getByRole('img', { name: t.beforePhoto }).getAttribute('src')).toBe(photo); expect(screen.getByRole('img', { name: t.afterTryOn }).getAttribute('src')).toBe(result); const slider = screen.getByRole('slider', { name: t.beforeAfterSlider }); expect(slider.getAttribute('type')).toBe('range'); expect(slider.getAttribute('min')).toBe('0'); expect(slider.getAttribute('max')).toBe('100'); expect(slider).toHaveProperty('value', '50'); expect(container.querySelectorAll('img.ph-no-capture')).toHaveLength(2); for (const label of [t.before, t.after]) expect(screen.getByText(label).getAttribute('aria-hidden')).toBe('true'); }); it('moves the split to both endpoints and preserves it through the garment toggle', () => { const { container } = render(); const slider = screen.getByRole('slider'); for (const value of ['0', '100', '73']) { fireEvent.change(slider, { target: { value } }); expect(container.querySelector('.aisthetix-before-after')?.style.getPropertyValue('--aisthetix-split')).toBe(`${value}%`); } fireEvent.click(screen.getByRole('button', { name: t.toggleCompare })); expect(screen.queryByRole('slider')).toBeNull(); expect(screen.getByRole('img', { name: t.compareOriginal }).getAttribute('src')).toBe(garment); expect(screen.getByRole('img', { name: t.compareTryOn }).getAttribute('src')).toBe(result); expect(screen.getByRole('button', { name: t.toggleCompare }).classList.contains('active')).toBe(true); fireEvent.click(screen.getByRole('button', { name: t.toggleResult })); expect(screen.getByRole('slider')).toHaveProperty('value', '73'); expect(screen.getByRole('button', { name: t.toggleResult }).classList.contains('active')).toBe(true); }); it('supports an initial garment comparison', () => { render(); expect(screen.queryByRole('slider')).toBeNull(); expect(screen.getByRole('img', { name: t.compareOriginal }).getAttribute('src')).toBe(garment); }); it('keeps garment comparison available without a shopper photo', () => { render(); expect(screen.queryByRole('slider')).toBeNull(); expect(screen.getByRole('img', { name: t.toggleResult }).getAttribute('src')).toBe(result); fireEvent.click(screen.getByRole('button', { name: t.toggleCompare })); expect(screen.getByRole('img', { name: t.compareOriginal }).getAttribute('src')).toBe(garment); }); it.each([photo, undefined])('falls back from compare without a garment, shopper photo=%s', originalPhotoImage => { render(); expect(screen.queryByRole('button')).toBeNull(); expect(Boolean(screen.queryByRole('slider'))).toBe(Boolean(originalPhotoImage)); expect(screen.getByRole('img', { name: originalPhotoImage ? t.afterTryOn : t.toggleResult }).getAttribute('src')).toBe(result); }); it('falls back if the garment disappears while comparing', () => { const { rerender } = render(); rerender(); expect(screen.queryByRole('button')).toBeNull(); expect(screen.getByRole('slider')).toHaveProperty('value', '50'); }); });