93 lines
2.7 KiB
TypeScript
93 lines
2.7 KiB
TypeScript
import { afterEach, beforeEach, describe, expect, it } from 'vitest';
|
|
|
|
import { useChatStore } from '@/lib/store';
|
|
|
|
describe('chat store process event ingestion', () => {
|
|
beforeEach(() => {
|
|
useChatStore.setState({
|
|
sessionId: 'web:alpha',
|
|
inputDrafts: {},
|
|
processRuns: [],
|
|
processEvents: [],
|
|
processArtifacts: [],
|
|
selectedRunId: null,
|
|
selectedArtifactId: null,
|
|
lastCancelAck: null,
|
|
});
|
|
});
|
|
|
|
afterEach(() => {
|
|
useChatStore.setState({
|
|
sessionId: 'web:default',
|
|
inputDrafts: {},
|
|
processRuns: [],
|
|
processEvents: [],
|
|
processArtifacts: [],
|
|
selectedRunId: null,
|
|
selectedArtifactId: null,
|
|
lastCancelAck: null,
|
|
});
|
|
});
|
|
|
|
it('assigns session_id when the first observed event is progress', () => {
|
|
useChatStore.getState().ingestProcessEvent({
|
|
type: 'process_run_progress',
|
|
session_id: 'web:alpha',
|
|
run_id: 'run-progress-only',
|
|
parent_run_id: null,
|
|
actor_type: 'agent',
|
|
actor_id: 'agent-a',
|
|
actor_name: 'Agent A',
|
|
text: 'still working',
|
|
created_at: '2026-03-24T11:20:00.000Z',
|
|
});
|
|
|
|
expect(useChatStore.getState().processRuns).toEqual([
|
|
expect.objectContaining({
|
|
run_id: 'run-progress-only',
|
|
session_id: 'web:alpha',
|
|
status: 'running',
|
|
title: 'Agent A',
|
|
}),
|
|
]);
|
|
});
|
|
|
|
it('stores input drafts per session', () => {
|
|
useChatStore.getState().setInputDraft('web:alpha', 'message for alpha');
|
|
useChatStore.getState().setInputDraft('web:beta', 'message for beta');
|
|
|
|
expect(useChatStore.getState().getInputDraft('web:alpha')).toBe('message for alpha');
|
|
expect(useChatStore.getState().getInputDraft('web:beta')).toBe('message for beta');
|
|
|
|
useChatStore.getState().clearInputDraft('web:alpha');
|
|
|
|
expect(useChatStore.getState().getInputDraft('web:alpha')).toBe('');
|
|
expect(useChatStore.getState().getInputDraft('web:beta')).toBe('message for beta');
|
|
});
|
|
|
|
it('keeps live task events after persisted session projection is merged', () => {
|
|
const store = useChatStore.getState();
|
|
store.setSessionId('web:default');
|
|
store.ingestProcessEvent({
|
|
type: 'process_run_progress',
|
|
session_id: 'web:default',
|
|
run_id: 'run-live',
|
|
parent_run_id: null,
|
|
actor_type: 'agent',
|
|
actor_id: 'main-agent',
|
|
actor_name: 'Main Agent',
|
|
text: '正在调用工具',
|
|
metadata: { task_id: 'task-live', timeline_type: 'tool_call' },
|
|
created_at: '2026-05-26T10:00:00.000Z',
|
|
});
|
|
|
|
store.setSessionProcess('web:default', {
|
|
runs: [],
|
|
events: [],
|
|
artifacts: [],
|
|
});
|
|
|
|
expect(useChatStore.getState().processEvents.some((event) => event.run_id === 'run-live')).toBe(true);
|
|
});
|
|
});
|