lib/app-tab-route-redirect.test.ts
Rama main · réplica de lectura del repositorio original.
// @vitest-environment jsdom
import { act, createElement, useEffect } from "react";
import { createRoot } from "react-dom/client";
import { expect, it, vi } from "vitest";
import { AppTabRouteSync } from "@/components/app-tab-route-sync";
import { AppTabsSession } from "./app-tabs-session";
import { createHomeTab } from "./app-tabs";
const state = vi.hoisted(() => ({ path: "/projects/p/pages", navigation: null as unknown }));
vi.mock("next/navigation", () => ({ usePathname: () => state.path, useSearchParams: () => new URLSearchParams() }));
vi.mock("./app-tab-navigation-context", () => ({ useOptionalAppTabNavigation: () => state.navigation }));
vi.mock("./current-view-context", () => ({ useCurrentViewTaggedPublication: () => null }));
it("acknowledges a committed target before an immediate in-view redirect", async () => {
vi.stubGlobal("IS_REACT_ACT_ENVIRONMENT", true);
const board = { ...createHomeTab("owner"), href: "/all" };
const pages = { ...createHomeTab("owner", undefined, 1), href: "/projects/p/pages" };
const session = new AppTabsSession("owner", { create: vi.fn(), close: vi.fn(), move: vi.fn(), patch: async (tab, patch) => ({ ...tab, ...patch }) });
session.receive([board, pages]); await session.initialize("/all"); await session.activate(pages.id);
state.path = pages.href; state.navigation = { session, activeId: pages.id };
const element = document.createElement("div"), root = createRoot(element);
const render = () => root.render(createElement("div", null, createElement(AppTabRouteSync), createElement(Redirect)));
function Redirect() {
useEffect(() => { state.path = "/projects/p/pages/document"; render(); }, []);
return null;
}
try {
await act(() => render());
await act(() => new Promise((resolve) => setTimeout(resolve, 10)));
expect(session.getActiveHref()).toBe("/projects/p/pages/document");
expect(session.getSnapshot().activeId).toBe(pages.id);
expect(session.getSnapshot().error).toBeNull();
} finally { await act(() => root.unmount()); session.dispose(); vi.unstubAllGlobals(); }
});