Radish alpha
r
Radicle web interface
Radicle
Git (anonymous pull)
Log in to clone via SSH
Move all test files to the `tests` folder
Rūdolfs Ošiņš committed 3 years ago
commit 6c363e9313efef8035fbacf7de3d515a7954d234
parent 3aa99ca4df7cf696da04801cea24a30571d75c9d
9 files changed +517 -517
deleted src/router/index.test.ts
@@ -1,239 +0,0 @@
-
import { describe, expect, test } from "vitest";
-
import { routeToPath } from "./index";
-
import { testExports } from "./index";
-

-
// Defining the window.origin value, since vitest doesn't provide one.
-
window.origin = "http://localhost:3000";
-

-
describe("routeToPath", () => {
-
  test.each([
-
    { input: { resource: "home" }, output: "/", description: "Home Route" },
-
    {
-
      input: { resource: "vesting" },
-
      output: "/vesting",
-
      description: "Vesting Route",
-
    },
-
    {
-
      input: { resource: "faucet", params: { view: { resource: "form" } } },
-
      output: "/faucet",
-
      description: "Faucet Form Route",
-
    },
-
    {
-
      input: {
-
        resource: "profile",
-
        params: { addressOrName: "cloudhead.eth" },
-
      },
-
      output: "/cloudhead.eth",
-
      description: "Profile Route",
-
    },
-
    {
-
      input: { resource: "seeds", params: { host: "willow.radicle.garden" } },
-
      output: "/seeds/willow.radicle.garden",
-
      description: "Seed View Route",
-
    },
-
    {
-
      input: {
-
        resource: "registrations",
-
        params: {
-
          view: { resource: "validateName" },
-
        },
-
      },
-
      output: "/registrations",
-
      description: "registrations Index Route",
-
    },
-
    {
-
      input: {
-
        resource: "registrations",
-
        params: {
-
          view: {
-
            resource: "view",
-
            params: { nameOrDomain: "sebastinez", retry: true },
-
          },
-
        },
-
      },
-
      output: "/registrations/sebastinez?retry=true",
-
      description: "registrations View Route",
-
    },
-
    {
-
      input: {
-
        resource: "registrations",
-
        params: {
-
          view: {
-
            resource: "view",
-
            params: { nameOrDomain: "sebastinez", retry: false },
-
          },
-
        },
-
      },
-
      output: "/registrations/sebastinez?retry=false",
-
      description: "registrations View Route",
-
    },
-
    {
-
      input: {
-
        resource: "registrations",
-
        params: {
-
          view: {
-
            resource: "checkNameAvailability",
-
            params: {
-
              nameOrDomain: "sebastinez",
-
            },
-
          },
-
        },
-
      },
-
      output: "/registrations/sebastinez/checkNameAvailability",
-
      description: "registrations Form Route",
-
    },
-
    {
-
      input: {
-
        resource: "registrations",
-
        params: {
-
          view: {
-
            resource: "register",
-
            params: { nameOrDomain: "sebastinez" },
-
          },
-
        },
-
      },
-
      output: "/registrations/sebastinez/register",
-
      description: "registrations Submit Route",
-
    },
-
    {
-
      input: {
-
        resource: "projects",
-
        params: {
-
          view: { resource: "tree" },
-
          seed: "willow.radicle.garden",
-
          urn: "rad:git:hnrkmg77m8tfzj4gi4pa4mbhgysfgzwntjpao",
-
        },
-
      },
-
      output:
-
        "/seeds/willow.radicle.garden/rad:git:hnrkmg77m8tfzj4gi4pa4mbhgysfgzwntjpao/tree",
-
      description: "Seed Project Route",
-
    },
-
  ])("$description", (route: any) => {
-
    expect(routeToPath(route.input)).toEqual(route.output);
-
  });
-
});
-

