Skip to main content
Glama

documcp

by tosin2013
learning.test.ts7.16 kB
/** * Basic unit tests for Incremental Learning System * Tests basic instantiation and core functionality * Part of Issue #54 - Core Memory System Unit Tests */ import { promises as fs } from "fs"; import path from "path"; import os from "os"; import { MemoryManager } from "../../src/memory/manager.js"; import { IncrementalLearningSystem, ProjectFeatures, } from "../../src/memory/learning.js"; describe("IncrementalLearningSystem", () => { let tempDir: string; let memoryManager: MemoryManager; let learning: IncrementalLearningSystem; beforeEach(async () => { // Create unique temp directory for each test tempDir = path.join( os.tmpdir(), `memory-learning-test-${Date.now()}-${Math.random() .toString(36) .substr(2, 9)}`, ); await fs.mkdir(tempDir, { recursive: true }); // Create memory manager for learning system memoryManager = new MemoryManager(tempDir); await memoryManager.initialize(); learning = new IncrementalLearningSystem(memoryManager); await learning.initialize(); }); afterEach(async () => { // Cleanup temp directory try { await fs.rm(tempDir, { recursive: true, force: true }); } catch (error) { // Ignore cleanup errors } }); describe("Basic Learning System Tests", () => { test("should create learning system instance", () => { expect(learning).toBeDefined(); expect(learning).toBeInstanceOf(IncrementalLearningSystem); }); test("should be able to enable and disable learning", () => { learning.setLearningEnabled(false); learning.setLearningEnabled(true); // Just test that the methods exist and don't throw expect(true).toBe(true); }); test("should have pattern retrieval capabilities", async () => { // Test pattern retrieval without throwing errors const patterns = await learning.getPatterns(); expect(Array.isArray(patterns)).toBe(true); }); test("should provide learning statistics", async () => { const stats = await learning.getStatistics(); expect(stats).toBeDefined(); expect(typeof stats.totalPatterns).toBe("number"); expect(typeof stats.averageConfidence).toBe("number"); expect(Array.isArray(stats.insights)).toBe(true); }); test("should handle clearing patterns", async () => { await learning.clearPatterns(); // Verify patterns are cleared const patterns = await learning.getPatterns(); expect(Array.isArray(patterns)).toBe(true); expect(patterns.length).toBe(0); }); test("should provide improved recommendations", async () => { const projectFeatures: ProjectFeatures = { language: "typescript", framework: "react", size: "medium" as const, complexity: "moderate" as const, hasTests: true, hasCI: true, hasDocs: false, isOpenSource: true, }; const baseRecommendation = { recommended: "docusaurus", confidence: 0.8, score: 0.85, }; const improved = await learning.getImprovedRecommendation( projectFeatures, baseRecommendation, ); expect(improved).toBeDefined(); expect(improved.recommendation).toBeDefined(); expect(typeof improved.confidence).toBe("number"); expect(Array.isArray(improved.insights)).toBe(true); }); test("should handle learning from memory entries", async () => { const memoryEntry = await memoryManager.remember( "recommendation", { recommended: "docusaurus", confidence: 0.9, language: { primary: "typescript" }, framework: { name: "react" }, }, { projectId: "test-project", ssg: "docusaurus", }, ); // Learn from successful outcome await learning.learn(memoryEntry, "success"); // Verify no errors thrown expect(true).toBe(true); }); }); describe("Learning Statistics and Analysis", () => { test("should provide comprehensive learning statistics", async () => { const stats = await learning.getStatistics(); expect(stats).toBeDefined(); expect(typeof stats.totalPatterns).toBe("number"); expect(typeof stats.averageConfidence).toBe("number"); expect(typeof stats.learningVelocity).toBe("number"); expect(typeof stats.patternsByType).toBe("object"); expect(Array.isArray(stats.insights)).toBe(true); }); test("should handle multiple learning iterations", async () => { const projectFeatures: ProjectFeatures = { language: "javascript", framework: "vue", size: "small" as const, complexity: "simple" as const, hasTests: false, hasCI: false, hasDocs: true, isOpenSource: false, }; const baseRecommendation = { recommended: "vuepress", confidence: 0.7, score: 0.75, }; // Multiple learning cycles for (let i = 0; i < 3; i++) { const improved = await learning.getImprovedRecommendation( projectFeatures, baseRecommendation, ); expect(improved.recommendation).toBeDefined(); } expect(true).toBe(true); }); }); describe("Error Handling", () => { test("should handle empty patterns gracefully", async () => { // Clear all patterns first await learning.clearPatterns(); const patterns = await learning.getPatterns(); expect(Array.isArray(patterns)).toBe(true); expect(patterns.length).toBe(0); }); test("should handle learning with minimal data", async () => { const projectFeatures: ProjectFeatures = { language: "unknown", size: "small" as const, complexity: "simple" as const, hasTests: false, hasCI: false, hasDocs: false, isOpenSource: false, }; const baseRecommendation = { recommended: "jekyll", confidence: 0.5, }; const improved = await learning.getImprovedRecommendation( projectFeatures, baseRecommendation, ); expect(improved).toBeDefined(); expect(improved.recommendation).toBeDefined(); }); test("should handle concurrent learning operations", async () => { const promises = Array.from({ length: 3 }, async (_, i) => { const projectFeatures: ProjectFeatures = { language: "go", size: "medium" as const, complexity: "moderate" as const, hasTests: true, hasCI: true, hasDocs: true, isOpenSource: true, }; const baseRecommendation = { recommended: "hugo", confidence: 0.8 + i * 0.02, }; return learning.getImprovedRecommendation( projectFeatures, baseRecommendation, ); }); const results = await Promise.all(promises); expect(results.length).toBe(3); results.forEach((result) => { expect(result.recommendation).toBeDefined(); }); }); }); });

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/documcp'

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