generated from nhcarrigan/template
fa906684c2
## Summary - **fix**: `show_thinking_blocks` setting now persists across sessions — it was defined on the TypeScript side but missing from the Rust `HikariConfig` struct, so serde silently dropped it on every save/load - **feat**: Tool calls are now rendered as collapsible blocks matching the Extended Thinking block aesthetic, replacing the old inline dropdown approach - **feat**: Add configurable max output tokens setting - **feat**: Use random creative names for conversation tabs - **test**: Significantly expanded frontend unit test coverage - **docs**: Require tests for all changes in CLAUDE.md - **feat**: Allow users to specify a custom terminal font (Closes #176) - **feat**: Display friendly names for memory files derived from the first heading (Closes #177) - **feat**: Add custom UI font support for the app chrome (buttons, labels, tabs) - **fix**: Apply custom UI font to the full app interface — `.app-container` was hardcoded, blocking inheritance from `body`; also renamed "Custom Font" to "Custom Terminal Font" for clarity ✨ This PR was created with help from Hikari~ 🌸 Reviewed-on: #175 Co-authored-by: Hikari <hikari@nhcarrigan.com> Co-committed-by: Hikari <hikari@nhcarrigan.com>
59 lines
2.0 KiB
TypeScript
59 lines
2.0 KiB
TypeScript
import { describe, it, expect, vi, beforeEach, afterEach } from "vitest";
|
|
import { testAllNotifications } from "./testNotifications";
|
|
|
|
vi.mock("./notificationManager", () => ({
|
|
notificationManager: {
|
|
notifySuccess: vi.fn().mockResolvedValue(undefined),
|
|
notifyError: vi.fn().mockResolvedValue(undefined),
|
|
notifyPermission: vi.fn().mockResolvedValue(undefined),
|
|
notifyConnection: vi.fn().mockResolvedValue(undefined),
|
|
notifyTaskStart: vi.fn().mockResolvedValue(undefined),
|
|
},
|
|
}));
|
|
|
|
describe("testNotifications", () => {
|
|
describe("window assignment", () => {
|
|
it("assigns testAllNotifications to window.testNotifications", async () => {
|
|
// The module-level if block runs on import — reimport to ensure it ran
|
|
await import("./testNotifications");
|
|
|
|
expect((window as unknown as { testNotifications: unknown }).testNotifications).toBe(
|
|
testAllNotifications
|
|
);
|
|
});
|
|
});
|
|
|
|
describe("testAllNotifications", () => {
|
|
beforeEach(() => {
|
|
vi.useFakeTimers();
|
|
});
|
|
|
|
afterEach(() => {
|
|
vi.useRealTimers();
|
|
});
|
|
|
|
it("is an async function", () => {
|
|
expect(typeof testAllNotifications).toBe("function");
|
|
});
|
|
|
|
it("schedules all five notification type calls", async () => {
|
|
const { notificationManager } = await import("./notificationManager");
|
|
|
|
const consoleLogSpy = vi.spyOn(console, "log").mockImplementation(() => {});
|
|
|
|
await testAllNotifications();
|
|
await vi.runAllTimersAsync();
|
|
|
|
expect(notificationManager.notifySuccess).toHaveBeenCalledWith("Test task completed!");
|
|
expect(notificationManager.notifyError).toHaveBeenCalledWith("Test error occurred!");
|
|
expect(notificationManager.notifyPermission).toHaveBeenCalledWith("Test permission request!");
|
|
expect(notificationManager.notifyConnection).toHaveBeenCalledWith(
|
|
"Test connection established!"
|
|
);
|
|
expect(notificationManager.notifyTaskStart).toHaveBeenCalledWith("Test task starting!");
|
|
|
|
consoleLogSpy.mockRestore();
|
|
});
|
|
});
|
|
});
|