Files
gerbeur/shared/test/paths.test.ts
2026-10-10 09:14:55 +00:00

144 lines
4.5 KiB
TypeScript

import { assertEquals } from "@std/assert";
import {
dumpPath,
feedPath,
parsePagePath,
parsePlaylistsTab,
playlistPath,
playlistSortQuery,
playlistsPath,
searchPath,
userPath,
} from "../paths.ts";
Deno.test("builders: one hierarchy, default views bare", () => {
assertEquals(userPath("bob"), "/@bob");
assertEquals(userPath("bob", "playlists"), "/@bob/playlists");
assertEquals(userPath("bob", "follow"), "/@bob/follow");
assertEquals(userPath("bob", "follow", "users"), "/@bob/follow");
assertEquals(
userPath("bob", "follow", "playlists"),
"/@bob/follow/playlists",
);
const item = { ownerUsername: "bob", slug: "never-gonna" };
assertEquals(dumpPath(item), "/@bob/dumps/never-gonna");
assertEquals(playlistPath(item), "/@bob/playlists/never-gonna");
assertEquals(
dumpPath({ ownerUsername: "bob", slug: "a-b" }, "edit"),
"/@bob/dumps/a-b/edit",
);
assertEquals(feedPath(), "/");
assertEquals(feedPath(undefined, "hot"), "/hot");
assertEquals(feedPath("music"), "/music");
assertEquals(feedPath("music", "follow"), "/music/follow");
assertEquals(feedPath("music", "follow", "users"), "/music/follow");
assertEquals(
feedPath(undefined, "follow", "playlists"),
"/follow/playlists",
);
assertEquals(feedPath(undefined, "new", "playlists"), "/new");
assertEquals(searchPath(), "/search");
assertEquals(searchPath("users", "a b"), "/search/users?q=a%20b");
assertEquals(searchPath("dumps", "x"), "/search?q=x");
assertEquals(playlistsPath(), "/playlists");
assertEquals(playlistsPath("mixes"), "/playlists/mixes");
assertEquals(playlistsPath(undefined, "updated"), "/playlists");
assertEquals(playlistsPath("mixes", "new"), "/playlists/mixes?sort=new");
assertEquals(playlistsPath("mixes", "mine"), "/playlists/mixes?mine=1");
// The page's tab is one or the other: its own playlists come in one order.
const tab = (query: string) => parsePlaylistsTab(new URLSearchParams(query));
assertEquals(tab(""), "updated");
assertEquals(tab("sort=dumps"), "dumps");
assertEquals(tab("sort=nope"), "updated");
assertEquals(tab("mine=1"), "mine");
assertEquals(tab("mine=1&sort=dumps"), "mine");
// The query of a list that has other parameters: the default order takes
// an old `sort` out, and leaves the rest.
const category = new URLSearchParams({ category: "mixes", sort: "new" });
assertEquals(
playlistSortQuery("dumps", category),
"?category=mixes&sort=dumps",
);
assertEquals(playlistSortQuery("updated", category), "?category=mixes");
assertEquals(playlistSortQuery("updated"), "");
});
Deno.test("parsePagePath: what a path under a user names", () => {
assertEquals(parsePagePath("/@bob"), {
kind: "user",
username: "bob",
rest: [],
});
assertEquals(parsePagePath("/@bob/follow/playlists/"), {
kind: "user",
username: "bob",
rest: ["follow", "playlists"],
});
assertEquals(parsePagePath("/@bob/dumps/never-gonna"), {
kind: "dump",
username: "bob",
slug: "never-gonna",
edit: false,
});
assertEquals(parsePagePath("/%40bob/dumps/x/edit"), {
kind: "dump",
username: "bob",
slug: "x",
edit: true,
});
assertEquals(parsePagePath("/@bob/playlists/mix"), {
kind: "playlist",
username: "bob",
slug: "mix",
edit: false,
});
assertEquals(parsePagePath("/@bob/playlists/mix/edit"), {
kind: "playlist",
username: "bob",
slug: "mix",
edit: true,
});
assertEquals(
playlistPath({ ownerUsername: "bob", slug: "mix" }, "edit"),
"/@bob/playlists/mix/edit",
);
for (
const other of [
"/",
"/hot",
"/music/hot",
"/search/users",
"/@",
"/@b-ob",
"/@bob/nope",
"/@bob/follow/users",
"/@bob/dumps/x/y",
"/@bob/playlists/x/y",
"/@bob/%E0%A4%A",
]
) {
assertEquals(parsePagePath(other), null, other);
}
});
Deno.test("handles: a user from another instance is /@name@host", () => {
assertEquals(userPath("alice@music.example"), "/@alice@music.example");
assertEquals(
dumpPath({ ownerUsername: "alice@localhost:8001", slug: "x" }),
"/@alice@localhost:8001/dumps/x",
);
assertEquals(parsePagePath("/@alice@music.example/playlists/mix"), {
kind: "playlist",
username: "alice@music.example",
slug: "mix",
edit: false,
});
assertEquals(parsePagePath("/@alice%40music.example"), {
kind: "user",
username: "alice@music.example",
rest: [],
});
assertEquals(parsePagePath("/@alice@"), null);
assertEquals(parsePagePath("/@alice@-bad.example"), null);
});