← back to Kickbacks Ai Upstream

test/reloadSignal.test.ts

42 lines

import { describe, it, expect } from "vitest";
import { join } from "node:path";
import { homedir } from "node:os";
import { reloadSentinelPath, parseSentinel, decideReload } from "../src/reloadSignal";

describe("reloadSignal", () => {
  it("sentinel path is ~/.vibe-ads/reload", () => {
    expect(reloadSentinelPath()).toBe(join(homedir(), ".vibe-ads", "reload"));
  });

  it("parses a valid payload", () => {
    expect(parseSentinel('{"version":"0.3.7","ts":"2026-05-17T00:00:00Z"}'))
      .toEqual({ version: "0.3.7", ts: "2026-05-17T00:00:00Z" });
  });

  it("returns null for corrupt / half-written / missing-version input", () => {
    expect(parseSentinel("{not json")).toBeNull();
    expect(parseSentinel("")).toBeNull();
    expect(parseSentinel('{"ts":"x"}')).toBeNull();
  });

  it("decideReload: newer mtime + differing version + debug -> reload-now", () => {
    expect(decideReload({ mtimeMs: 200, armedAt: 100, sentinelVersion: "0.3.7",
      runningVersion: "0.3.6", debug: true })).toBe("reload-now");
  });

  it("decideReload: newer mtime + differing version + non-debug -> nudge", () => {
    expect(decideReload({ mtimeMs: 200, armedAt: 100, sentinelVersion: "0.3.7",
      runningVersion: "0.3.6", debug: false })).toBe("nudge");
  });

  it("decideReload: stale mtime -> none", () => {
    expect(decideReload({ mtimeMs: 50, armedAt: 100, sentinelVersion: "0.3.7",
      runningVersion: "0.3.6", debug: false })).toBe("none");
  });

  it("decideReload: same version -> none (no-op deploy / re-activation)", () => {
    expect(decideReload({ mtimeMs: 200, armedAt: 100, sentinelVersion: "0.3.6",
      runningVersion: "0.3.6", debug: true })).toBe("none");
  });
});