Skip to content
File

Blob: test/receive-adv.worker.test.ts

typescript65 lines
1import { it, expect } from "vitest";
2import { env, exports as workerExports } from "cloudflare:workers";
3import { uniqueRepoId } from "./util/test-helpers";
4import { setupRepoForTests } from "./util/repoSeed";
5import { seedPackFirstRepo } from "./util/pack-first";
6import { decodePktLinePayloads } from "./util/fetch-protocol";
7 
8it("advertises streaming receive-pack capabilities including side-band-64k", async () => {
9 const owner = "o";
10 const repo = uniqueRepoId("r-recv-adv");
11 const seeded = await setupRepoForTests(env, owner, repo);
12 const repoId = `${owner}/${repo}`;
13 
14 await seedPackFirstRepo(repoId);
15 
16 const url = new URL(`https://example.com/${owner}/${repo}/info/refs`);
17 url.searchParams.set("service", "git-receive-pack");
18 
19 const res = await workerExports.default.fetch(
20 new Request(url, {
21 method: "GET",
22 headers: { Authorization: seeded.pushAuthHeader },
23 })
24 );
25 expect(res.status).toBe(200);
26 expect(res.headers.get("Content-Type")).toContain("git-receive-pack-advertisement");
27 
28 const bytes = new Uint8Array(await res.arrayBuffer());
29 const lines = decodePktLinePayloads(bytes);
30 
31 // First line should be the prelude
32 expect(lines[0]).toBe("# service=git-receive-pack\n");
33 
34 // Capabilities are on the first ref line after the flush
35 const capsLine = lines.find((l) => l.includes("\0")) || "";
36 expect(capsLine).toContain("atomic");
37 expect(capsLine).toContain("report-status");
38 expect(capsLine).toContain("ofs-delta");
39 expect(capsLine).toContain("agent=git-on-cloudflare/0.1");
40 // Streaming capabilities are always advertised
41 expect(capsLine).toContain("side-band-64k");
42 expect(capsLine).toContain("quiet");
43});
44 
45it("advertises receive-pack over .git info/refs", async () => {
46 const owner = "o";
47 const repo = uniqueRepoId("r-recv-adv-dotgit");
48 const seeded = await setupRepoForTests(env, owner, repo);
49 const repoId = `${owner}/${repo}`;
50 
51 await seedPackFirstRepo(repoId);
52 
53 const url = new URL(`https://example.com/${owner}/${repo}.git/info/refs`);
54 url.searchParams.set("service", "git-receive-pack");
55 
56 const res = await workerExports.default.fetch(
57 new Request(url, {
58 method: "GET",
59 headers: { Authorization: seeded.pushAuthHeader },
60 })
61 );
62 expect(res.status).toBe(200);
63 expect(res.headers.get("Content-Type")).toContain("git-receive-pack-advertisement");
64});