|
| 1 | +import { QueryClient, QueryClientProvider } from "@tanstack/react-query"; |
| 2 | +import { createMemoryHistory, createRouter, RouterProvider } from "@tanstack/react-router"; |
| 3 | +import { render, screen } from "@testing-library/react"; |
| 4 | +import { describe, expect, it } from "vitest"; |
| 5 | +import { DemoProvider } from "@/context/DemoContext"; |
| 6 | +import { useDemo } from "@/hooks/useDemo"; |
| 7 | +import { routeTree } from "@/routeTree.gen"; |
| 8 | + |
| 9 | +function renderAt(initialPath: string) { |
| 10 | + const router = createRouter({ |
| 11 | + routeTree, |
| 12 | + history: createMemoryHistory({ initialEntries: [initialPath] }), |
| 13 | + }); |
| 14 | + const qc = new QueryClient({ defaultOptions: { queries: { retry: false } } }); |
| 15 | + return render( |
| 16 | + <QueryClientProvider client={qc}> |
| 17 | + <DemoProvider> |
| 18 | + {/* biome-ignore lint/suspicious/noExplicitAny: test router type */} |
| 19 | + <RouterProvider router={router as any} /> |
| 20 | + </DemoProvider> |
| 21 | + </QueryClientProvider>, |
| 22 | + ); |
| 23 | +} |
| 24 | + |
| 25 | +describe("first load with no config", () => { |
| 26 | + it("renders the settings form on first paint when no config exists", async () => { |
| 27 | + localStorage.clear(); |
| 28 | + renderAt("/"); |
| 29 | + // Should be visible immediately — bug 1: RootLayout returns null while |
| 30 | + // a useEffect-driven navigate fires, leaving a blank screen. |
| 31 | + expect( |
| 32 | + await screen.findByText(/Connect to your self-hosted Honcho instance/i), |
| 33 | + ).toBeInTheDocument(); |
| 34 | + }); |
| 35 | +}); |
| 36 | + |
| 37 | +describe("Sidebar/useDemo availability across routes", () => { |
| 38 | + it("does not throw when a useDemo consumer mounts alongside the routed app", () => { |
| 39 | + function DemoConsumer() { |
| 40 | + const { demo } = useDemo(); |
| 41 | + return <span data-testid="demo-flag">{String(demo)}</span>; |
| 42 | + } |
| 43 | + // After the fix, DemoProvider wraps the app at the root (main.tsx / |
| 44 | + // __root.tsx) so consumers anywhere in the tree resolve. This test |
| 45 | + // renders a consumer as a sibling of the router under the same provider |
| 46 | + // the production wiring uses. |
| 47 | + localStorage.clear(); |
| 48 | + expect(() => { |
| 49 | + const router = createRouter({ |
| 50 | + routeTree, |
| 51 | + history: createMemoryHistory({ initialEntries: ["/settings"] }), |
| 52 | + }); |
| 53 | + const qc = new QueryClient({ |
| 54 | + defaultOptions: { queries: { retry: false } }, |
| 55 | + }); |
| 56 | + render( |
| 57 | + <QueryClientProvider client={qc}> |
| 58 | + <DemoProvider> |
| 59 | + {/* biome-ignore lint/suspicious/noExplicitAny: test router type */} |
| 60 | + <RouterProvider router={router as any} /> |
| 61 | + <DemoConsumer /> |
| 62 | + </DemoProvider> |
| 63 | + </QueryClientProvider>, |
| 64 | + ); |
| 65 | + }).not.toThrow(); |
| 66 | + expect(screen.getByTestId("demo-flag")).toBeInTheDocument(); |
| 67 | + }); |
| 68 | +}); |
0 commit comments