42 lines · 1.5 KB
import { beforeEach, describe, expect, mock, test } from "bun:test";
import { fakeD1 } from "../metering/fake-d1.test-helper";

let d1 = fakeD1();
mock.module("cloudflare:workers", () => ({
  DurableObject: class {},
  env: {
    get DB() {
      return d1.binding;
    },
    PUBLIC_URL: "https://forge.test",
  },
  waitUntil: () => undefined,
}));
const { settleDeployment } = await import("./deployments");

function deployment(): { status: string; url: string | null; updated_at: number } {
  return d1.db.query("SELECT status, url, updated_at FROM deployments WHERE job_id = 'j1'").get() as never;
}

beforeEach(() => {
  d1 = fakeD1();
  d1.db.exec(`
    CREATE TABLE workflow_jobs (id TEXT PRIMARY KEY, outputs TEXT);
    CREATE TABLE deployments (job_id TEXT, status TEXT, url TEXT, updated_at INTEGER);
    INSERT INTO workflow_jobs VALUES ('j1', NULL);
    INSERT INTO deployments VALUES ('j1', 'in_progress', NULL, 0);
  `);
});

describe("settleDeployment under duplicate completions", () => {
  test("a repeat or late call with another conclusion leaves the settled deployment alone", async () => {
    await settleDeployment("j1", "cancelled");
    const settled = deployment();
    expect(settled.status).toBe("cancelled");
    d1.db.exec(`UPDATE workflow_jobs SET outputs = '{"__gitfor_environment_url":"https://late.example"}'`);
    await settleDeployment("j1", "success");
    await settleDeployment("j1", "cancelled");
    expect(deployment()).toEqual(settled);
  });