import React, { useMemo } from "react"; import { render, screen } from "@testing-library/react"; import userEvent from "@testing-library/user-event"; import { createMemoryHistory } from "@nano-router/history"; import "@testing-library/jest-dom"; import { Routes, Route, RouterProvider, useRouteName, useRouter, useParams, useLink, } from "./index.js"; import { Router } from "@nano-router/router"; const routes = new Routes( new Route("posts/new", "/posts/new"), new Route("posts/edit", "/posts/:id"), new Route("posts", "/posts"), ); const RouteName = () => { const routeName = useRouteName(); return
{routeName}
; }; const NewView = () => { const router = useRouter(); const createPost = () => { router.navigate({ route: "posts/edit", params: { id: 42 } }); }; return (
); }; const EditView = () => { const { id } = useParams(); return
Id {id}
; }; const PostsView = () => { const showNewPost = useLink("posts/new"); return ( New post ); }; const RootView = () => { const routeName = useRouteName(); switch (routeName) { case "posts/new": return ; case "posts/edit": return ; default: return ; } }; const App = () => { const history = useMemo( () => createMemoryHistory({ initialEntries: ["/posts"] }), [], ); const router = useMemo(() => new Router({ routes, history }), [history]); return (
); }; describe("RouterProvider", () => { beforeEach(() => { render(); }); it("provides the router context", () => { expect(screen.getByTestId("route-name")).toHaveTextContent("posts"); }); describe("when navigating", () => { beforeEach(async () => { await userEvent.click(screen.getByTestId("new")); await userEvent.click(screen.getByTestId("create")); }); it("re-renders the subscribed parts", () => { expect(screen.getByTestId("edit-view")).toHaveTextContent("Id 42"); }); }); });