74 lines
2.9 KiB
TypeScript
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);
|
|
});
|
|
});
|