import { SelectThemeVariation } from '@agent/workflows/theme/components/SelectThemeVariation';
import { render, screen } from '@testing-library/react';
import userEvent from '@testing-library/user-event';
const mockUndoChange = jest.fn();
jest.mock('@agent/hooks/useVariationOverride', () => ({
useVariationOverride: () => ({ undoChange: mockUndoChange }),
}));
jest.mock('@agent/hooks/useThemeVariations', () => ({
useThemeVariations: () => ({
variations: [
{
title: 'Sunset',
css: '.sunset{}',
settings: {
color: {
palette: {
theme: [
{ slug: 'background', color: '#fff' },
{ slug: 'primary', color: '#f00' },
],
},
},
},
},
],
isLoading: false,
}),
}));
jest.mock('@agent/state/chat', () => ({
useChatStore: () => ({ addMessage: jest.fn(), messages: [] }),
}));
beforeEach(() => mockUndoChange.mockClear());
describe('SelectThemeVariation — undo on cancel/unmount', () => {
test('calls undoChange on unmount without confirming', () => {
const { unmount } = render(
,
);
unmount();
expect(mockUndoChange).toHaveBeenCalledTimes(1);
});
test('does not call undoChange after confirming', async () => {
const onConfirm = jest.fn();
const user = userEvent.setup();
const { unmount } = render(
,
);
// Select a variation first
const btn = screen
.getAllByRole('button')
.find((b) => !b.textContent.match(/cancel|save/i));
await user.click(btn);
await user.click(screen.getByRole('button', { name: /save/i }));
expect(onConfirm).toHaveBeenCalled();
unmount();
expect(mockUndoChange).not.toHaveBeenCalled();
});
});