Files
agent-desktop/console/src/hooks/useAppMessage.test.ts
T
Pine 9b30f681c6 feat: 智能体控制台前端(console)
- React+antd+zustand,注册表驱动路由/菜单/权限
- Tauri 桌面壳、后端托管 SPA、跨标签页消息队列
2026-08-23 22:43:18 +08:00

84 lines
2.4 KiB
TypeScript

import { describe, it, expect, vi, beforeEach } from "vitest";
import { renderHook } from "@testing-library/react";
// Ant Design's App.useApp reads from context. We mock the module so we can
// assert that useAppMessage forwards message/modal/notification unchanged.
vi.mock("antd", () => {
const App = {
useApp: vi.fn(),
};
return { App };
});
import { App } from "antd";
import { useAppMessage } from "./useAppMessage";
describe("useAppMessage", () => {
beforeEach(() => {
vi.clearAllMocks();
});
it("returns the message instance from App.useApp", () => {
const message = { success: vi.fn(), error: vi.fn() };
const modal = { confirm: vi.fn() };
const notification = { open: vi.fn() };
(App.useApp as ReturnType<typeof vi.fn>).mockReturnValue({
message,
modal,
notification,
});
const { result } = renderHook(() => useAppMessage());
expect(result.current.message).toBe(message);
});
it("returns the modal instance from App.useApp", () => {
const modal = { confirm: vi.fn() };
(App.useApp as ReturnType<typeof vi.fn>).mockReturnValue({
message: {},
modal,
notification: {},
});
const { result } = renderHook(() => useAppMessage());
expect(result.current.modal).toBe(modal);
});
it("returns the notification instance from App.useApp", () => {
const notification = { open: vi.fn() };
(App.useApp as ReturnType<typeof vi.fn>).mockReturnValue({
message: {},
modal: {},
notification,
});
const { result } = renderHook(() => useAppMessage());
expect(result.current.notification).toBe(notification);
});
it("calls App.useApp exactly once per render", () => {
(App.useApp as ReturnType<typeof vi.fn>).mockReturnValue({
message: {},
modal: {},
notification: {},
});
renderHook(() => useAppMessage());
expect(App.useApp).toHaveBeenCalledTimes(1);
});
it("returns fresh instances on re-render", () => {
const first = { message: { a: 1 }, modal: {}, notification: {} };
const second = { message: { b: 2 }, modal: {}, notification: {} };
(App.useApp as ReturnType<typeof vi.fn>)
.mockReturnValueOnce(first)
.mockReturnValueOnce(second);
const { result, rerender } = renderHook(() => useAppMessage());
expect(result.current.message).toBe(first.message);
rerender();
expect(result.current.message).toBe(second.message);
});
});