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