refactor(router): introduce app navigation manager

This commit is contained in:
2026-07-03 14:09:13 +08:00
parent 8a586e4471
commit 91dde42f92
23 changed files with 669 additions and 277 deletions
+32
View File
@@ -0,0 +1,32 @@
import { describe, expect, it } from "vitest";
import { getRouteAccess, isInternalRoute } from "../route-meta";
import { ROUTES } from "../routes";
describe("route meta", () => {
it("classifies static routes by access level", () => {
expect(getRouteAccess(ROUTES.splash)).toBe("authOnly");
expect(getRouteAccess(ROUTES.auth)).toBe("authOnly");
expect(getRouteAccess(ROUTES.chat)).toBe("session");
expect(getRouteAccess(ROUTES.sidebar)).toBe("session");
expect(getRouteAccess(ROUTES.subscription)).toBe("realUser");
expect(getRouteAccess(ROUTES.coinsRules)).toBe("public");
});
it("classifies known dynamic chat routes", () => {
expect(getRouteAccess("/chat/image/msg_1")).toBe("session");
expect(getRouteAccess("/chat/deviceid/device_1")).toBe("public");
});
it("treats unknown routes as public by default", () => {
expect(getRouteAccess("/unknown")).toBe("public");
});
it("accepts only internal redirect targets", () => {
expect(isInternalRoute("/chat")).toBe(true);
expect(isInternalRoute("/subscription?type=vip")).toBe(true);
expect(isInternalRoute("https://example.com/chat")).toBe(false);
expect(isInternalRoute("//example.com/chat")).toBe(false);
expect(isInternalRoute(null)).toBe(false);
});
});