145 lines
4.0 KiB
TypeScript
145 lines
4.0 KiB
TypeScript
import { describe, expect, it } from "vitest";
|
|
import { HOUSEKEEPING_MANIFESTS } from "../../manifests";
|
|
import { contentMigrationEntries } from "../../migration/content";
|
|
import { HOUSEKEEPING_ROUTE_HANDLERS } from "../../route-handlers";
|
|
import { contentManifest } from "./manifest";
|
|
import {
|
|
CONTENT_ROUTE_GROUPS,
|
|
CONTENT_ROUTE_IDS,
|
|
CONTENT_ROUTES,
|
|
type ContentRouteId,
|
|
contentRouteGroup,
|
|
} from "./routes";
|
|
|
|
const expected = [
|
|
["content.editorial.articles", "/ase/content/editorial/articles", "editorial"],
|
|
[
|
|
"content.editorial.article-create",
|
|
"/ase/content/editorial/articles/new",
|
|
"editorial",
|
|
],
|
|
[
|
|
"content.editorial.article-detail",
|
|
"/ase/content/editorial/articles/:id",
|
|
"editorial",
|
|
],
|
|
["content.media.photos", "/ase/content/media/photos", "media"],
|
|
["content.media.library", "/ase/content/media/library", "media"],
|
|
["content.media.banners", "/ase/content/media/banners", "media"],
|
|
["content.media.ads", "/ase/content/media/ads", "media"],
|
|
["content.media.ad-create", "/ase/content/media/ads/new", "media"],
|
|
["content.media.ad-detail", "/ase/content/media/ads/:id", "media"],
|
|
["content.engagement.events", "/ase/content/engagement/events", "engagement"],
|
|
[
|
|
"content.engagement.event-create",
|
|
"/ase/content/engagement/events/create",
|
|
"engagement",
|
|
],
|
|
[
|
|
"content.engagement.event-types",
|
|
"/ase/content/engagement/events/types",
|
|
"engagement",
|
|
],
|
|
[
|
|
"content.engagement.event-detail",
|
|
"/ase/content/engagement/events/:id",
|
|
"engagement",
|
|
],
|
|
["content.engagement.polls", "/ase/content/engagement/polls", "engagement"],
|
|
[
|
|
"content.engagement.poll-create",
|
|
"/ase/content/engagement/polls/create",
|
|
"engagement",
|
|
],
|
|
[
|
|
"content.engagement.poll-detail",
|
|
"/ase/content/engagement/polls/:id",
|
|
"engagement",
|
|
],
|
|
["content.help.questions", "/ase/content/help/questions", "help"],
|
|
[
|
|
"content.help.question-create",
|
|
"/ase/content/help/questions/new",
|
|
"help",
|
|
],
|
|
[
|
|
"content.help.question-detail",
|
|
"/ase/content/help/questions/:id",
|
|
"help",
|
|
],
|
|
["content.editorial.tags", "/ase/content/editorial/tags", "editorial"],
|
|
[
|
|
"content.engagement.prefixes",
|
|
"/ase/content/engagement/prefixes",
|
|
"engagement",
|
|
],
|
|
[
|
|
"content.editorial.writeable-boxes",
|
|
"/ase/content/editorial/writeable-boxes",
|
|
"editorial",
|
|
],
|
|
[
|
|
"content.help.email-templates",
|
|
"/ase/content/help/email-templates",
|
|
"help",
|
|
],
|
|
["content.brand.theme", "/ase/content/brand/theme", "brand"],
|
|
["content.brand.favicon", "/ase/content/brand/favicon", "brand"],
|
|
["content.localization.overview", "/ase/content/localization", "localization"],
|
|
[
|
|
"content.localization.client",
|
|
"/ase/content/localization/client",
|
|
"localization",
|
|
],
|
|
["content.localization.cms", "/ase/content/localization/cms", "localization"],
|
|
[
|
|
"content.localization.emulator",
|
|
"/ase/content/localization/emulator",
|
|
"localization",
|
|
],
|
|
] as const;
|
|
|
|
describe("Content routes", () => {
|
|
it("declares the six exact route groups", () => {
|
|
expect(CONTENT_ROUTE_GROUPS).toEqual([
|
|
"editorial",
|
|
"media",
|
|
"engagement",
|
|
"help",
|
|
"brand",
|
|
"localization",
|
|
]);
|
|
});
|
|
|
|
it("maps every migration row to its canonical route and group", () => {
|
|
expect(
|
|
CONTENT_ROUTES.map((route) => [
|
|
route.id,
|
|
route.href,
|
|
contentRouteGroup(route.id as ContentRouteId),
|
|
]),
|
|
).toEqual(expected);
|
|
expect(CONTENT_ROUTE_IDS).toEqual(expected.map(([id]) => id));
|
|
expect(CONTENT_ROUTES.map((route) => route.href).sort()).toEqual(
|
|
contentMigrationEntries
|
|
.filter((entry) => entry.targetPath !== null)
|
|
.map((entry) => entry.targetPath)
|
|
.sort(),
|
|
);
|
|
});
|
|
|
|
it("keeps manifest routes and real handlers in exact equality", () => {
|
|
expect(contentManifest.routes).toBe(CONTENT_ROUTES);
|
|
expect(contentManifest.routes.map((route) => route.id)).toEqual(
|
|
HOUSEKEEPING_ROUTE_HANDLERS.filter((handler) =>
|
|
handler.routeId.startsWith("content."),
|
|
).map((handler) => handler.routeId),
|
|
);
|
|
expect(
|
|
HOUSEKEEPING_MANIFESTS.flatMap((manifest) =>
|
|
manifest.routes.map((route) => route.id),
|
|
),
|
|
).toEqual(HOUSEKEEPING_ROUTE_HANDLERS.map((handler) => handler.routeId));
|
|
});
|
|
});
|