Files
makelore/tests/unit/teacher-cloud-activity.test.ts

39 lines
2.4 KiB
TypeScript

// @vitest-environment node
import { describe, expect, it } from 'vitest';
import { cloudToolActivity } from '../../electron/coding-teacher/cloud-activity';
describe('teacher cloud tool activity projection', () => {
it.each(['tool_call', 'tool_call_delta'])('takes only identity and state from %s', type => {
expect(cloudToolActivity({ stream_event: {
type, tool_call_id: 'call', name: 'read_project_file', args: { path: 'private.ts' }, args_delta: '{"secret":',
} }, 'run')).toEqual({ id: 'run:call', name: 'read_project_file', status: 'running' });
});
it.each([
['tool-started', undefined, undefined, 'running'],
['tool-finished', { type: 'tool', content: '{"private":"value"}', status: 'success' }, undefined, 'completed'],
['tool-finished', 'result text', undefined, 'completed'],
['tool-finished', { status: 'error', content: 'internal error' }, undefined, 'failed'],
['tool-finished', undefined, 'internal stack trace', 'failed'],
])('projects %s without leaking tool output', (event, output, error, status) => {
expect(cloudToolActivity({ status: 'stream_event', event: { method: 'tools', data: {
event, tool_call_id: 'call', tool_name: 'read_conversation', output, error,
} } }, 'run')).toEqual({ id: 'run:call', name: 'read_conversation', status });
});
it('does not guess activity from answer text, reasoning or unidentified deltas', () => {
for (const chunk of [
{ stream_event: { type: 'message_delta', content: '{"tool_call_id":"call","name":"read_project_file"}' } },
{ stream_event: { type: 'message_delta', reasoning_content: 'internal reasoning' } },
{ stream_event: { type: 'tool_call_delta', index: 0, args_delta: '{}' } },
{ status: 'stream_event', event: { method: 'messages', data: { event: 'tool-started', tool_call_id: 'call', tool_name: 'test' } } },
]) expect(cloudToolActivity(chunk, 'run')).toBeUndefined();
});
it.each([
['tool-finished', { type: 'tool', content: 'tool result', status: 'success' }, undefined, 'completed'],
['tool-error', undefined, 'private error', 'failed'],
])('accepts real %s events that carry only the call id', (event, output, error, status) => {
expect(cloudToolActivity({ status: 'stream_event', event: { method: 'tools', data: {
event, tool_call_id: 'call', output, error,
} } }, 'run')).toEqual({ id: 'run:call', status });
});
});