branch: main
worker-smoke.spec.mjs
3887 bytesRaw
import { afterAll, beforeAll, describe, expect, test } from "vitest";
import { createTestServer, ownerHeaders, uniqueId } from "./helpers/mf.mjs";

let server;

beforeAll(async () => {
  server = await createTestServer();
});

afterAll(async () => {
  await server.mf.dispose();
});

describe("ripgit core worker", () => {
  test("returns health JSON at root", async () => {
    const response = await server.dispatch("/");

    expect(response.status).toBe(200);
    expect(response.headers.get("content-type")).toContain("application/json");
    await expect(response.json()).resolves.toMatchObject({
      name: "ripgit",
      version: "0.1.0",
    });
  });

  test("serves owner profile markdown when format query overrides Accept", async () => {
    const owner = uniqueId("owner");
    const response = await server.dispatch(`/${owner}/?format=md`, {
      headers: { Accept: "text/html" },
    });

    expect(response.status).toBe(200);
    expect(response.headers.get("content-type")).toBe("text/markdown; charset=utf-8");
    expect(response.headers.get("vary")).toBeNull();

    const body = await response.text();
    expect(body).toContain(`# ${owner}`);
    expect(body).toContain("Repositories: `0`");
  });

  test("serves owner profile as plain text via Accept and adds Vary", async () => {
    const owner = uniqueId("owner");
    const response = await server.dispatch(`/${owner}/`, {
      headers: { Accept: "text/plain" },
    });

    expect(response.status).toBe(200);
    expect(response.headers.get("content-type")).toBe("text/plain; charset=utf-8");
    expect(response.headers.get("vary")).toBe("Accept");

    const body = await response.text();
    expect(body).toContain(`# ${owner}`);
    expect(body).toContain("No public repositories.");
  });

  test("rejects unsupported owner profile formats", async () => {
    const owner = uniqueId("owner");
    const response = await server.dispatch(`/${owner}/?format=json`);

    expect(response.status).toBe(406);
    expect(await response.text()).toContain("Requested format 'json' is not available here.");
  });

  test("serves empty repository markdown for the repo owner", async () => {
    const owner = uniqueId("owner");
    const repo = uniqueId("repo");
    const response = await server.dispatch(`/${owner}/${repo}/?format=md`, {
      headers: ownerHeaders(owner),
    });

    expect(response.status).toBe(200);
    expect(response.headers.get("content-type")).toBe("text/markdown; charset=utf-8");

    const body = await response.text();
    expect(body).toContain(`# ${owner}/${repo}`);
    expect(body).toContain("Repository is empty.");
    expect(body).toContain("git remote add origin");
    expect(body).toContain("git push origin main");
  });

  test("requires the repo owner for settings", async () => {
    const owner = uniqueId("owner");
    const repo = uniqueId("repo");
    const response = await server.dispatch(`/${owner}/${repo}/settings`);

    expect(response.status).toBe(401);
    expect(response.headers.get("www-authenticate")).toBe('Basic realm="ripgit"');
    expect(await response.text()).toContain("Unauthorized: sign in to push");
  });

  test("serves owner-only settings in plain text when authorized", async () => {
    const owner = uniqueId("owner");
    const repo = uniqueId("repo");
    const response = await server.dispatch(`/${owner}/${repo}/settings`, {
      headers: ownerHeaders(owner, { Accept: "text/plain" }),
    });

    expect(response.status).toBe(200);
    expect(response.headers.get("content-type")).toBe("text/plain; charset=utf-8");
    expect(response.headers.get("vary")).toBe("Accept");

    const body = await response.text();
    expect(body).toContain(`# ${owner}/${repo} settings`);
    expect(body).toContain("Owner-only repository maintenance page.");
    expect(body).toContain("Default branch: `refs/heads/main`");
  });
});