-
describe("pathToRoute", () => {
-
  test.each([
-
    { input: "", output: null, description: "Empty 404 Route" },
-
    {
-
      input: "/foo/baz/bar",
-
      output: null,
-
      description: "Non existant 404 Route",
-
    },
-
    { input: "/", output: { resource: "home" }, description: "Home Route" },
-
    {
-
      input: "/vesting",
-
      output: { resource: "vesting" },
-
      description: "Vesting Route",
-
    },
-
    {
-
      input: "/faucet",
-
      output: { resource: "faucet", params: { view: { resource: "form" } } },
-
      description: "Faucet Form Route",
-
    },
-
    {
-
      input: "/faucet/withdraw?amount=10",
-
      output: {
-
        resource: "faucet",
-
        params: { view: { resource: "withdraw", params: { amount: "10" } } },
-
      },
-
      description: "Faucet Withdraw Route",
-
    },
-
    {
-
      input: "/cloudhead.eth",
-
      output: {
-
        resource: "profile",
-
        params: { addressOrName: "cloudhead.eth" },
-
      },
-
      description: "Profile Route",
-
    },
-
    {
-
      input: "/seeds/willow.radicle.garden",
-
      output: { resource: "seeds", params: { host: "willow.radicle.garden" } },
-
      description: "Seed View Route",
-
    },
-
    {
-
      input: "/registrations",
-
      output: {
-
        resource: "registrations",
-
        params: {
-
          view: { resource: "validateName" },
-
        },
-
      },
-
      description: "registrations Index Route",
-
    },
-
    {
-
      input: "/registrations/sebastinez",
-
      output: {
-
        resource: "registrations",
-
        params: {
-
          view: {
-
            resource: "view",
-
            params: { nameOrDomain: "sebastinez", retry: false },
-
          },
-
        },
-
      },
-
      description: "registrations View Route",
-
    },
-
    {
-
      input: "/registrations/sebastinez?retry=true",
-
      output: {
-
        resource: "registrations",
-
        params: {
-
          view: {
-
            resource: "view",
-
            params: { nameOrDomain: "sebastinez", retry: true },
-
          },
-
        },
-
      },
-
      description: "registrations View Route",
-
    },
-
    {
-
      input: "/registrations/sebastinez/checkNameAvailability",
-
      output: {
-
        resource: "registrations",
-
        params: {
-
          view: {
-
            resource: "checkNameAvailability",
-
            params: {
-
              nameOrDomain: "sebastinez",
-
              owner: null,
-
            },
-
          },
-
        },
-
      },
-
      description: "registrations Form Route",
-
    },
-
    {
-
      input: "/registrations/sebastinez/register",
-
      output: {
-
        resource: "registrations",
-
        params: {
-
          view: {
-
            resource: "register",
-
            params: { nameOrDomain: "sebastinez", owner: null },
-
          },
-
        },
-
      },
-
      description: "registrations Submit Route",
-
    },
-
    {
-
      input:
-
        "/seeds/willow.radicle.garden/rad:git:hnrkmg77m8tfzj4gi4pa4mbhgysfgzwntjpao",
-
      output: {
-
        resource: "projects",
-
        params: {
-
          view: { resource: "tree" },
-
          seed: "willow.radicle.garden",
-
          profile: undefined,
-
          peer: undefined,
-
          urn: "rad:git:hnrkmg77m8tfzj4gi4pa4mbhgysfgzwntjpao",
-
        },
-
      },
-
      description: "Seed Project Route",
-
    },
-
  ])("$description", (route: any) => {
-
    expect(testExports.pathToRoute(route.input)).toEqual(route.output);
-
  });
-
});
added tests/e2e/hashRouter.spec.ts
@@ -0,0 +1,137 @@
+
import { test, expect } from "@tests/support/fixtures.js";
+
import {
+
  expectBackAndForwardNavigationWorks,
+
  expectUrlPersistsReload,
+
} from "@tests/support/router.js";
+

+
test.beforeEach(async ({ page }) => {
+
  await page.addInitScript(() => {
+
    window.HASH_ROUTING = true;
+
  });
+
});
+

+
test("navigate between landing and project page", async ({ page }) => {
+
  await page.addInitScript(() => {
+
    window.APP_CONFIG = {
+
      walletConnect: {
+
        bridge: "https://radicle.bridge.walletconnect.org",
+
      },
+
      reactions: [],
+
      seeds: {
+
        pinned: [{ host: "0.0.0.0", emoji: "🚀" }],
+
      },
+
      projects: {
+
        pinned: [
+
          {
+
            name: "source-browsing",
+
            urn: "rad:git:hnrkgd7sjt79k4j59ddh11ooxg18rk7soej8o",
+
            seed: "0.0.0.0",
+
          },
+
        ],
+
      },
+
    };
+
  });
+

+
  await page.goto("/#/");
+
  await expect(page).toHaveURL("/#/");
+

+
  await page.locator("text=source-browsing").click();
+
  await expect(page).toHaveURL(
+
    "/#/seeds/0.0.0.0/rad:git:hnrkgd7sjt79k4j59ddh11ooxg18rk7soej8o/tree/530aabdcc80397af254bc488b767169b92496e81",
+
  );
+

+
  await expectBackAndForwardNavigationWorks("/#/", page);
+
  await expectUrlPersistsReload(page);
+
});
+

+
test("navigation between seed and project pages", async ({ page }) => {
+
  await page.goto("/#/seeds/radicle.local");
+

+
  const project = page.locator(".project");
+
  await project.click();
+
  await expect(page).toHaveURL(
+
    "/#/seeds/0.0.0.0/rad:git:hnrkgd7sjt79k4j59ddh11ooxg18rk7soej8o/tree/530aabdcc80397af254bc488b767169b92496e81",
+
  );
+

+
  await expectBackAndForwardNavigationWorks("/#/seeds/radicle.local", page);
+
  await expectUrlPersistsReload(page);
+

+
  await page.locator('role=button[name="Seed"]').click();
+
  await expect(page).toHaveURL("/#/seeds/0.0.0.0");
+
});
+

