/**
* Component: Preferences Context Tests
* Documentation: documentation/frontend/components.md
*/
// @vitest-environment jsdom
import React from 'react';
import { act, fireEvent, render, screen, waitFor } from '@testing-library/react';
import { beforeEach, describe, expect, it } from 'vitest';
import { PreferencesProvider, usePreferences } from '@/contexts/PreferencesContext';
const TestConsumer = () => {
const { cardSize, setCardSize } = usePreferences();
return (
{cardSize}
);
};
describe('PreferencesContext', () => {
beforeEach(() => {
localStorage.clear();
});
it('loads card size from localStorage when valid', async () => {
localStorage.setItem('preferences', JSON.stringify({ cardSize: 7 }));
render(
);
await waitFor(() => {
expect(screen.getByTestId('size')).toHaveTextContent('7');
});
});
it('clamps card size updates and persists them', async () => {
render(
);
fireEvent.click(screen.getByRole('button', { name: 'Set Large' }));
await waitFor(() => {
expect(screen.getByTestId('size')).toHaveTextContent('9');
});
const stored = JSON.parse(localStorage.getItem('preferences') || '{}');
expect(stored.cardSize).toBe(9);
});
it('updates card size when a storage event is received', async () => {
render(
);
await act(async () => {
window.dispatchEvent(
new StorageEvent('storage', {
key: 'preferences',
newValue: JSON.stringify({ cardSize: 3 }),
})
);
});
expect(screen.getByTestId('size')).toHaveTextContent('3');
});
});