OpenHands/frontend/__tests__/stores/use-event-store.test.ts
sp.wack ef49994700
feat(frontend): V1 WebSocket handler (#11221)
Co-authored-by: openhands <openhands@all-hands.dev>
2025-10-10 16:29:27 +04:00

131 lines
3.3 KiB
TypeScript

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",
output: "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([]);
});
});