+
test.describe("project page navigation", () => {
+
  test("navigation between commit history and single commit", async ({
+
    page,
+
  }) => {
+
    const projectHistoryURL =
+
      "/#/seeds/0.0.0.0/rad:git:hnrkgd7sjt79k4j59ddh11ooxg18rk7soej8o/history/530aabdcc80397af254bc488b767169b92496e81";
+
    await page.goto(projectHistoryURL);
+

+
    await page.locator("text=Add Markdown cheat sheet").click();
+
    await expect(page).toHaveURL(
+
      "/#/seeds/0.0.0.0/rad:git:hnrkgd7sjt79k4j59ddh11ooxg18rk7soej8o/commits/530aabdcc80397af254bc488b767169b92496e81",
+
    );
+

+
    await expectBackAndForwardNavigationWorks(projectHistoryURL, page);
+
    await expectUrlPersistsReload(page);
+
  });
+

+
  test("navigate between tree and commit history", async ({ page }) => {
+
    const projectTreeURL =
+
      "/#/seeds/0.0.0.0/rad:git:hnrkgd7sjt79k4j59ddh11ooxg18rk7soej8o/tree/530aabdcc80397af254bc488b767169b92496e81";
+

+
    await page.goto(projectTreeURL);
+
    await expect(page).toHaveURL(projectTreeURL);
+

+
    await page.locator('role=button[name="Commit count"]').click();
+
    await expect(page).toHaveURL(
+
      "/#/seeds/0.0.0.0/rad:git:hnrkgd7sjt79k4j59ddh11ooxg18rk7soej8o/history/530aabdcc80397af254bc488b767169b92496e81",
+
    );
+

+
    await expectBackAndForwardNavigationWorks(projectTreeURL, page);
+
    await expectUrlPersistsReload(page);
+
  });
+

+
  test("navigate project paths", async ({ page }) => {
+
    const projectTreeURL =
+
      "/#/seeds/0.0.0.0/rad:git:hnrkgd7sjt79k4j59ddh11ooxg18rk7soej8o/tree/530aabdcc80397af254bc488b767169b92496e81";
+

+
    await page.goto(projectTreeURL);
+
    await expect(page).toHaveURL(projectTreeURL);
+

+
    await page.locator("text=.hidden").click();
+
    await expect(page).toHaveURL(`${projectTreeURL}/.hidden`);
+

+
    await page.locator("text=bin/").click();
+
    await page.locator("text=true").click();
+
    await expect(page).toHaveURL(`${projectTreeURL}/bin/true`);
+

+
    await expectBackAndForwardNavigationWorks(
+
      `${projectTreeURL}/.hidden`,
+
      page,
+
    );
+
    await expectUrlPersistsReload(page);
+
  });
+

+
  test("navigate project paths with a selected peer", async ({ page }) => {
+
    const projectTreeURL =
+
      "/#/seeds/0.0.0.0/rad:git:hnrkgd7sjt79k4j59ddh11ooxg18rk7soej8o/remotes/hyn1mjueopwzrmb18c3zmgg8ei8qunn5wpg76ouymytfqkfxqx7bun/tree";
+

+
    await page.goto(projectTreeURL);
+
    await expect(page).toHaveURL(projectTreeURL);
+

+
    await page.locator("text=.hidden").click();
+
    await expect(page).toHaveURL(`${projectTreeURL}/main/.hidden`);
+

+
    await page.locator("text=bin/").click();
+
    await page.locator("text=true").click();
+
    await expect(page).toHaveURL(`${projectTreeURL}/main/bin/true`);
+

+
    await expectBackAndForwardNavigationWorks(
+
      `${projectTreeURL}/main/.hidden`,
+
      page,
+
    );
+
    await expectUrlPersistsReload(page);
+
  });
+
});
added tests/e2e/historyRouter.spec.ts
@@ -0,0 +1,131 @@
+
import { test, expect } from "@tests/support/fixtures.js";
+
import {
+
  expectBackAndForwardNavigationWorks,
+
  expectUrlPersistsReload,
+
} from "@tests/support/router.js";
+

+
test("navigate between landing and project page", async ({ page }) => {
+
  await page.addInitScript(() => {
+
    window.APP_CONFIG = {
+
      walletConnect: {
+
        bridge: "https://radicle.bridge.walletconnect.org",
+
      },
+
      reactions: [],
+
      seeds: {
+
        pinned: [{ host: "0.0.0.0", emoji: "🚀" }],
+
      },
+
      projects: {
+
        pinned: [
+
          {
+
            name: "source-browsing",
+
            urn: "rad:git:hnrkgd7sjt79k4j59ddh11ooxg18rk7soej8o",
+
            seed: "0.0.0.0",
+
          },
+
        ],
+
      },
+
    };
+
  });
+

+
  await page.goto("/");
+
  await expect(page).toHaveURL("/");
+

+
  await page.locator("text=source-browsing").click();
+
  await expect(page).toHaveURL(
+
    "/seeds/0.0.0.0/rad:git:hnrkgd7sjt79k4j59ddh11ooxg18rk7soej8o/tree/530aabdcc80397af254bc488b767169b92496e81",
+
  );
+

+
  await expectBackAndForwardNavigationWorks("/", page);
+
  await expectUrlPersistsReload(page);
+
});
+

