← back to Kickbacks Ai Upstream

test/modes.test.ts

72 lines

import { describe, it, expect, beforeEach, afterEach } from "vitest";
import { mkdtempSync, rmSync, writeFileSync, mkdirSync, existsSync } from "node:fs";
import { tmpdir } from "node:os";
import { join } from "node:path";

const REAL_HOME = process.env.HOME;
const REAL_UP = process.env.USERPROFILE;
let dir: string;
let vd: string;

async function fresh() {
  const m = await import("../src/modes");
  return m;
}

beforeEach(() => {
  dir = mkdtempSync(join(tmpdir(), "vibe-modes-"));
  process.env.HOME = dir;
  process.env.USERPROFILE = dir;
  vd = join(dir, ".vibe-ads");
  mkdirSync(vd, { recursive: true });
});

afterEach(() => {
  if (REAL_HOME !== undefined) process.env.HOME = REAL_HOME; else delete process.env.HOME;
  if (REAL_UP !== undefined) process.env.USERPROFILE = REAL_UP; else delete process.env.USERPROFILE;
  rmSync(dir, { recursive: true, force: true });
});

describe("modes", () => {
  it("defaults: webview on, cli on, banner server", async () => {
    const m = await fresh();
    expect(m.webviewMode()).toBe("on");
    expect(m.cliMode()).toBe("on");
    expect(m.bannerOverride()).toBe("server");
  });

  it("webview.off / cli.off sentinels force off; round-trips via setters", async () => {
    const m = await fresh();
    m.setWebviewMode(false);
    m.setCliMode(false);
    expect(existsSync(join(vd, "webview.off"))).toBe(true);
    expect(m.webviewMode()).toBe("off");
    expect(m.cliMode()).toBe("off");
    m.setWebviewMode(true);
    expect(existsSync(join(vd, "webview.off"))).toBe(false);
    expect(m.webviewMode()).toBe("on");
  });

  it("banner.mode reads on/off; invalid -> server; setter writes/removes", async () => {
    const m = await fresh();
    writeFileSync(join(vd, "banner.mode"), " on \n");
    expect(m.bannerOverride()).toBe("on");
    writeFileSync(join(vd, "banner.mode"), "garbage");
    expect(m.bannerOverride()).toBe("server");
    m.setBannerOverride("off");
    expect(m.bannerOverride()).toBe("off");
    m.setBannerOverride("server");
    expect(existsSync(join(vd, "banner.mode"))).toBe(false);
    expect(m.bannerOverride()).toBe("server");
  });

  it("never throws on fs errors (returns safe defaults)", async () => {
    const m = await fresh();
    process.env.HOME = "\0invalid";
    process.env.USERPROFILE = "\0invalid";
    expect(() => m.webviewMode()).not.toThrow();
    expect(m.webviewMode()).toBe("on");
    expect(m.bannerOverride()).toBe("server");
  });
});