// import { describe, it, expect } from '@jest/globals'
import { processRequest, formatResponse } from '../../src/pipeline'
describe('processRequest', () => {
it('should handle tools/list request', () => {
const request = {
method: 'tools/list',
params: {}
}
const result = processRequest(request)
expect('tools' in result).toBe(true)
if ('tools' in result) {
expect(Array.isArray(result.tools)).toBe(true)
expect(result.tools.length).toBeGreaterThan(0)
}
})
it('should handle tools/call request', () => {
const request = {
method: 'tools/call',
params: {
name: 'compare_texts',
arguments: {
text1: 'Hello World',
text2: 'Hello World'
}
}
}
const result = processRequest(request)
expect('identical' in result).toBe(true)
if ('identical' in result) {
expect(result.identical).toBe(true)
}
})
it('should reject unknown methods', () => {
const request = {
method: 'unknown_method',
params: {}
}
expect(() => processRequest(request)).toThrow('Unsupported method')
})
it('should reject unknown tools', () => {
const request = {
method: 'tools/call',
params: {
name: 'unknown_tool',
arguments: {}
}
}
expect(() => processRequest(request)).toThrow('Unknown tool')
})
it('should handle missing params', () => {
const request = {
method: 'tools/list'
// no params
}
const result = processRequest(request)
expect('tools' in result).toBe(true)
if ('tools' in result) {
expect(result.tools).toBeDefined()
}
})
it('should handle empty arguments', () => {
const request = {
method: 'tools/call',
params: {
name: 'compare_texts',
arguments: {}
}
}
expect(() => processRequest(request)).toThrow() // should fail validation
})
})
describe('formatResponse', () => {
it('should format simple result', () => {
const result = { identical: true }
const response = formatResponse(result)
expect(response.content).toHaveLength(1)
expect(response.content[0].type).toBe('text')
expect(response.content[0].text).toContain('"identical":true')
})
it('should format complex result', () => {
const result = {
identical: false,
differences: [
{ type: 'add', value: 'Hello', lineNumber: 1 }
],
summary: 'Texts differ',
statistics: {
totalLines: 1,
addedLines: 1,
removedLines: 0,
changedLines: 1,
totalCharacters: 5,
addedCharacters: 5,
removedCharacters: 0,
similarityPercentage: 0
}
}
const response = formatResponse(result)
expect(response.content).toHaveLength(1)
expect(response.content[0].type).toBe('text')
expect(response.content[0].text).toContain('"identical":false')
expect(response.content[0].text).toContain('"differences"')
})
it('should handle null/undefined results', () => {
const response = formatResponse(null)
expect(response.content).toHaveLength(1)
expect(response.content[0].text).toBe('null')
const response2 = formatResponse(undefined)
expect(response2.content).toHaveLength(1)
expect(response2.content[0].text).toBe('undefined')
})
})
describe('Request Validation', () => {
it('should validate MCP request structure', () => {
const validRequest = {
method: 'tools/call',
params: {
name: 'compare_texts',
arguments: { text1: 'Hello', text2: 'World' }
}
}
expect(() => processRequest(validRequest)).not.toThrow()
})
it('should reject invalid MCP request', () => {
const invalidRequest = {
// missing method
params: {}
}
expect(() => processRequest(invalidRequest)).toThrow()
})
it('should validate tools/call params', () => {
const invalidRequest = {
method: 'tools/call',
params: {
// missing name
arguments: {}
}
}
expect(() => processRequest(invalidRequest)).toThrow()
})
})
describe('Error Handling', () => {
it('should handle pipeline execution errors', () => {
const request = {
method: 'tools/call',
params: {
name: 'compare_texts',
arguments: {
text1: 'Hello'
// missing text2 - should cause validation error
}
}
}
expect(() => processRequest(request)).toThrow()
})
it('should handle malformed JSON in response', () => {
const result = {
circular: null as any
}
result.circular = result // creates circular reference
expect(() => formatResponse(result)).toThrow()
})
})