+
test("navigation between seed and project pages", async ({ page }) => {
+
  await page.goto("/seeds/radicle.local");
+

+
  const project = page.locator(".project");
+
  await project.click();
+
  await expect(page).toHaveURL(
+
    "/seeds/0.0.0.0/rad:git:hnrkgd7sjt79k4j59ddh11ooxg18rk7soej8o/tree/530aabdcc80397af254bc488b767169b92496e81",
+
  );
+

+
  await expectBackAndForwardNavigationWorks("/seeds/radicle.local", page);
+
  await expectUrlPersistsReload(page);
+

+
  await page.locator('role=button[name="Seed"]').click();
+
  await expect(page).toHaveURL("/seeds/0.0.0.0");
+
});
+

+
test.describe("project page navigation", () => {
+
  test("navigation between commit history and single commit", async ({
+
    page,
+
  }) => {
+
    const projectHistoryURL =
+
      "/seeds/0.0.0.0/rad:git:hnrkgd7sjt79k4j59ddh11ooxg18rk7soej8o/history/530aabdcc80397af254bc488b767169b92496e81";
+
    await page.goto(projectHistoryURL);
+

+
    await page.locator("text=Add Markdown cheat sheet").click();
+
    await expect(page).toHaveURL(
+
      "/seeds/0.0.0.0/rad:git:hnrkgd7sjt79k4j59ddh11ooxg18rk7soej8o/commits/530aabdcc80397af254bc488b767169b92496e81",
+
    );
+

+
    await expectBackAndForwardNavigationWorks(projectHistoryURL, page);
+
    await expectUrlPersistsReload(page);
+
  });
+

+
  test("navigate between tree and commit history", async ({ page }) => {
+
    const projectTreeURL =
+
      "/seeds/0.0.0.0/rad:git:hnrkgd7sjt79k4j59ddh11ooxg18rk7soej8o/tree/530aabdcc80397af254bc488b767169b92496e81";
+

+
    await page.goto(projectTreeURL);
+
    await expect(page).toHaveURL(projectTreeURL);
+

+
    await page.locator('role=button[name="Commit count"]').click();
+
    await expect(page).toHaveURL(
+
      "/seeds/0.0.0.0/rad:git:hnrkgd7sjt79k4j59ddh11ooxg18rk7soej8o/history/530aabdcc80397af254bc488b767169b92496e81",
+
    );
+

+
    await expectBackAndForwardNavigationWorks(projectTreeURL, page);
+
    await expectUrlPersistsReload(page);
+
  });
+

+
  test("navigate project paths", async ({ page }) => {
+
    const projectTreeURL =
+
      "/seeds/0.0.0.0/rad:git:hnrkgd7sjt79k4j59ddh11ooxg18rk7soej8o/tree/530aabdcc80397af254bc488b767169b92496e81";
+

+
    await page.goto(projectTreeURL);
+
    await expect(page).toHaveURL(projectTreeURL);
+

+
    await page.locator("text=.hidden").click();
+
    await expect(page).toHaveURL(`${projectTreeURL}/.hidden`);
+

+
    await page.locator("text=bin/").click();
+
    await page.locator("text=true").click();
+
    await expect(page).toHaveURL(`${projectTreeURL}/bin/true`);
+

+
    await expectBackAndForwardNavigationWorks(
+
      `${projectTreeURL}/.hidden`,
+
      page,
+
    );
+
    await expectUrlPersistsReload(page);
+
  });
+

+
  test("navigate project paths with a selected peer", async ({ page }) => {
+
    const projectTreeURL =
+
      "seeds/0.0.0.0/rad:git:hnrkgd7sjt79k4j59ddh11ooxg18rk7soej8o/remotes/hyn1mjueopwzrmb18c3zmgg8ei8qunn5wpg76ouymytfqkfxqx7bun/tree";
+

+
    await page.goto(projectTreeURL);
+
    await expect(page).toHaveURL(projectTreeURL);
+

+
    await page.locator("text=.hidden").click();
+
    await expect(page).toHaveURL(`${projectTreeURL}/main/.hidden`);
+

+
    await page.locator("text=bin/").click();
+
    await page.locator("text=true").click();
+
    await expect(page).toHaveURL(`${projectTreeURL}/main/bin/true`);
+

+
    await expectBackAndForwardNavigationWorks(
+
      `${projectTreeURL}/main/.hidden`,
+
      page,
+
    );
+
    await expectUrlPersistsReload(page);
+
  });
+
});
deleted tests/e2e/router.hash.spec.ts
@@ -1,137 +0,0 @@
-
import { test, expect } from "@tests/support/fixtures.js";
-
import {
-
  expectBackAndForwardNavigationWorks,
-
  expectUrlPersistsReload,
-
} from "@tests/support/router.js";
-

-
test.beforeEach(async ({ page }) => {
-
  await page.addInitScript(() => {
-
    window.HASH_ROUTING = true;
-
  });
-
});
-

