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");
});
});
});