import { render } from '@testing-library/react';
import { afterEach, expect, test } from 'vitest';
import { withTheme } from '../../.storybook/preview';
import { ThemeProvider } from '@/hooks/useTheme';
function Story() {
return
Story
;
}
function StorybookTheme({ theme }: { theme: 'light' | 'dark' }) {
return withTheme(Story, { globals: { theme } } as Partial[1]> as Parameters[1]);
}
afterEach(() => {
document.body.className = '';
document.documentElement.removeAttribute('data-theme');
});
test('preserves unrelated body classes when applying the Storybook theme', () => {
document.body.className = 'storybook-fixture dark';
document.documentElement.setAttribute('data-theme', 'ultra-dark');
const { rerender } = render();
expect(document.body.classList.contains('storybook-fixture')).toBe(true);
expect(document.body.classList.contains('light')).toBe(true);
expect(document.body.classList.contains('dark')).toBe(false);
expect(document.documentElement.hasAttribute('data-theme')).toBe(false);
rerender();
expect(document.body.classList.contains('storybook-fixture')).toBe(true);
expect(document.body.classList.contains('dark')).toBe(true);
expect(document.body.classList.contains('light')).toBe(false);
});
test('preserves unrelated body classes when applying the panel theme', () => {
document.body.className = 'panel-fixture';
const message = document.createElement('div');
message.id = 'message';
message.className = 'message-fixture';
document.body.append(message);
render(Panel
);
expect(document.body.classList.contains('panel-fixture')).toBe(true);
expect(document.body.classList.contains('dark')).toBe(true);
expect(document.body.classList.contains('light')).toBe(false);
expect(message.classList.contains('message-fixture')).toBe(true);
expect(message.classList.contains('dark')).toBe(true);
});