-
test("navigate between landing and project page", async ({ page }) => {
-
  await page.addInitScript(() => {
-
    window.APP_CONFIG = {
-
      walletConnect: {
-
        bridge: "https://radicle.bridge.walletconnect.org",
-
      },
-
      reactions: [],
-
      seeds: {
-
        pinned: [{ host: "0.0.0.0", emoji: "🚀" }],
-
      },
-
      projects: {
-
        pinned: [
-
          {
-
            name: "source-browsing",
-
            urn: "rad:git:hnrkgd7sjt79k4j59ddh11ooxg18rk7soej8o",
-
            seed: "0.0.0.0",
-
          },
-
        ],
-
      },
-
    };
-
  });
-

-
  await page.goto("/#/");
-
  await expect(page).toHaveURL("/#/");
-

-
  await page.locator("text=source-browsing").click();
-
  await expect(page).toHaveURL(
-
    "/#/seeds/0.0.0.0/rad:git:hnrkgd7sjt79k4j59ddh11ooxg18rk7soej8o/tree/530aabdcc80397af254bc488b767169b92496e81",
-
  );
-

-
  await expectBackAndForwardNavigationWorks("/#/", page);
-
  await expectUrlPersistsReload(page);
-
});
-

-
test("navigation between seed and project pages", async ({ page }) => {
-
  await page.goto("/#/seeds/radicle.local");
-

-
  const project = page.locator(".project");
-
  await project.click();
-
  await expect(page).toHaveURL(
-
    "/#/seeds/0.0.0.0/rad:git:hnrkgd7sjt79k4j59ddh11ooxg18rk7soej8o/tree/530aabdcc80397af254bc488b767169b92496e81",
-
  );
-

-
  await expectBackAndForwardNavigationWorks("/#/seeds/radicle.local", page);
-
  await expectUrlPersistsReload(page);
-

-
  await page.locator('role=button[name="Seed"]').click();
-
  await expect(page).toHaveURL("/#/seeds/0.0.0.0");
-
});
-

-
test.describe("project page navigation", () => {
-
  test("navigation between commit history and single commit", async ({
-
    page,
-
  }) => {
-
    const projectHistoryURL =
-
      "/#/seeds/0.0.0.0/rad:git:hnrkgd7sjt79k4j59ddh11ooxg18rk7soej8o/history/530aabdcc80397af254bc488b767169b92496e81";
-
    await page.goto(projectHistoryURL);
-

-
    await page.locator("text=Add Markdown cheat sheet").click();
-
    await expect(page).toHaveURL(
-
      "/#/seeds/0.0.0.0/rad:git:hnrkgd7sjt79k4j59ddh11ooxg18rk7soej8o/commits/530aabdcc80397af254bc488b767169b92496e81",
-
    );
-

-
    await expectBackAndForwardNavigationWorks(projectHistoryURL, page);
-
    await expectUrlPersistsReload(page);
-
  });
-

-
  test("navigate between tree and commit history", async ({ page }) => {
-
    const projectTreeURL =
-
      "/#/seeds/0.0.0.0/rad:git:hnrkgd7sjt79k4j59ddh11ooxg18rk7soej8o/tree/530aabdcc80397af254bc488b767169b92496e81";
-

-
    await page.goto(projectTreeURL);
-
    await expect(page).toHaveURL(projectTreeURL);
-

-
    await page.locator('role=button[name="Commit count"]').click();
-
    await expect(page).toHaveURL(
-
      "/#/seeds/0.0.0.0/rad:git:hnrkgd7sjt79k4j59ddh11ooxg18rk7soej8o/history/530aabdcc80397af254bc488b767169b92496e81",
-
    );
-

-
    await expectBackAndForwardNavigationWorks(projectTreeURL, page);
-
    await expectUrlPersistsReload(page);
-
  });
-

-
  test("navigate project paths", async ({ page }) => {
-
    const projectTreeURL =
-
      "/#/seeds/0.0.0.0/rad:git:hnrkgd7sjt79k4j59ddh11ooxg18rk7soej8o/tree/530aabdcc80397af254bc488b767169b92496e81";
-

-
    await page.goto(projectTreeURL);
-
    await expect(page).toHaveURL(projectTreeURL);
-

-
    await page.locator("text=.hidden").click();
-
    await expect(page).toHaveURL(`${projectTreeURL}/.hidden`);
-

-
    await page.locator("text=bin/").click();
-
    await page.locator("text=true").click();
-
    await expect(page).toHaveURL(`${projectTreeURL}/bin/true`);
-

-
    await expectBackAndForwardNavigationWorks(
-
      `${projectTreeURL}/.hidden`,
-
      page,
-
    );
-
    await expectUrlPersistsReload(page);
-
  });
-

-
  test("navigate project paths with a selected peer", async ({ page }) => {
-
    const projectTreeURL =
-
      "/#/seeds/0.0.0.0/rad:git:hnrkgd7sjt79k4j59ddh11ooxg18rk7soej8o/remotes/hyn1mjueopwzrmb18c3zmgg8ei8qunn5wpg76ouymytfqkfxqx7bun/tree";
-

-
    await page.goto(projectTreeURL);
-
    await expect(page).toHaveURL(projectTreeURL);
-

-
    await page.locator("text=.hidden").click();
-
    await expect(page).toHaveURL(`${projectTreeURL}/main/.hidden`);
-

-
    await page.locator("text=bin/").click();
-
    await page.locator("text=true").click();
-
    await expect(page).toHaveURL(`${projectTreeURL}/main/bin/true`);
-

-
    await expectBackAndForwardNavigationWorks(
-
      `${projectTreeURL}/main/.hidden`,
-
      page,
-
    );
-
    await expectUrlPersistsReload(page);
-
  });
-
});
deleted tests/e2e/router.history.spec.ts
@@ -1,131 +0,0 @@
-
import { test, expect } from "@tests/support/fixtures.js";
-
import {
-
  expectBackAndForwardNavigationWorks,
-
  expectUrlPersistsReload,
-
} from "@tests/support/router.js";
-

