import React, { type ReactNode } from "react"; import { Route, Routes } from "react-router-dom"; import { DocumentTitleHandler } from "./document-title-handler"; import { render, TestWrapper, type ITestWrapperProps } from "./test/index"; import { mockRouterBindings } from "./test/dataMocks"; const renderDocumentTitleHandler = ( children: ReactNode, wrapperProps: ITestWrapperProps = {}, ) => { return render( <> Dummy resource page} /> Dummy resource action page} /> Refine} /> {children} , { wrapper: TestWrapper(wrapperProps), }, ); }; describe("", () => { it("should render default list title", async () => { renderDocumentTitleHandler(, { resources: [{ name: "posts", list: "/posts" }], routerInitialEntries: ["/posts"], routerProvider: mockRouterBindings({ action: "list", resource: { name: "posts", list: "/posts" }, }), }); expect(document.title).toBe("Posts | Refine"); }); it("should render default create title", async () => { renderDocumentTitleHandler(, { resources: [{ name: "posts", create: "/posts/create" }], routerInitialEntries: ["/posts/create"], routerProvider: mockRouterBindings({ action: "create", resource: { name: "posts", create: "/posts/create" }, }), }); expect(document.title).toBe("Create new Post | Refine"); }); it("should render default edit title", async () => { renderDocumentTitleHandler(, { resources: [{ name: "posts", edit: "/posts/edit/:id" }], routerInitialEntries: ["/posts/edit/1"], routerProvider: mockRouterBindings({ action: "edit", resource: { name: "posts", edit: "/posts/edit/1" }, id: "1", }), }); expect(document.title).toBe("#1 Edit Post | Refine"); }); it("should render default show title", async () => { renderDocumentTitleHandler(, { resources: [{ name: "posts", show: "/posts/show/:id" }], routerInitialEntries: ["/posts/show/1"], routerProvider: mockRouterBindings({ action: "show", resource: { name: "posts", show: "/posts/show/1" }, id: "1", }), }); expect(document.title).toBe("#1 Show Post | Refine"); }); it("should render default clone title", async () => { renderDocumentTitleHandler(, { resources: [{ name: "posts", clone: "/posts/clone/:id" }], routerInitialEntries: ["/posts/clone/1"], routerProvider: mockRouterBindings({ action: "clone", resource: { name: "posts", clone: "/posts/clone/1" }, id: "1", }), }); expect(document.title).toBe("#1 Clone Post | Refine"); }); it("should render default title for unknown resource", async () => { renderDocumentTitleHandler(, { resources: [{ name: "posts" }], routerInitialEntries: ["/unknown"], routerProvider: mockRouterBindings({ action: "list", resource: undefined, }), }); expect(document.title).toBe("Refine"); }); it("should render default title for unknown action", async () => { renderDocumentTitleHandler(, { resources: [{ name: "posts" }], routerInitialEntries: ["/posts/unknown"], routerProvider: mockRouterBindings({ action: undefined, resource: { name: "posts", }, }), }); expect(document.title).toBe("Refine"); }); it("should use identifier", async () => { renderDocumentTitleHandler(, { resources: [ { name: "posts", list: "/posts", identifier: "Awesome Posts" }, ], routerInitialEntries: ["/posts"], routerProvider: mockRouterBindings({ action: "list", resource: { name: "posts", list: "/posts", identifier: "Awesome Posts", }, }), }); expect(document.title).toBe("Awesome posts | Refine"); }); it("should render custom title", async () => { renderDocumentTitleHandler( { return "Custom Title"; }} />, { resources: [{ name: "posts", list: "/posts" }], routerInitialEntries: ["/posts"], routerProvider: mockRouterBindings({ action: "list", resource: { name: "posts", list: "/posts" }, }), }, ); expect(document.title).toBe("Custom Title"); }); it("should label be populated with friendly resource name on handler function", async () => { renderDocumentTitleHandler( { const label = resource?.label; const labelMeta = resource?.meta?.label; expect(labelMeta).toBe(label); expect(labelMeta).toBe("Posts"); return autoGeneratedTitle; }} />, { resources: [{ name: "posts", list: "/posts" }], routerInitialEntries: ["/posts"], routerProvider: mockRouterBindings({ action: "list", resource: { name: "posts", list: "/posts" }, }), }, ); }); it("should use label from resource if its provided", async () => { renderDocumentTitleHandler(, { resources: [{ name: "posts", list: "/posts", label: "Labeled Posts" }], routerInitialEntries: ["/posts"], routerProvider: mockRouterBindings({ action: "list", resource: { name: "posts", list: "/posts", label: "Labeled Posts" }, }), }); expect(document.title).toBe("Labeled Posts | Refine"); }); });