26 lines · 1.4 KB
import { describe, expect, test } from "bun:test";
import { isRouteTemplate, routeTemplate } from "./route-template";

describe("routeTemplate", () => {
  test("keeps route words and drops every name", () => {
    expect(routeTemplate("/")).toBe("/");
    expect(routeTemplate("/acme")).toBe("/:owner");
    expect(routeTemplate("/acme/secret-repo")).toBe("/:owner/:repo");
    expect(routeTemplate("/acme/secret-repo/issues/42")).toBe("/:owner/:repo/issues/:n");
    expect(routeTemplate("/acme/secret-repo/blob/main/src/hidden.ts")).toBe("/:owner/:repo/blob/:param/:param/:param");
    expect(routeTemplate("/acme/secret-repo.git/info/refs")).toBe("/:owner/:repo.git/info/refs");
    expect(routeTemplate("/api/v1/repos/acme/secret-repo/pulls/3")).toBe("/api/v1/repos/:param/:param/pulls/:n");
    expect(routeTemplate("/settings/tokens")).toBe("/settings/tokens");
    expect(routeTemplate("/_serverFn/fns.repos.exploreRepos")).toBe("/_serverFn/fns.repos.exploreRepos");
    expect(routeTemplate("/_serverFn/not%20an%20id")).toBe("/_serverFn/:fn");
  });

  test("recognises its own output only", () => {
    for (const path of ["/acme/secret/issues/4", "/settings/tokens", "/", "/_serverFn/fns.repos.exploreRepos"]) {
      expect(isRouteTemplate(routeTemplate(path))).toBe(true);
    }
    expect(isRouteTemplate("/acme/secret")).toBe(false);
    expect(isRouteTemplate("/:owner/:repo/blob/secret.ts")).toBe(false);
  });
});