import { act, renderHook } from "@testing-library/react"; import { describe, expect, it } from "vitest"; import { useEventStore } from "#/stores/use-event-store"; import { ActionEvent, MessageEvent, ObservationEvent, SecurityRisk, } from "#/types/v1/core"; const mockUserMessageEvent: MessageEvent = { id: "test-event-1", timestamp: Date.now().toString(), source: "user", llm_message: { role: "user", content: [{ type: "text", text: "Hello, world!" }], }, activated_microagents: [], extended_content: [], }; const mockActionEvent: ActionEvent = { id: "test-action-1", timestamp: Date.now().toString(), source: "agent", thought: [{ type: "text", text: "I need to execute a bash command" }], thinking_blocks: [], action: { kind: "ExecuteBashAction", command: "echo hello", is_input: false, timeout: null, reset: false, }, tool_name: "execute_bash", tool_call_id: "call_123", tool_call: { id: "call_123", type: "function", function: { name: "execute_bash", arguments: '{"command": "echo hello"}', }, }, llm_response_id: "response_123", security_risk: SecurityRisk.UNKNOWN, }; const mockObservationEvent: ObservationEvent = { id: "test-observation-1", timestamp: Date.now().toString(), source: "environment", tool_name: "execute_bash", tool_call_id: "call_123", observation: { kind: "ExecuteBashObservation", content: [{ type: "text", text: "hello\n" }], command: "echo hello", exit_code: 0, error: false, timeout: false, metadata: { exit_code: 0, pid: 12345, username: "user", hostname: "localhost", working_dir: "/home/user", py_interpreter_path: null, prefix: "", suffix: "", }, }, action_id: "test-action-1", }; describe("useEventStore", () => { it("should render initial state correctly", () => { const { result } = renderHook(() => useEventStore()); expect(result.current.events).toEqual([]); }); it("should add an event to the store", () => { const { result } = renderHook(() => useEventStore()); act(() => { result.current.addEvent(mockUserMessageEvent); }); expect(result.current.events).toEqual([mockUserMessageEvent]); }); it("should retrieve events whose actions are replaced by their observations", () => { const { result } = renderHook(() => useEventStore()); act(() => { result.current.addEvent(mockUserMessageEvent); result.current.addEvent(mockActionEvent); result.current.addEvent(mockObservationEvent); }); expect(result.current.uiEvents).toEqual([ mockUserMessageEvent, mockObservationEvent, ]); }); it("should clear all events when clearEvents is called", () => { const { result } = renderHook(() => useEventStore()); // Add some events first act(() => { result.current.addEvent(mockUserMessageEvent); result.current.addEvent(mockActionEvent); }); // Verify events were added expect(result.current.events).toHaveLength(2); expect(result.current.uiEvents).toHaveLength(2); // Clear events act(() => { result.current.clearEvents(); }); // Verify events were cleared expect(result.current.events).toEqual([]); expect(result.current.uiEvents).toEqual([]); }); });