-
test("navigate between landing and project page", async ({ page }) => {
-
  await page.addInitScript(() => {
-
    window.APP_CONFIG = {
-
      walletConnect: {
-
        bridge: "https://radicle.bridge.walletconnect.org",
-
      },
-
      reactions: [],
-
      seeds: {
-
        pinned: [{ host: "0.0.0.0", emoji: "🚀" }],
-
      },
-
      projects: {
-
        pinned: [
-
          {
-
            name: "source-browsing",
-
            urn: "rad:git:hnrkgd7sjt79k4j59ddh11ooxg18rk7soej8o",
-
            seed: "0.0.0.0",
-
          },
-
        ],
-
      },
-
    };
-
  });
-

-
  await page.goto("/");
-
  await expect(page).toHaveURL("/");
-

-
  await page.locator("text=source-browsing").click();
-
  await expect(page).toHaveURL(
-
    "/seeds/0.0.0.0/rad:git:hnrkgd7sjt79k4j59ddh11ooxg18rk7soej8o/tree/530aabdcc80397af254bc488b767169b92496e81",
-
  );
-

-
  await expectBackAndForwardNavigationWorks("/", page);
-
  await expectUrlPersistsReload(page);
-
});
-

-
test("navigation between seed and project pages", async ({ page }) => {
-
  await page.goto("/seeds/radicle.local");
-

-
  const project = page.locator(".project");
-
  await project.click();
-
  await expect(page).toHaveURL(
-
    "/seeds/0.0.0.0/rad:git:hnrkgd7sjt79k4j59ddh11ooxg18rk7soej8o/tree/530aabdcc80397af254bc488b767169b92496e81",
-
  );
-

-
  await expectBackAndForwardNavigationWorks("/seeds/radicle.local", page);
-
  await expectUrlPersistsReload(page);
-

-
  await page.locator('role=button[name="Seed"]').click();
-
  await expect(page).toHaveURL("/seeds/0.0.0.0");
-
});
-

-
test.describe("project page navigation", () => {
-
  test("navigation between commit history and single commit", async ({
-
    page,
-
  }) => {
-
    const projectHistoryURL =
-
      "/seeds/0.0.0.0/rad:git:hnrkgd7sjt79k4j59ddh11ooxg18rk7soej8o/history/530aabdcc80397af254bc488b767169b92496e81";
-
    await page.goto(projectHistoryURL);
-

-
    await page.locator("text=Add Markdown cheat sheet").click();
-
    await expect(page).toHaveURL(
-
      "/seeds/0.0.0.0/rad:git:hnrkgd7sjt79k4j59ddh11ooxg18rk7soej8o/commits/530aabdcc80397af254bc488b767169b92496e81",
-
    );
-

-
    await expectBackAndForwardNavigationWorks(projectHistoryURL, page);
-
    await expectUrlPersistsReload(page);
-
  });
-

-
  test("navigate between tree and commit history", async ({ page }) => {
-
    const projectTreeURL =
-
      "/seeds/0.0.0.0/rad:git:hnrkgd7sjt79k4j59ddh11ooxg18rk7soej8o/tree/530aabdcc80397af254bc488b767169b92496e81";
-

-
    await page.goto(projectTreeURL);
-
    await expect(page).toHaveURL(projectTreeURL);
-

-
    await page.locator('role=button[name="Commit count"]').click();
-
    await expect(page).toHaveURL(
-
      "/seeds/0.0.0.0/rad:git:hnrkgd7sjt79k4j59ddh11ooxg18rk7soej8o/history/530aabdcc80397af254bc488b767169b92496e81",
-
    );
-

-
    await expectBackAndForwardNavigationWorks(projectTreeURL, page);
-
    await expectUrlPersistsReload(page);
-
  });
-

-
  test("navigate project paths", async ({ page }) => {
-
    const projectTreeURL =
-
      "/seeds/0.0.0.0/rad:git:hnrkgd7sjt79k4j59ddh11ooxg18rk7soej8o/tree/530aabdcc80397af254bc488b767169b92496e81";
-

-
    await page.goto(projectTreeURL);
-
    await expect(page).toHaveURL(projectTreeURL);
-

-
    await page.locator("text=.hidden").click();
-
    await expect(page).toHaveURL(`${projectTreeURL}/.hidden`);
-

-
    await page.locator("text=bin/").click();
-
    await page.locator("text=true").click();
-
    await expect(page).toHaveURL(`${projectTreeURL}/bin/true`);
-

-
    await expectBackAndForwardNavigationWorks(
-
      `${projectTreeURL}/.hidden`,
-
      page,
-
    );
-
    await expectUrlPersistsReload(page);
-
  });
-

-
  test("navigate project paths with a selected peer", async ({ page }) => {
-
    const projectTreeURL =
-
      "seeds/0.0.0.0/rad:git:hnrkgd7sjt79k4j59ddh11ooxg18rk7soej8o/remotes/hyn1mjueopwzrmb18c3zmgg8ei8qunn5wpg76ouymytfqkfxqx7bun/tree";
-

-
    await page.goto(projectTreeURL);
-
    await expect(page).toHaveURL(projectTreeURL);
-

-
    await page.locator("text=.hidden").click();
-
    await expect(page).toHaveURL(`${projectTreeURL}/main/.hidden`);
-

-
    await page.locator("text=bin/").click();
-
    await page.locator("text=true").click();
-
    await expect(page).toHaveURL(`${projectTreeURL}/main/bin/true`);
-

-
    await expectBackAndForwardNavigationWorks(
-
      `${projectTreeURL}/main/.hidden`,
-
      page,
-
    );
-
    await expectUrlPersistsReload(page);
-
  });
-
});
added tests/support/setupVitest.ts
@@ -0,0 +1,9 @@
+
// Found in https://github.com/belgattitude/nextjs-monorepo-example/pull/2913
+
// Hack for vitest 0.25.2 / happy-dom. Keep till those issues are fixed
+
// - https://github.com/vitest-dev/vitest/issues/2305#issuecomment-1311420462
+
// - https://github.com/capricorn86/happy-dom/issues/569
+

