import { afterEach, beforeEach, describe, expect, it } from "bun:test";
import * as os from "node:os";
import * as path from "node:path";
import { getAgentDir, setAgentDir, TempDir } from "@oh-my-pi/pi-utils";
import { getDashboardStats } from "../src/aggregator";
import { closeDb, initDb, insertMessageStats } from "../src/db";
import type { MessageStats } from "../src/types";
const originalConfigDir = process.env.PI_CONFIG_DIR;
const originalAgentDir = getAgentDir();
let tempDir: TempDir | null = null;
beforeEach(() => {
tempDir = TempDir.createSync("@pi-stats-db-range-");
const configDir = path.relative(os.homedir(), tempDir.join("config"));
process.env.PI_CONFIG_DIR = configDir;
setAgentDir(path.join(os.homedir(), configDir, "agent"));
});
afterEach(() => {
closeDb();
if (originalConfigDir === undefined) {
delete process.env.PI_CONFIG_DIR;
} else {
process.env.PI_CONFIG_DIR = originalConfigDir;
}
setAgentDir(originalAgentDir);
tempDir?.removeSync();
tempDir = null;
});
function makeMessage(timestamp: number, entryId: string): MessageStats {
return {
sessionFile: "/tmp/session.jsonl",
entryId,
folder: "/tmp/project",
model: "gpt-5.4",
provider: "openai-codex",
api: "openai-codex-responses",
timestamp,
duration: 1000,
ttft: 100,
stopReason: "stop",
errorMessage: null,
usage: {
input: 1000,
output: 500,
cacheRead: 200,
cacheWrite: 0,
totalTokens: 1700,
cost: {
input: 0,
output: 0,
cacheRead: 0,
cacheWrite: 0,
total: 0,
},
},
};
}
describe("getDashboardStats time range", () => {
it("filters dashboard stats by selected range", async () => {
await initDb();
const now = Date.now();
insertMessageStats([makeMessage(now, "within-24h"), makeMessage(now - 48 * 60 * 60 * 1000, "outside-24h")]);
const dayStats = await getDashboardStats("24h");
expect(dayStats.overall.totalRequests).toBe(1);
expect(dayStats.byModel[0]).toMatchObject({
totalRequests: 1,
model: "gpt-5.4",
provider: "openai-codex",
});
const weekStats = await getDashboardStats("7d");
expect(weekStats.overall.totalRequests).toBe(2);
expect(weekStats.byModel[0]).toMatchObject({ totalRequests: 2, model: "gpt-5.4", provider: "openai-codex" });
const allStats = await getDashboardStats("all");
expect(allStats.overall.totalRequests).toBe(2);
});
it("falls back to 24h for unknown range", async () => {
await initDb();
const now = Date.now();
insertMessageStats([makeMessage(now, "within-24h"), makeMessage(now - 48 * 60 * 60 * 1000, "outside-24h")]);
const stats = await getDashboardStats("last century");
expect(stats.overall.totalRequests).toBe(1);
});
});