|
|
@@ -0,0 +1,73 @@
|
|
|
+/* @vitest-environment node */
|
|
|
+
|
|
|
+import { describe, it, expect } from "vitest";
|
|
|
+import {
|
|
|
+ readRouteBranchFromPathname,
|
|
|
+ isSearchRoutePathname,
|
|
|
+ replaceBranchInPathnameOrFallback,
|
|
|
+ buildNextSearchQueryString,
|
|
|
+ buildNextUrlForBranchSwitch,
|
|
|
+} from "./branchSwitch.js";
|
|
|
+
|
|
|
+describe("lib/frontend/quickNav/branchSwitch", () => {
|
|
|
+ it("readRouteBranchFromPathname returns the first segment when valid", () => {
|
|
|
+ expect(readRouteBranchFromPathname("/NL01")).toBe("NL01");
|
|
|
+ expect(readRouteBranchFromPathname("/NL01/2025/12/31")).toBe("NL01");
|
|
|
+ expect(readRouteBranchFromPathname("/search")).toBe(null);
|
|
|
+ expect(readRouteBranchFromPathname("/nl01")).toBe(null);
|
|
|
+ });
|
|
|
+
|
|
|
+ it("isSearchRoutePathname detects /:branch/search", () => {
|
|
|
+ expect(isSearchRoutePathname("/NL01/search")).toBe(true);
|
|
|
+ expect(isSearchRoutePathname("/NL01/search/extra")).toBe(true);
|
|
|
+ expect(isSearchRoutePathname("/NL01")).toBe(false);
|
|
|
+ expect(isSearchRoutePathname("/search")).toBe(false);
|
|
|
+ });
|
|
|
+
|
|
|
+ it("replaceBranchInPathnameOrFallback replaces only the first segment", () => {
|
|
|
+ expect(replaceBranchInPathnameOrFallback("/NL01/2025/12/31", "NL20")).toBe(
|
|
|
+ "/NL20/2025/12/31"
|
|
|
+ );
|
|
|
+
|
|
|
+ // No valid branch -> fallback to branch root
|
|
|
+ expect(replaceBranchInPathnameOrFallback("/search", "NL20")).toBe("/NL20");
|
|
|
+ });
|
|
|
+
|
|
|
+ it("buildNextSearchQueryString drops legacy SINGLE branch= and keeps other params", () => {
|
|
|
+ const qs = buildNextSearchQueryString({
|
|
|
+ currentSearch: "?q=x&branch=NL01&limit=200",
|
|
|
+ currentRouteBranch: "NL01",
|
|
|
+ nextBranch: "NL20",
|
|
|
+ });
|
|
|
+
|
|
|
+ expect(qs).toBe("?q=x&limit=200");
|
|
|
+ });
|
|
|
+
|
|
|
+ it("buildNextSearchQueryString keeps MULTI branches (sorted deterministically)", () => {
|
|
|
+ const qs = buildNextSearchQueryString({
|
|
|
+ currentSearch: "?q=x&scope=multi&branches=NL20,NL06",
|
|
|
+ currentRouteBranch: "NL01",
|
|
|
+ nextBranch: "NL02",
|
|
|
+ });
|
|
|
+
|
|
|
+ expect(qs).toBe("?q=x&scope=multi&branches=NL06%2CNL20");
|
|
|
+ });
|
|
|
+
|
|
|
+ it("buildNextUrlForBranchSwitch preserves deep path and normalizes Search URLs", () => {
|
|
|
+ expect(
|
|
|
+ buildNextUrlForBranchSwitch({
|
|
|
+ pathname: "/NL01/2025/12/31",
|
|
|
+ search: "",
|
|
|
+ nextBranch: "NL20",
|
|
|
+ })
|
|
|
+ ).toBe("/NL20/2025/12/31");
|
|
|
+
|
|
|
+ expect(
|
|
|
+ buildNextUrlForBranchSwitch({
|
|
|
+ pathname: "/NL01/search",
|
|
|
+ search: "?q=x&branch=NL01&limit=200",
|
|
|
+ nextBranch: "NL20",
|
|
|
+ })
|
|
|
+ ).toBe("/NL20/search?q=x&limit=200");
|
|
|
+ });
|
|
|
+});
|