@probelabs/probe
Version:
Node.js wrapper for the probe code search tool
327 lines (275 loc) • 9.72 kB
JavaScript
// Tests for ACP Types and Utilities
import {
ACP_PROTOCOL_VERSION,
MessageType,
RequestMethod,
NotificationMethod,
ToolCallStatus,
ToolCallKind,
ContentType,
ErrorCode,
SessionMode,
createMessage,
createResponse,
createError,
createContentBlock,
createTextContent,
createToolCallProgress,
validateMessage
} from './types.js';
describe('ACP Types', () => {
describe('constants', () => {
test('should have correct protocol version', () => {
expect(ACP_PROTOCOL_VERSION).toBe("1");
});
test('should have message types', () => {
expect(MessageType.REQUEST).toBe('request');
expect(MessageType.RESPONSE).toBe('response');
expect(MessageType.NOTIFICATION).toBe('notification');
});
test('should have request methods', () => {
expect(RequestMethod.INITIALIZE).toBe('initialize');
expect(RequestMethod.NEW_SESSION).toBe('newSession');
expect(RequestMethod.PROMPT).toBe('prompt');
expect(RequestMethod.CANCEL).toBe('cancel');
});
test('should have notification methods', () => {
expect(NotificationMethod.SESSION_UPDATED).toBe('sessionUpdated');
expect(NotificationMethod.TOOL_CALL_PROGRESS).toBe('toolCallProgress');
expect(NotificationMethod.MESSAGE_CHUNK).toBe('messageChunk');
});
test('should have tool call statuses', () => {
expect(ToolCallStatus.PENDING).toBe('pending');
expect(ToolCallStatus.IN_PROGRESS).toBe('in_progress');
expect(ToolCallStatus.COMPLETED).toBe('completed');
expect(ToolCallStatus.FAILED).toBe('failed');
});
test('should have tool call kinds', () => {
expect(ToolCallKind.READ).toBe('read');
expect(ToolCallKind.edit).toBe('edit');
expect(ToolCallKind.search).toBe('search');
expect(ToolCallKind.query).toBe('query');
expect(ToolCallKind.extract).toBe('extract');
});
test('should have content types', () => {
expect(ContentType.TEXT).toBe('text');
expect(ContentType.IMAGE).toBe('image');
expect(ContentType.RESOURCE).toBe('resource');
});
test('should have error codes', () => {
expect(ErrorCode.PARSE_ERROR).toBe(-32700);
expect(ErrorCode.INVALID_REQUEST).toBe(-32600);
expect(ErrorCode.METHOD_NOT_FOUND).toBe(-32601);
expect(ErrorCode.INVALID_PARAMS).toBe(-32602);
expect(ErrorCode.INTERNAL_ERROR).toBe(-32603);
});
test('should have session modes', () => {
expect(SessionMode.NORMAL).toBe('normal');
expect(SessionMode.PLANNING).toBe('planning');
});
});
describe('createMessage', () => {
test('should create basic message', () => {
const message = createMessage('testMethod');
expect(message).toEqual({
jsonrpc: '2.0',
method: 'testMethod'
});
});
test('should create message with params', () => {
const params = { test: 'value' };
const message = createMessage('testMethod', params);
expect(message).toEqual({
jsonrpc: '2.0',
method: 'testMethod',
params
});
});
test('should create message with ID', () => {
const message = createMessage('testMethod', null, 123);
expect(message).toEqual({
jsonrpc: '2.0',
method: 'testMethod',
id: 123
});
});
test('should create message with params and ID', () => {
const params = { test: 'value' };
const message = createMessage('testMethod', params, 456);
expect(message).toEqual({
jsonrpc: '2.0',
method: 'testMethod',
params,
id: 456
});
});
});
describe('createResponse', () => {
test('should create success response', () => {
const result = { success: true };
const response = createResponse(123, result);
expect(response).toEqual({
jsonrpc: '2.0',
id: 123,
result
});
});
test('should create error response', () => {
const error = { code: -32601, message: 'Method not found' };
const response = createResponse(456, null, error);
expect(response).toEqual({
jsonrpc: '2.0',
id: 456,
error
});
});
test('should create response with null result', () => {
const response = createResponse(789);
expect(response).toEqual({
jsonrpc: '2.0',
id: 789,
result: null
});
});
});
describe('createError', () => {
test('should create basic error', () => {
const error = createError(ErrorCode.INTERNAL_ERROR, 'Something went wrong');
expect(error).toEqual({
code: ErrorCode.INTERNAL_ERROR,
message: 'Something went wrong'
});
});
test('should create error with data', () => {
const data = { details: 'More info' };
const error = createError(ErrorCode.INVALID_PARAMS, 'Invalid parameters', data);
expect(error).toEqual({
code: ErrorCode.INVALID_PARAMS,
message: 'Invalid parameters',
data
});
});
});
describe('createContentBlock', () => {
test('should create basic content block', () => {
const content = { text: 'Hello world' };
const block = createContentBlock(ContentType.TEXT, content);
expect(block).toEqual({
type: ContentType.TEXT,
text: 'Hello world'
});
});
test('should create content block with metadata', () => {
const content = { uri: 'file://test.txt' };
const metadata = { size: 1024, encoding: 'utf-8' };
const block = createContentBlock(ContentType.RESOURCE, content, metadata);
expect(block).toEqual({
type: ContentType.RESOURCE,
uri: 'file://test.txt',
size: 1024,
encoding: 'utf-8'
});
});
});
describe('createTextContent', () => {
test('should create text content block', () => {
const block = createTextContent('Hello world');
expect(block).toEqual({
type: ContentType.TEXT,
text: 'Hello world'
});
});
});
describe('createToolCallProgress', () => {
test('should create basic progress', () => {
const progress = createToolCallProgress('tool-123', ToolCallStatus.IN_PROGRESS);
expect(progress).toEqual({
toolCallId: 'tool-123',
status: ToolCallStatus.IN_PROGRESS
});
});
test('should create progress with result', () => {
const result = { found: 5 };
const progress = createToolCallProgress('tool-456', ToolCallStatus.COMPLETED, result);
expect(progress).toEqual({
toolCallId: 'tool-456',
status: ToolCallStatus.COMPLETED,
result
});
});
test('should create progress with error', () => {
const error = 'Tool failed';
const progress = createToolCallProgress('tool-789', ToolCallStatus.FAILED, null, error);
expect(progress).toEqual({
toolCallId: 'tool-789',
status: ToolCallStatus.FAILED,
error
});
});
});
describe('validateMessage', () => {
test('should validate correct request message', () => {
const message = {
jsonrpc: '2.0',
method: 'test',
id: 1
};
const result = validateMessage(message);
expect(result.valid).toBe(true);
});
test('should validate correct notification message', () => {
const message = {
jsonrpc: '2.0',
method: 'test'
};
const result = validateMessage(message);
expect(result.valid).toBe(true);
});
test('should validate correct response message', () => {
const message = {
jsonrpc: '2.0',
id: 1,
result: { success: true }
};
const result = validateMessage(message);
expect(result.valid).toBe(true);
});
test('should validate correct error response message', () => {
const message = {
jsonrpc: '2.0',
id: 1,
error: { code: -32601, message: 'Method not found' }
};
const result = validateMessage(message);
expect(result.valid).toBe(true);
});
test('should reject null/undefined message', () => {
expect(validateMessage(null).valid).toBe(false);
expect(validateMessage(undefined).valid).toBe(false);
expect(validateMessage(null).error).toBe('Message must be an object');
});
test('should reject non-object message', () => {
const result = validateMessage('not an object');
expect(result.valid).toBe(false);
expect(result.error).toBe('Message must be an object');
});
test('should reject missing jsonrpc', () => {
const message = { method: 'test', id: 1 };
const result = validateMessage(message);
expect(result.valid).toBe(false);
expect(result.error).toBe('Invalid or missing jsonrpc version');
});
test('should reject wrong jsonrpc version', () => {
const message = { jsonrpc: '1.0', method: 'test', id: 1 };
const result = validateMessage(message);
expect(result.valid).toBe(false);
expect(result.error).toBe('Invalid or missing jsonrpc version');
});
test('should reject invalid request/response structure', () => {
const message = { jsonrpc: '2.0', id: 1 }; // No method, result, or error
const result = validateMessage(message);
expect(result.valid).toBe(false);
expect(result.error).toBe('Request must have method or response must have result/error');
});
});
});