144 lines
4.5 KiB
TypeScript
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);
|
|
});
|