+
import { URL } from "node:url";
+
//@ts-expect-error The two types don't match, but for this hack we have to
+
//overwrite the given URL by happy-dom with the URL class passed by Node
+
globalThis.URL = URL;
added tests/unit/router.test.ts
@@ -0,0 +1,239 @@
+
import { describe, expect, test } from "vitest";
+
import { routeToPath } from "@app/router/index";
+
import { testExports } from "@app/router/index";
+

+
// Defining the window.origin value, since vitest doesn't provide one.
+
window.origin = "http://localhost:3000";
+

+
describe("routeToPath", () => {
+
  test.each([
+
    { input: { resource: "home" }, output: "/", description: "Home Route" },
+
    {
+
      input: { resource: "vesting" },
+
      output: "/vesting",
+
      description: "Vesting Route",
+
    },
+
    {
+
      input: { resource: "faucet", params: { view: { resource: "form" } } },
+
      output: "/faucet",
+
      description: "Faucet Form Route",
+
    },
+
    {
+
      input: {
+
        resource: "profile",
+
        params: { addressOrName: "cloudhead.eth" },
+
      },
+
      output: "/cloudhead.eth",
+
      description: "Profile Route",
+
    },
+
    {
+
      input: { resource: "seeds", params: { host: "willow.radicle.garden" } },
+
      output: "/seeds/willow.radicle.garden",
+
      description: "Seed View Route",
+
    },
+
    {
+
      input: {
+
        resource: "registrations",
+
        params: {
+
          view: { resource: "validateName" },
+
        },
+
      },
+
      output: "/registrations",
+
      description: "registrations Index Route",
+
    },
+
    {
+
      input: {
+
        resource: "registrations",
+
        params: {
+
          view: {
+
            resource: "view",
+
            params: { nameOrDomain: "sebastinez", retry: true },
+
          },
+
        },
+
      },
+
      output: "/registrations/sebastinez?retry=true",
+
      description: "registrations View Route",
+
    },
+
    {
+
      input: {
+
        resource: "registrations",
+
        params: {
+
          view: {
+
            resource: "view",
+
            params: { nameOrDomain: "sebastinez", retry: false },
+
          },
+
        },
+
      },
+
      output: "/registrations/sebastinez?retry=false",
+
      description: "registrations View Route",
+
    },
+
    {
+
      input: {
+
        resource: "registrations",
+
        params: {
+
          view: {
+
            resource: "checkNameAvailability",
+
            params: {
+
              nameOrDomain: "sebastinez",
+
            },
+
          },
+
        },
+
      },
+
      output: "/registrations/sebastinez/checkNameAvailability",
+
      description: "registrations Form Route",
+
    },
+
    {
+
      input: {
+
        resource: "registrations",
+
        params: {
+
          view: {
+
            resource: "register",
+
            params: { nameOrDomain: "sebastinez" },
+
          },
+
        },
+
      },
+
      output: "/registrations/sebastinez/register",
+
      description: "registrations Submit Route",
+
    },
+
    {
+
      input: {
+
        resource: "projects",
+
        params: {
+
          view: { resource: "tree" },
+
          seed: "willow.radicle.garden",
+
          urn: "rad:git:hnrkmg77m8tfzj4gi4pa4mbhgysfgzwntjpao",
+
        },
+
      },
+
      output:
+
        "/seeds/willow.radicle.garden/rad:git:hnrkmg77m8tfzj4gi4pa4mbhgysfgzwntjpao/tree",
+
      description: "Seed Project Route",
+
    },
+
  ])("$description", (route: any) => {
+
    expect(routeToPath(route.input)).toEqual(route.output);
+
  });
+
});
+

