198 lines · 6.7 KB
import { beforeEach, describe, expect, mock, test } from "bun:test";
import { fakeD1 } from "../metering/fake-d1.test-helper";
import { scopedTestState } from "./scoped.test-helper";
import type { SiteDeployRequest } from "./deploy";

let d1 = fakeD1();
const scoped = scopedTestState();
scoped.install();
const r1 = () => scoped.repo("r1");
const kv = new Map<string, string>();
const fakeEnv: Record<string, unknown> = {
  get DB() {
    return d1.binding;
  },
  KV: {
    get: async (key: string, type?: string) => {
      const value = kv.get(key) ?? null;
      return value !== null && type === "json" ? JSON.parse(value) : value;
    },
    put: async (key: string, value: string) => void kv.set(key, value),
    delete: async (key: string) => void kv.delete(key),
  },
  SITES_DOMAIN: "sites.test",
  PUBLIC_URL: "https://forge.test",
};
mock.module("cloudflare:workers", () => ({ DurableObject: class {}, env: fakeEnv, waitUntil: () => undefined }));

const deploys: SiteDeployRequest[] = [];
let site: Record<string, unknown> = {};
const actualDeploy = await import("./deploy");
mock.module("./deploy", () => ({
  ...actualDeploy,
  loadSiteForRepo: async () => site,
  createSiteDeployment: async (input: SiteDeployRequest) => {
    deploys.push(input);
    const id = `d${deploys.length}`;
    scoped.insert("r1", "site_deployments", {
      id,
      site_id: input.site.id,
      label: input.label,