109 lines · 4.0 KB
import { beforeEach, describe, expect, mock, test } from "bun:test";
import type { RepoRow, Viewer } from "~/lib/types";

type Handler = (input: { data: Record<string, unknown>; context: { viewer: Viewer } }) => Promise<unknown>;
type Builder = { middleware: () => Builder; validator: () => Builder; handler: (fn: Handler) => Handler };

function builder(): Builder {
  const self: Builder = { middleware: () => self, validator: () => self, handler: (fn) => fn };
  return self;
}

class StubEntrypoint {}
mock.module("cloudflare:workers", () => ({
  env: { PUBLIC_URL: "https://forge.example.com" },
  waitUntil: () => undefined,
  WorkflowEntrypoint: StubEntrypoint,
  DurableObject: StubEntrypoint,
  WorkerEntrypoint: StubEntrypoint,
}));
mock.module("@tanstack/react-start", () => ({ createServerFn: () => builder(), createMiddleware: () => builder() }));
mock.module("./middleware", () => ({ viewerMiddleware: {}, requireViewer: (viewer: Viewer) => viewer }));

const repo = { id: "repo-1", owner_id: "u-owner", owner_name: "owner", name: "app", is_archived: 1 } as RepoRow;
const actualRepos = await import("~/server/repos");
mock.module("~/server/repos", () => ({
  ...actualRepos,
  requireRepoAccess: async () => ({ repo, permission: "admin" }),
}));
const actualLimits = await import("~/server/limits");
mock.module("~/server/limits", () => ({
  ...actualLimits,
  limitWrite: async () => undefined,
  limitAccountWrite: async () => undefined,
}));

const calls: string[] = [];
const actualTokenWrite = await import("~/server/token-write");
mock.module("~/server/token-write", () => ({
  ...actualTokenWrite,
  createDeployToken: async () => {