storybook-theme.test.tsx 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. import { render } from '@testing-library/react';
  2. import { afterEach, expect, test } from 'vitest';
  3. import { withTheme } from '../../.storybook/preview';
  4. import { ThemeProvider } from '@/hooks/useTheme';
  5. function Story() {
  6. return <div>Story</div>;
  7. }
  8. function StorybookTheme({ theme }: { theme: 'light' | 'dark' }) {
  9. return withTheme(Story, { globals: { theme } } as Partial<Parameters<typeof withTheme>[1]> as Parameters<typeof withTheme>[1]);
  10. }
  11. afterEach(() => {
  12. document.body.className = '';
  13. document.documentElement.removeAttribute('data-theme');
  14. });
  15. test('preserves unrelated body classes when applying the Storybook theme', () => {
  16. document.body.className = 'storybook-fixture dark';
  17. document.documentElement.setAttribute('data-theme', 'ultra-dark');
  18. const { rerender } = render(<StorybookTheme theme="light" />);
  19. expect(document.body.classList.contains('storybook-fixture')).toBe(true);
  20. expect(document.body.classList.contains('light')).toBe(true);
  21. expect(document.body.classList.contains('dark')).toBe(false);
  22. expect(document.documentElement.hasAttribute('data-theme')).toBe(false);
  23. rerender(<StorybookTheme theme="dark" />);
  24. expect(document.body.classList.contains('storybook-fixture')).toBe(true);
  25. expect(document.body.classList.contains('dark')).toBe(true);
  26. expect(document.body.classList.contains('light')).toBe(false);
  27. });
  28. test('preserves unrelated body classes when applying the panel theme', () => {
  29. document.body.className = 'panel-fixture';
  30. const message = document.createElement('div');
  31. message.id = 'message';
  32. message.className = 'message-fixture';
  33. document.body.append(message);
  34. render(<ThemeProvider><div>Panel</div></ThemeProvider>);
  35. expect(document.body.classList.contains('panel-fixture')).toBe(true);
  36. expect(document.body.classList.contains('dark')).toBe(true);
  37. expect(document.body.classList.contains('light')).toBe(false);
  38. expect(message.classList.contains('message-fixture')).toBe(true);
  39. expect(message.classList.contains('dark')).toBe(true);
  40. });