Files
cozsweet-frontend-nextjs/src/router/__tests__/route-meta.test.ts
T

74 lines
2.9 KiB
TypeScript

import { describe, expect, it } from "vitest";
import { getRouteAccess, isInternalRoute } from "../route-meta";
import { ALL_STATIC_ROUTES, getCharacterRoutes, ROUTES } from "../routes";
describe("route meta", () => {
it("classifies global routes by access level", () => {
expect(getRouteAccess(ROUTES.splash)).toBe("authOnly");
expect(getRouteAccess(ROUTES.auth)).toBe("authOnly");
expect(getRouteAccess(ROUTES.chat)).toBe("guestEntry");
expect(getRouteAccess(ROUTES.privateZone)).toBe("guestEntry");
expect(getRouteAccess(ROUTES.tip)).toBe("public");
expect(getRouteAccess(ROUTES.externalEntry)).toBe("public");
expect(getRouteAccess(ROUTES.profile)).toBe("realUser");
expect(getRouteAccess(ROUTES.feedback)).toBe("session");
expect(getRouteAccess(ROUTES.subscription)).toBe("realUser");
expect(getRouteAccess(ROUTES.coinsRules)).toBe("public");
});
it("does not keep the removed chat image route as a guarded route", () => {
expect(getRouteAccess("/chat/image/msg_1")).toBe("public");
});
it("classifies character-scoped routes by their page", () => {
const routes = getCharacterRoutes("maya");
expect(routes).toEqual({
splash: "/characters/maya/splash",
chat: "/characters/maya/chat",
call: "/characters/maya/call",
privateZone: "/characters/maya/private-zone",
tip: "/characters/maya/tip",
});
expect(getRouteAccess(routes.splash)).toBe("authOnly");
expect(getRouteAccess(routes.chat)).toBe("guestEntry");
expect(getRouteAccess(routes.call)).toBe("guestEntry");
expect(getRouteAccess(routes.privateZone)).toBe("guestEntry");
expect(getRouteAccess(routes.tip)).toBe("public");
});
it("does not classify removed character-scoped global pages", () => {
expect(getRouteAccess("/characters/maya/profile")).toBe("public");
expect(getRouteAccess("/characters/maya/feedback")).toBe("public");
expect(getRouteAccess("/characters/maya/coins-rules")).toBe("public");
});
it("includes private zone in static routes", () => {
expect(ALL_STATIC_ROUTES).toContain(ROUTES.privateZone);
});
it("includes tip in static routes", () => {
expect(ALL_STATIC_ROUTES).toContain(ROUTES.tip);
});
it("includes external entry in static routes", () => {
expect(ALL_STATIC_ROUTES).toContain(ROUTES.externalEntry);
});
it("includes feedback in static routes", () => {
expect(ALL_STATIC_ROUTES).toContain(ROUTES.feedback);
});
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);
});
});