// @vitest-environment jsdom import { render, screen } from '@testing-library/react' import { afterEach, beforeEach, expect, test, vi } from 'vitest' /** * Stub the Tauri boundary and nothing above it. * * Everything the provider mounts — SWR queries, the config hooks, the event subscription, * the mihomo plugin — goes through `invoke` or `listen`, so replacing just those two leaves * all the real application code running. A test that stubbed the hooks instead could not * catch what this one exists to catch. */ vi.mock('@tauri-apps/api/core', () => ({ invoke: vi.fn(async () => undefined), Channel: class {}, })) vi.mock('@tauri-apps/api/event', () => ({ listen: vi.fn(async () => () => {}), TauriEvent: {}, })) import { AppDataProvider } from './app-data-provider' beforeEach(() => { // The provider's queries poll; keep them from firing during the assertion. vi.useFakeTimers({ shouldAdvanceTime: true }) }) afterEach(() => { vi.useRealTimers() }) /** * Mounting the provider is the whole test. * * A hook inside `AppDataProvider` that reads a context `AppDataProvider` itself supplies * throws during render and blanks the entire UI. That shipped once. `typecheck`, `lint`, * `knip` and `web:build` all passed with it present, and so did an independent review — * nothing but rendering can see it. */ test('AppDataProvider mounts and renders its children', () => { render( child rendered , ) expect(screen.getByText('child rendered')).toBeDefined() }) test('AppDataProvider does not consume a context it provides', () => { // The failure mode is specific enough to name: `useCtx` throws // " must be used within AppDataProvider" when a provider reads its own context, // which is indistinguishable at the type level from a legitimate call site. const errors: unknown[] = [] const consoleError = vi .spyOn(console, 'error') .mockImplementation((...args) => { errors.push(args) }) expect(() => render( child rendered , ), ).not.toThrow() const reported = errors.flat().join(' ') expect(reported).not.toContain('must be used within AppDataProvider') consoleError.mockRestore() })