diff --git a/app/components/ui/dark-mode-coverage.test.tsx b/app/components/ui/dark-mode-coverage.test.tsx new file mode 100644 index 0000000..a481f4b --- /dev/null +++ b/app/components/ui/dark-mode-coverage.test.tsx @@ -0,0 +1,790 @@ +import * as React from 'react' +import { render } from '@testing-library/react' +import { buildThemeTest } from '@/lib/test-utils' +import { useIsMobile } from '@/hooks/use-mobile' + +// --------------------------------------------------------------------------- +// Mocks +// --------------------------------------------------------------------------- + +const mockTheme = { current: 'light' as string } + +jest.mock('next-themes', () => ({ + ThemeProvider: ({ children }: { children: React.ReactNode }) => <>{children}, + useTheme: () => ({ theme: mockTheme.current, setTheme: jest.fn() }), +})) + +const mockEmblaApi = { + scrollPrev: jest.fn(), + scrollNext: jest.fn(), + canScrollPrev: jest.fn(() => false), + canScrollNext: jest.fn(() => false), + on: jest.fn(), + off: jest.fn(), +} + +jest.mock('embla-carousel-react', () => ({ + __esModule: true, + default: () => [jest.fn(), mockEmblaApi], +})) + +beforeEach(() => { + mockTheme.current = 'light' + ;(useIsMobile as jest.Mock).mockReturnValue(false) +}) + +// --------------------------------------------------------------------------- +// Simple / Atomic Components +// --------------------------------------------------------------------------- + +buildThemeTest('Badge', () => Default) +buildThemeTest('Badge (secondary)', () => Secondary) +buildThemeTest('Badge (destructive)', () => Destructive) +buildThemeTest('Badge (outline)', () => Outline) +buildThemeTest('Button', () => ) +buildThemeTest('Button (destructive)', () => ) +buildThemeTest('Button (outline)', () => ) +buildThemeTest('Button (secondary)', () => ) +buildThemeTest('Button (ghost)', () => ) +buildThemeTest('Button (link)', () => ) +buildThemeTest('Input', () => ) +buildThemeTest('Textarea', () =>