Files
clawdbot/src/commands/sessions.test.ts
2025-12-17 11:29:04 +01:00

100 lines
2.4 KiB
TypeScript

import fs from "node:fs";
import os from "node:os";
import path from "node:path";
import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
// Disable colors for deterministic snapshots.
process.env.FORCE_COLOR = "0";
vi.mock("../config/config.js", () => ({
loadConfig: () => ({
inbound: {
agent: { model: "pi:opus", contextTokens: 32000 },
},
}),
}));
import { sessionsCommand } from "./sessions.js";
const makeRuntime = () => {
const logs: string[] = [];
return {
runtime: {
log: (msg: unknown) => logs.push(String(msg)),
error: (msg: unknown) => {
throw new Error(String(msg));
},
exit: (code: number) => {
throw new Error(`exit ${code}`);
},
},
logs,
} as const;
};
const writeStore = (data: unknown) => {
const file = path.join(
os.tmpdir(),
`sessions-${Date.now()}-${Math.random().toString(16).slice(2)}.json`,
);
fs.writeFileSync(file, JSON.stringify(data, null, 2));
return file;
};
describe("sessionsCommand", () => {
beforeEach(() => {
vi.useFakeTimers();
vi.setSystemTime(new Date("2025-12-06T00:00:00Z"));
});
afterEach(() => {
vi.useRealTimers();
});
it("renders a tabular view with token percentages", async () => {
const store = writeStore({
"+15555550123": {
sessionId: "abc123",
updatedAt: Date.now() - 45 * 60_000,
inputTokens: 1200,
outputTokens: 800,
model: "pi:opus",
},
});
const { runtime, logs } = makeRuntime();
await sessionsCommand({ store }, runtime);
fs.rmSync(store);
const tableHeader = logs.find((line) => line.includes("Tokens (ctx %"));
expect(tableHeader).toBeTruthy();
const row = logs.find((line) => line.includes("+15555550123")) ?? "";
expect(row).toContain("2.0k/32k (6%)");
expect(row).toContain("45m ago");
expect(row).toContain("pi:opus");
});
it("shows placeholder rows when tokens are missing", async () => {
const store = writeStore({
"group:demo": {
sessionId: "xyz",
updatedAt: Date.now() - 5 * 60_000,
thinkingLevel: "high",
},
});
const { runtime, logs } = makeRuntime();
await sessionsCommand({ store }, runtime);
fs.rmSync(store);
const row = logs.find((line) => line.includes("group:demo")) ?? "";
expect(row).toContain("-".padEnd(20));
expect(row).toContain("think:high");
expect(row).toContain("5m ago");
});
});