+
describe("pathToRoute", () => {
+
  test.each([
+
    { input: "", output: null, description: "Empty 404 Route" },
+
    {
+
      input: "/foo/baz/bar",
+
      output: null,
+
      description: "Non existant 404 Route",
+
    },
+
    { input: "/", output: { resource: "home" }, description: "Home Route" },
+
    {
+
      input: "/vesting",
+
      output: { resource: "vesting" },
+
      description: "Vesting Route",
+
    },
+
    {
+
      input: "/faucet",
+
      output: { resource: "faucet", params: { view: { resource: "form" } } },
+
      description: "Faucet Form Route",
+
    },
+
    {
+
      input: "/faucet/withdraw?amount=10",
+
      output: {
+
        resource: "faucet",
+
        params: { view: { resource: "withdraw", params: { amount: "10" } } },
+
      },
+
      description: "Faucet Withdraw Route",
+
    },
+
    {
+
      input: "/cloudhead.eth",
+
      output: {
+
        resource: "profile",
+
        params: { addressOrName: "cloudhead.eth" },
+
      },
+
      description: "Profile Route",
+
    },
+
    {
+
      input: "/seeds/willow.radicle.garden",
+
      output: { resource: "seeds", params: { host: "willow.radicle.garden" } },
+
      description: "Seed View Route",
+
    },
+
    {
+
      input: "/registrations",
+
      output: {
+
        resource: "registrations",
+
        params: {
+
          view: { resource: "validateName" },
+
        },
+
      },
+
      description: "registrations Index Route",
+
    },
+
    {
+
      input: "/registrations/sebastinez",
+
      output: {
+
        resource: "registrations",
+
        params: {
+
          view: {
+
            resource: "view",
+
            params: { nameOrDomain: "sebastinez", retry: false },
+
          },
+
        },
+
      },
+
      description: "registrations View Route",
+
    },
+
    {
+
      input: "/registrations/sebastinez?retry=true",
+
      output: {
+
        resource: "registrations",
+
        params: {
+
          view: {
+
            resource: "view",
+
            params: { nameOrDomain: "sebastinez", retry: true },
+
          },
+
        },
+
      },
+
      description: "registrations View Route",
+
    },
+
    {
+
      input: "/registrations/sebastinez/checkNameAvailability",
+
      output: {
+
        resource: "registrations",
+
        params: {
+
          view: {
+
            resource: "checkNameAvailability",
+
            params: {
+
              nameOrDomain: "sebastinez",
+
              owner: null,
+
            },
+
          },
+
        },
+
      },
+
      description: "registrations Form Route",
+
    },
+
    {
+
      input: "/registrations/sebastinez/register",
+
      output: {
+
        resource: "registrations",
+
        params: {
+
          view: {
+
            resource: "register",
+
            params: { nameOrDomain: "sebastinez", owner: null },
+
          },
+
        },
+
      },
+
      description: "registrations Submit Route",
+
    },
+
    {
+
      input:
+
        "/seeds/willow.radicle.garden/rad:git:hnrkmg77m8tfzj4gi4pa4mbhgysfgzwntjpao",
+
      output: {
+
        resource: "projects",
+
        params: {
+
          view: { resource: "tree" },
+
          seed: "willow.radicle.garden",
+
          profile: undefined,
+
          peer: undefined,
+
          urn: "rad:git:hnrkmg77m8tfzj4gi4pa4mbhgysfgzwntjpao",
+
        },
+
      },
+
      description: "Seed Project Route",
+
    },
+
  ])("$description", (route: any) => {
+
    expect(testExports.pathToRoute(route.input)).toEqual(route.output);
+
  });
+
});
modified vite.config.ts
@@ -29,7 +29,7 @@ export default defineConfig({
    deps: {
      inline: ["@ethersproject/signing-key", "@ethersproject/basex"],
    },
-
    setupFiles: "./vitest/setupVitest",
+
    setupFiles: "./tests/support/setupVitest",
    environment: "happy-dom",
    include: ["tests/unit/**/*.test.ts"],
    reporters: "verbose",
deleted vitest/setupVitest.ts
@@ -1,9 +0,0 @@
-
// Found in https://github.com/belgattitude/nextjs-monorepo-example/pull/2913
-
// Hack for vitest 0.25.2 / happy-dom. Keep till those issues are fixed
-
// - https://github.com/vitest-dev/vitest/issues/2305#issuecomment-1311420462
-
// - https://github.com/capricorn86/happy-dom/issues/569
-

-
import { URL } from "node:url";
-
//@ts-expect-error The two types don't match, but for this hack we have to
-
//overwrite the given URL by happy-dom with the URL class passed by Node
-
globalThis.URL = URL;