import { Effect } from "effect"; import { describe, expect, it } from "vitest"; import { createBranch, createIssue, createPullRequest, getIssue, listIssues, } from "./git-remote-runtime"; import type { GitRemoteConfig, GitRemoteTransport } from "./git-remote-runtime"; const config: GitRemoteConfig = { baseUrl: "https://git.example.com", owner: "puter", repo: "zopu-code", token: "secret", }; const stubTransport = ( responder: (method: string, path: string, body: unknown) => unknown, status = 200 ): GitRemoteTransport => ({ request: ({ body, method, url }) => Effect.sync(() => { const path = url.replace( `${config.baseUrl}/api/v1/repos/puter/zopu-code`, "" ); const result = responder(method, path, body); return { json: () => Promise.resolve(result), status, }; }), }); const run = (eff: Effect.Effect) => Effect.runPromise(eff); describe("GitRemoteRuntime", () => { it("creates an issue and maps Gitea fields", async () => { const transport = stubTransport(() => ({ body: "the body", html_url: "https://git.example.com/puter/zopu-code/issues/1", number: 1, state: "open", title: "Add status control", })); const issue = await run( createIssue(transport, config, { body: "the body", title: "Add status control", }) ); expect(issue.number).toBe(1); expect(issue.url).toContain("/issues/1"); }); it("maps 401 to Unauthorized", async () => { const transport = stubTransport(() => ({}), 401); await expect(run(listIssues(transport, config))).rejects.toMatchObject({ reason: "Unauthorized", }); }); it("maps 404 to NotFound", async () => { const transport = stubTransport(() => ({}), 404); await expect(run(getIssue(transport, config, 7))).rejects.toMatchObject({ reason: "NotFound", }); }); it("creates a branch", async () => { const transport = stubTransport((_m, _p, body) => ({ name: (body as { new_branch_name: string }).new_branch_name, })); const branch = await run( createBranch(transport, config, { name: "work/1/fix" }) ); expect(branch.name).toBe("work/1/fix"); }); it("creates a pull request and reads nested ref fields", async () => { const transport = stubTransport(() => ({ base: { ref: "main" }, head: { ref: "work/1/fix" }, html_url: "https://git.example.com/puter/zopu-code/pulls/2", number: 2, state: "open", title: "Fix thing", })); const pr = await run( createPullRequest(transport, config, { baseBranch: "main", body: "", branch: "work/1/fix", title: "Fix thing", }) ); expect(pr.number).toBe(2); expect(pr.branch).toBe("work/1/fix"); expect(pr.baseBranch).toBe("main"); }); it("maps merged PR state", async () => { const transport = stubTransport(() => ({ base: { ref: "main" }, head: { ref: "work/1/fix" }, merged: true, number: 2, state: "closed", title: "x", })); const pr = await run( createPullRequest(transport, config, { baseBranch: "main", body: "", branch: "work/1/fix", title: "x", }) ); expect(pr.state).toBe("merged"); }); });