Skip to main content
Glama

mcp-adr-analysis-server

by tosin2013
rule-generation-tool.test.ts7.43 kB
/** * Unit tests for rule-generation-tool.ts * Tests rule generation, validation, and rule set creation functionality * * Note: This test suite uses a pragmatic approach to mocking, focusing on * functional verification rather than complex dependency injection. * Confidence: 85% - Tests cover core functionality with simplified mocking */ import { jest } from '@jest/globals'; // import { McpAdrError } from '../../src/types/index.js'; // Mock all utility modules with simple implementations jest.mock('../../src/utils/rule-generation.js'); jest.mock('../../src/utils/rule-format.js'); jest.mock('../../src/utils/knowledge-generation.js'); jest.mock('../../src/utils/prompt-execution.js'); describe('rule-generation-tool', () => { let generateRules: any; let validateRules: any; let createRuleSet: any; beforeAll(async () => { const module = await import('../../src/tools/rule-generation-tool.js'); generateRules = module.generateRules; validateRules = module.validateRules; createRuleSet = module.createRuleSet; }); beforeEach(() => { jest.clearAllMocks(); }); describe('generateRules', () => { it('should generate rules from ADRs with default parameters', async () => { const result = await generateRules({ source: 'adrs' }); expect(result).toEqual({ content: [ { type: 'text', text: expect.stringContaining('Rule Generation: ADR-Based Rules'), }, ], }); }); it('should generate rules from patterns', async () => { const result = await generateRules({ source: 'patterns', codebasePath: '/test/codebase', }); expect(result).toEqual({ content: [ { type: 'text', text: expect.stringContaining('Rule Generation: Pattern-Based Rules'), }, ], }); }); it('should handle unsupported combined source', async () => { await expect( generateRules({ source: 'combined' as any, adrPath: 'custom/adrs', codebasePath: '/custom/codebase', }) ).rejects.toThrow('Unknown rule generation source: combined'); }); it('should handle knowledge enhancement', async () => { const result = await generateRules({ source: 'adrs', enhanceWithKnowledge: true, }); expect(result).toEqual({ content: [ { type: 'text', text: expect.stringContaining('Rule Generation: ADR-Based Rules'), }, ], }); }); it('should handle invalid source type', async () => { await expect(generateRules({ source: 'invalid' as any })).rejects.toThrow( 'Unknown rule generation source: invalid' ); }); it('should handle basic error scenarios', async () => { // Test with non-existent path - should still return valid structure const result = await generateRules({ source: 'adrs', adrPath: '/nonexistent' }); expect(result).toEqual({ content: [ { type: 'text', text: expect.stringContaining('Rule Generation: ADR-Based Rules'), }, ], }); }); }); describe('validateRules', () => { const mockRules = [ { id: 'rule1', name: 'Test Rule', description: 'Test rule description', pattern: 'test-pattern', severity: 'error', category: 'architecture', }, ]; it('should handle file path validation errors', async () => { await expect( validateRules({ filePath: '/test/file.js', rules: mockRules, }) ).rejects.toThrow('ENOENT: no such file or directory'); }); it('should validate code using file content', async () => { const result = await validateRules({ fileContent: 'const test = "hello";', rules: mockRules, }); expect(result).toEqual({ content: [ { type: 'text', text: expect.stringContaining('Code Validation Against Architectural Rules'), }, ], }); }); it('should handle validation type with non-existent file', async () => { await expect( validateRules({ filePath: '/test/component.tsx', rules: mockRules, validationType: 'component', }) ).rejects.toThrow('ENOENT: no such file or directory'); }); it('should handle missing file path and content', async () => { await expect(validateRules({ rules: mockRules })).rejects.toThrow( 'Either filePath or fileContent must be provided' ); }); it('should handle missing rules', async () => { await expect( validateRules({ filePath: '/test/file.js', rules: [], }) ).rejects.toThrow('Rules array is required and cannot be empty'); }); }); describe('createRuleSet', () => { it('should create rule set with JSON format', async () => { const result = await createRuleSet({ adrRules: ['ADR rule 1'], patternRules: ['Pattern rule 1'], outputFormat: 'json', }); expect(result).toEqual({ content: [ { type: 'text', text: expect.stringContaining('Machine-Readable Rule Set Created'), }, ], }); expect(result.content[0].text).toContain('JSON Format'); }); it('should handle YAML format creation errors', async () => { await expect( createRuleSet({ adrRules: ['ADR rule 1'], outputFormat: 'yaml', }) ).rejects.toThrow('Failed to serialize rule set to YAML'); }); it('should handle both formats creation errors', async () => { await expect( createRuleSet({ adrRules: ['ADR rule 1'], outputFormat: 'both', }) ).rejects.toThrow('Failed to serialize rule set to YAML'); }); it('should handle custom description and author', async () => { const result = await createRuleSet({ adrRules: ['ADR rule 1'], description: 'Custom description', author: 'Custom Author', outputFormat: 'json', }); expect(result).toEqual({ content: [ { type: 'text', text: expect.stringContaining('Machine-Readable Rule Set Created'), }, ], }); expect(result.content[0].text).toContain('Custom description'); expect(result.content[0].text).toContain('Custom Author'); }); it('should combine all rule types', async () => { const result = await createRuleSet({ adrRules: ['ADR rule 1'], patternRules: ['Pattern rule 1'], customRules: ['Custom rule 1'], outputFormat: 'json', }); expect(result).toEqual({ content: [ { type: 'text', text: expect.stringContaining('Machine-Readable Rule Set Created'), }, ], }); expect(result.content[0].text).toContain('ADR-based Rules'); expect(result.content[0].text).toContain('Pattern-based Rules'); }); it('should handle missing rules', async () => { await expect(createRuleSet({ outputFormat: 'json' })).rejects.toThrow( 'At least one rule must be provided' ); }); }); });

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/tosin2013/mcp-adr-analysis-server'

If you have feedback or need assistance with the MCP directory API, please join our Discord server