import { assertEquals } from "@std/assert"; import { dumpPath, feedPath, parsePagePath, 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"); // 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); });