import React, { useEffect } from "react"; import { render, screen, act } 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, Router, useRouter, useRouteName, useLink, } from "./index.js"; const routes = new Routes( new Route("posts/new", "/posts/new"), new Route("posts", "/posts"), ); const RouteName = () => { const routeName = useRouteName(); return
{routeName}
; }; const NewView = () =>
; const PostsView = () => { const showNewPost = useLink("posts/new"); return ( New post ); }; const RootView = () => { const router = useRouter(); const routeName = useRouteName(); useEffect(() => { if (routeName === "default") { router.navigate({ route: "posts", replace: true }); } }, [router, routeName]); switch (routeName) { case "posts/new": return ; case "posts": return ; } return null; // redirect }; const App = () => ( <> ); describe("useRouteName", () => { let history; beforeEach(() => { history = createMemoryHistory({ initialEntries: ["/posts"] }); render(
, ); }); it("returns the name of the current route", () => { expect(screen.getByTestId("route-name")).toHaveTextContent("posts"); }); describe("when navigating", () => { beforeEach(async () => { await userEvent.click(screen.getByTestId("new")); }); it("updates the route name", () => { expect(screen.getByTestId("route-name")).toHaveTextContent("posts/new"); expect(screen.getByTestId("new-view")).toBeInTheDocument(); }); }); describe("when navigating to a unknown page", () => { beforeEach(() => { act(() => { history.push("/nowhere", {}); }); }); it("uses the default route and the app redirects", () => { expect(screen.getByTestId("route-name")).toHaveTextContent("posts"); }); }); });