generated from nhcarrigan/template
test: add coverage for messageMode, stateMapper branches, and initStatsListener
This commit is contained in:
@@ -19,7 +19,6 @@
|
||||
* - [ ] Search query filters by content, language, and source
|
||||
*/
|
||||
|
||||
/* eslint-disable max-lines-per-function -- Test suites naturally have many cases */
|
||||
import { describe, it, expect, vi, beforeEach, afterEach } from "vitest";
|
||||
|
||||
// Mirror: detectLanguage from clipboard.ts
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
import { describe, it, expect, beforeEach, vi } from "vitest";
|
||||
import { describe, it, expect, beforeEach, afterEach, vi } from "vitest";
|
||||
import { get } from "svelte/store";
|
||||
import { listen } from "@tauri-apps/api/event";
|
||||
import { invoke } from "@tauri-apps/api/core";
|
||||
import {
|
||||
stats,
|
||||
formattedStats,
|
||||
@@ -13,6 +15,7 @@ import {
|
||||
getBudgetStatusMessage,
|
||||
getRemainingTokenBudget,
|
||||
getRemainingCostBudget,
|
||||
initStatsListener,
|
||||
} from "./stats";
|
||||
import type { UsageStats, ToolTokenStats, BudgetStatus } from "./stats";
|
||||
|
||||
@@ -34,6 +37,12 @@ vi.mock("@tauri-apps/api/core", () => ({
|
||||
invoke: vi.fn(),
|
||||
}));
|
||||
|
||||
vi.mock("./costTracking", () => ({
|
||||
costTrackingStore: {
|
||||
refresh: vi.fn().mockResolvedValue([]),
|
||||
},
|
||||
}));
|
||||
|
||||
describe("stats store", () => {
|
||||
beforeEach(() => {
|
||||
// Reset stats to default before each test
|
||||
@@ -801,4 +810,85 @@ describe("stats store", () => {
|
||||
expect(getRemainingCostBudget(baseStats, 0.2)).toBe(0);
|
||||
});
|
||||
});
|
||||
|
||||
describe("initStatsListener", () => {
|
||||
const emptyStats: UsageStats = {
|
||||
total_input_tokens: 0,
|
||||
total_output_tokens: 0,
|
||||
total_cost_usd: 0,
|
||||
session_input_tokens: 0,
|
||||
session_output_tokens: 0,
|
||||
session_cost_usd: 0,
|
||||
model: null,
|
||||
messages_exchanged: 0,
|
||||
session_messages_exchanged: 0,
|
||||
code_blocks_generated: 0,
|
||||
session_code_blocks_generated: 0,
|
||||
files_edited: 0,
|
||||
session_files_edited: 0,
|
||||
files_created: 0,
|
||||
session_files_created: 0,
|
||||
tools_usage: {},
|
||||
session_tools_usage: {},
|
||||
session_duration_seconds: 0,
|
||||
context_tokens_used: 0,
|
||||
context_window_limit: 200000,
|
||||
context_utilisation_percent: 0,
|
||||
potential_cache_hits: 0,
|
||||
potential_cache_savings_tokens: 0,
|
||||
};
|
||||
|
||||
afterEach(() => {
|
||||
vi.resetAllMocks();
|
||||
});
|
||||
|
||||
it("registers a listener for the claude:stats event", async () => {
|
||||
vi.mocked(listen).mockResolvedValue(vi.fn());
|
||||
vi.mocked(invoke).mockResolvedValue(emptyStats);
|
||||
|
||||
await initStatsListener();
|
||||
|
||||
expect(listen).toHaveBeenCalledWith("claude:stats", expect.any(Function));
|
||||
});
|
||||
|
||||
it("updates the stats store when the listener callback fires", async () => {
|
||||
let capturedCallback: ((event: unknown) => void) | undefined;
|
||||
vi.mocked(listen).mockImplementation(async (_event, callback) => {
|
||||
capturedCallback = callback as (event: unknown) => void;
|
||||
return () => {};
|
||||
});
|
||||
vi.mocked(invoke).mockResolvedValue(emptyStats);
|
||||
|
||||
await initStatsListener();
|
||||
|
||||
const newStats = { ...emptyStats, total_input_tokens: 9999 };
|
||||
capturedCallback!({ payload: { stats: newStats } });
|
||||
|
||||
expect(get(stats).total_input_tokens).toBe(9999);
|
||||
});
|
||||
|
||||
it("loads persisted stats from the backend on initialisation", async () => {
|
||||
const persistedStats = { ...emptyStats, total_input_tokens: 5000 };
|
||||
vi.mocked(listen).mockResolvedValue(vi.fn());
|
||||
vi.mocked(invoke).mockResolvedValue(persistedStats);
|
||||
|
||||
await initStatsListener();
|
||||
|
||||
expect(invoke).toHaveBeenCalledWith("get_persisted_stats");
|
||||
expect(get(stats).total_input_tokens).toBe(5000);
|
||||
});
|
||||
|
||||
it("handles a failed invoke gracefully and logs the error", async () => {
|
||||
const error = new Error("Failed to get stats");
|
||||
vi.mocked(listen).mockResolvedValue(vi.fn());
|
||||
vi.mocked(invoke).mockRejectedValue(error);
|
||||
|
||||
const consoleErrorSpy = vi.spyOn(console, "error").mockImplementation(() => {});
|
||||
|
||||
await initStatsListener();
|
||||
|
||||
expect(consoleErrorSpy).toHaveBeenCalledWith("Failed to load initial stats:", error);
|
||||
consoleErrorSpy.mockRestore();
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user