enhanced-manager.test.ts•12.7 kB
/**
* Advanced unit tests for Enhanced Memory Manager
* Tests intelligent memory management with learning and knowledge graph integration
* Part of Issue #55 - Advanced Memory Components Unit Tests
*/
import { promises as fs } from "fs";
import path from "path";
import os from "os";
import {
EnhancedMemoryManager,
EnhancedRecommendation,
IntelligentAnalysis,
} from "../../src/memory/enhanced-manager.js";
import { ProjectFeatures } from "../../src/memory/learning.js";
describe("EnhancedMemoryManager", () => {
let tempDir: string;
let enhancedManager: EnhancedMemoryManager;
beforeEach(async () => {
// Create unique temp directory for each test
tempDir = path.join(
os.tmpdir(),
`enhanced-memory-test-${Date.now()}-${Math.random()
.toString(36)
.substr(2, 9)}`,
);
await fs.mkdir(tempDir, { recursive: true });
enhancedManager = new EnhancedMemoryManager(tempDir);
await enhancedManager.initialize();
});
afterEach(async () => {
// Cleanup temp directory
try {
await fs.rm(tempDir, { recursive: true, force: true });
} catch (error) {
// Ignore cleanup errors
}
});
describe("Enhanced Manager Initialization", () => {
test("should create enhanced manager instance", () => {
expect(enhancedManager).toBeDefined();
expect(enhancedManager).toBeInstanceOf(EnhancedMemoryManager);
});
test("should initialize all subsystems", async () => {
// Test that the enhanced manager properly initializes
// The initialize() method should complete without throwing
await enhancedManager.initialize();
expect(true).toBe(true);
});
test("should have learning and knowledge graph capabilities", async () => {
// Test that we can get learning statistics (indicating learning system exists)
const learningStats = await enhancedManager.getLearningStatistics();
expect(learningStats).toBeDefined();
expect(learningStats.learning).toBeDefined();
expect(learningStats.knowledgeGraph).toBeDefined();
});
});
describe("Enhanced Recommendations", () => {
test("should provide enhanced recommendations with multiple data sources", async () => {
// Set up test context
enhancedManager.setContext({ projectId: "enhanced-rec-test" });
// Add some historical data
await enhancedManager.remember("analysis", {
language: { primary: "typescript" },
framework: { name: "react" },
stats: { files: 150 },
});
await enhancedManager.remember("recommendation", {
recommended: "docusaurus",
confidence: 0.9,
});
await enhancedManager.remember("deployment", {
status: "success",
ssg: "docusaurus",
});
// Test enhanced recommendation
const projectFeatures: ProjectFeatures = {
language: "typescript",
framework: "react",
size: "medium",
complexity: "moderate",
hasTests: true,
hasCI: true,
hasDocs: false,
isOpenSource: true,
};
const baseRecommendation = {
recommended: "gatsby",
confidence: 0.7,
score: 0.75,
};
const enhanced = await enhancedManager.getEnhancedRecommendation(
"/test/project",
baseRecommendation,
projectFeatures,
);
expect(enhanced).toBeDefined();
expect(enhanced.baseRecommendation).toEqual(baseRecommendation);
expect(enhanced.learningEnhanced).toBeDefined();
expect(Array.isArray(enhanced.graphBased)).toBe(true);
expect(Array.isArray(enhanced.insights)).toBe(true);
expect(typeof enhanced.confidence).toBe("number");
expect(Array.isArray(enhanced.reasoning)).toBe(true);
expect(enhanced.metadata).toBeDefined();
expect(typeof enhanced.metadata.usedLearning).toBe("boolean");
expect(typeof enhanced.metadata.usedKnowledgeGraph).toBe("boolean");
});
test("should handle recommendations with insufficient data", async () => {
const projectFeatures: ProjectFeatures = {
language: "unknown",
size: "small",
complexity: "simple",
hasTests: false,
hasCI: false,
hasDocs: false,
isOpenSource: false,
};
const baseRecommendation = {
recommended: "jekyll",
confidence: 0.5,
};
const enhanced = await enhancedManager.getEnhancedRecommendation(
"/test/project",
baseRecommendation,
projectFeatures,
);
expect(enhanced).toBeDefined();
expect(enhanced.confidence).toBeGreaterThanOrEqual(0);
expect(enhanced.confidence).toBeLessThanOrEqual(1);
});
});
describe("Intelligent Analysis", () => {
test("should provide intelligent analysis with patterns and predictions", async () => {
enhancedManager.setContext({ projectId: "intelligent-analysis-test" });
// Add analysis data
await enhancedManager.remember("analysis", {
language: { primary: "python" },
framework: { name: "flask" },
dependencies: { count: 25 },
testing: { hasTests: true },
ci: { hasCI: true },
});
const analysisData = {
language: "python",
framework: "flask",
size: "medium",
hasTests: true,
hasCI: true,
};
const intelligentAnalysis = await enhancedManager.getIntelligentAnalysis(
"/test/project",
analysisData,
);
expect(intelligentAnalysis).toBeDefined();
expect(intelligentAnalysis.analysis).toBeDefined();
expect(Array.isArray(intelligentAnalysis.patterns)).toBe(true);
expect(Array.isArray(intelligentAnalysis.predictions)).toBe(true);
expect(Array.isArray(intelligentAnalysis.recommendations)).toBe(true);
expect(intelligentAnalysis.learningData).toBeDefined();
expect(typeof intelligentAnalysis.learningData.similarProjects).toBe(
"number",
);
expect(typeof intelligentAnalysis.learningData.confidenceLevel).toBe(
"number",
);
expect(["low", "medium", "high"]).toContain(
intelligentAnalysis.learningData.dataQuality,
);
// Check prediction structure
if (intelligentAnalysis.predictions.length > 0) {
const prediction = intelligentAnalysis.predictions[0];
expect(["success_rate", "optimal_ssg", "potential_issues"]).toContain(
prediction.type,
);
expect(typeof prediction.prediction).toBe("string");
expect(typeof prediction.confidence).toBe("number");
}
});
test("should adapt analysis based on historical patterns", async () => {
enhancedManager.setContext({ projectId: "adaptive-analysis-test" });
// Create pattern with multiple similar projects
for (let i = 0; i < 3; i++) {
await enhancedManager.remember("analysis", {
language: { primary: "javascript" },
framework: { name: "vue" },
});
await enhancedManager.remember("recommendation", {
recommended: "vuepress",
confidence: 0.8 + i * 0.05,
});
await enhancedManager.remember("deployment", {
status: "success",
ssg: "vuepress",
});
}
const analysisData = {
language: "javascript",
framework: "vue",
size: "small",
};
const analysis = await enhancedManager.getIntelligentAnalysis(
"/test/project",
analysisData,
);
expect(analysis.learningData.similarProjects).toBeGreaterThan(0);
expect(analysis.learningData.dataQuality).toBe("medium");
});
});
describe("Memory Integration", () => {
test("should integrate learning feedback into knowledge graph", async () => {
enhancedManager.setContext({ projectId: "integration-test" });
// Create initial recommendation
const memoryEntry = await enhancedManager.remember("recommendation", {
recommended: "hugo",
confidence: 0.8,
language: { primary: "go" },
});
// Simulate feedback by creating a deployment success record
await enhancedManager.remember("deployment", {
status: "success",
ssg: "hugo",
feedback: {
rating: 5,
helpful: true,
comments: "Worked perfectly",
},
});
// Verify feedback was processed
const stats = await enhancedManager.getLearningStatistics();
expect(stats).toBeDefined();
expect(stats.learning).toBeDefined();
});
test("should synchronize data between subsystems", async () => {
enhancedManager.setContext({ projectId: "sync-test" });
// Add data that should propagate between systems
await enhancedManager.remember("analysis", {
language: { primary: "rust" },
framework: { name: "actix" },
});
await enhancedManager.remember("deployment", {
status: "success",
ssg: "mdbook",
});
// The subsystems should automatically sync through the enhanced manager
// Verify data exists in both systems
const learningStats = await enhancedManager.getLearningStatistics();
expect(learningStats).toBeDefined();
expect(learningStats.learning).toBeDefined();
expect(learningStats.knowledgeGraph).toBeDefined();
expect(learningStats.combined).toBeDefined();
});
});
describe("Performance and Optimization", () => {
test("should handle concurrent enhanced operations", async () => {
enhancedManager.setContext({ projectId: "concurrent-enhanced-test" });
const operations = Array.from({ length: 5 }, async (_, i) => {
const projectFeatures: ProjectFeatures = {
language: "go",
size: "medium",
complexity: "moderate",
hasTests: true,
hasCI: true,
hasDocs: true,
isOpenSource: true,
};
const baseRecommendation = {
recommended: "hugo",
confidence: 0.8 + i * 0.02,
};
return enhancedManager.getEnhancedRecommendation(
"/test/project",
baseRecommendation,
projectFeatures,
);
});
const results = await Promise.all(operations);
expect(results.length).toBe(5);
results.forEach((result) => {
expect(result).toBeDefined();
expect(result.confidence).toBeGreaterThanOrEqual(0);
});
});
test("should provide optimization insights", async () => {
enhancedManager.setContext({ projectId: "optimization-test" });
// Add some data
await enhancedManager.remember("analysis", { performanceTest: true });
// Test learning statistics as a proxy for optimization insights
const stats = await enhancedManager.getLearningStatistics();
expect(stats).toBeDefined();
expect(stats.combined).toBeDefined();
expect(typeof stats.combined.systemMaturity).toBe("string");
expect(["nascent", "developing", "mature"]).toContain(
stats.combined.systemMaturity,
);
});
});
describe("Error Handling and Edge Cases", () => {
test("should handle malformed input gracefully", async () => {
const malformedFeatures = {
language: null,
size: "invalid" as any,
complexity: undefined as any,
};
const malformedRecommendation = {
recommended: "",
confidence: -1,
};
// Should not throw, but handle gracefully
const result = await enhancedManager.getEnhancedRecommendation(
"/test/project",
malformedRecommendation,
malformedFeatures as any,
);
expect(result).toBeDefined();
expect(result.confidence).toBeGreaterThanOrEqual(0);
expect(result.confidence).toBeLessThanOrEqual(1);
});
test("should handle subsystem failures gracefully", async () => {
// Test with partial system availability
const projectFeatures: ProjectFeatures = {
language: "javascript",
size: "small",
complexity: "simple",
hasTests: false,
hasCI: false,
hasDocs: false,
isOpenSource: true,
};
const baseRecommendation = {
recommended: "gatsby",
confidence: 0.6,
};
// Should work even if some subsystems have issues
const result = await enhancedManager.getEnhancedRecommendation(
"/test/project",
baseRecommendation,
projectFeatures,
);
expect(result).toBeDefined();
expect(result.baseRecommendation).toEqual(baseRecommendation);
});
});
});