Skip to main content
Glama
BrainDirectoryIntegration.test.ts11.8 kB
/** * Brain Directory Integration Tests * * Tests the integration of brain directory configuration with the cognitive * architecture components, focusing on configuration validation and path resolution. */ import { afterEach, beforeEach, describe, expect, it } from "vitest"; import { MemorySystem } from "../../cognitive/MemorySystem.js"; import { ConfigManager } from "../../utils/config.js"; describe("Brain Directory Integration", () => { let originalEnv: NodeJS.ProcessEnv; beforeEach(() => { // Save original environment originalEnv = { ...process.env }; // Clear brain directory related env vars delete process.env.COGNITIVE_BRAIN_DIR; delete process.env.HOME; }); afterEach(() => { // Restore original environment process.env = originalEnv; }); describe("ConfigManager integration", () => { it("should create correct memory file paths for different brain directories", () => { const testCases = [ { home: "/Users/testuser", brainDir: "~/.brain", expected: "/Users/testuser/.brain/memory.json", }, { home: "/home/user", brainDir: "~/custom-brain", expected: "/home/user/custom-brain/memory.json", }, { home: "/Users/testuser", brainDir: "/absolute/brain/path", expected: "/absolute/brain/path/memory.json", }, { home: "/Users/testuser", brainDir: "./relative-brain", expected: "relative-brain/memory.json", }, ]; for (const testCase of testCases) { process.env.HOME = testCase.home; process.env.COGNITIVE_BRAIN_DIR = testCase.brainDir; const configManager = new ConfigManager(); const memoryFilePath = configManager.getMemoryFilePath(); expect(memoryFilePath).toBe(testCase.expected); } }); it("should handle domain-specific brain directories", () => { const domains = ["web-dev", "data-science", "mobile-dev"]; process.env.HOME = "/Users/testuser"; for (const domain of domains) { process.env.COGNITIVE_BRAIN_DIR = `~/.brain/${domain}`; const configManager = new ConfigManager(); const memoryFilePath = configManager.getMemoryFilePath(); expect(memoryFilePath).toBe( `/Users/testuser/.brain/${domain}/memory.json` ); } }); }); describe("MemorySystem configuration integration", () => { it("should create memory system with brain directory configuration", async () => { process.env.HOME = "/tmp"; process.env.COGNITIVE_BRAIN_DIR = "/tmp/test-brain"; const configManager = new ConfigManager(); const memoryFilePath = configManager.getMemoryFilePath(); expect(memoryFilePath).toBe("/tmp/test-brain/memory.json"); // Create memory system with memory provider (no file system operations) const memorySystem = new MemorySystem({ persistence: { storage_type: "memory", // Use memory provider to avoid file system }, persistence_enabled: true, auto_save_enabled: false, auto_recovery_enabled: false, }); await memorySystem.initialize(); // Verify memory system is initialized const status = memorySystem.getStatus(); expect(status.initialized).toBe(true); // Verify persistence configuration const persistenceStatus = memorySystem.getPersistenceStatus(); expect(persistenceStatus.enabled).toBe(true); expect(persistenceStatus.provider_type).toBe("memory"); await memorySystem.shutdown(); }); it("should handle memory operations with different brain directories", async () => { const testConfigs = [ { brainDir: "/tmp/brain1", domain: "test1" }, { brainDir: "/tmp/brain2", domain: "test2" }, { brainDir: "/tmp/brain3", domain: "test3" }, ]; const memorySystems: MemorySystem[] = []; try { for (const config of testConfigs) { process.env.COGNITIVE_BRAIN_DIR = config.brainDir; const configManager = new ConfigManager(); const memoryFilePath = configManager.getMemoryFilePath(); expect(memoryFilePath).toBe(`${config.brainDir}/memory.json`); const memorySystem = new MemorySystem({ persistence: { storage_type: "memory", }, persistence_enabled: true, auto_save_enabled: false, auto_recovery_enabled: false, }); await memorySystem.initialize(); memorySystems.push(memorySystem); // Store domain-specific memory const episode = { content: { text: `${config.domain} specific knowledge` }, context: { session_id: "test", domain: config.domain }, importance: 0.7, emotional_tags: [config.domain], }; const result = await memorySystem.storeExperience(episode); expect(result.success).toBe(true); } // Verify each memory system has its own memories for (let i = 0; i < memorySystems.length; i++) { const memorySystem = memorySystems[i]; const config = testConfigs[i]; const retrievalResult = await memorySystem.retrieveMemories( config.domain, 0.1 ); expect(retrievalResult.episodic_memories.length).toBeGreaterThan(0); // Verify it contains the domain-specific memory const hasDomainMemory = retrievalResult.episodic_memories.some( (memory) => memory.content && typeof memory.content === "object" && "text" in memory.content && (memory.content as any).text.includes(config.domain) ); expect(hasDomainMemory).toBe(true); } } finally { // Clean up all memory systems for (const memorySystem of memorySystems) { await memorySystem.shutdown(); } } }); }); describe("configuration validation", () => { it("should validate brain directory paths in memory system configuration", () => { const validConfigs = [ "~/.brain", "/absolute/path/brain", "./relative/brain", "~/domain-specific/brain", ]; for (const brainDir of validConfigs) { process.env.COGNITIVE_BRAIN_DIR = brainDir; const configManager = new ConfigManager(); const config = configManager.getConfig(); expect(config.brain_dir).toBe(brainDir); expect(typeof config.brain_dir).toBe("string"); expect(config.brain_dir).toBeDefined(); expect(config.brain_dir!.length).toBeGreaterThan(0); } }); it("should handle edge cases in brain directory configuration", () => { const edgeCases = [ { env: "", expected: "~/.brain" }, // Empty falls back to default { env: " ", expected: "~/.brain" }, // Whitespace falls back to default ]; for (const testCase of edgeCases) { process.env.COGNITIVE_BRAIN_DIR = testCase.env; const configManager = new ConfigManager(); const config = configManager.getConfig(); expect(config.brain_dir).toBe(testCase.expected); } }); }); describe("cross-project scenarios", () => { it("should support different brain directories for different project types", () => { const projectTypes = [ { type: "web", brainDir: "~/.brain/web-projects" }, { type: "mobile", brainDir: "~/.brain/mobile-apps" }, { type: "data", brainDir: "~/.brain/data-science" }, { type: "ai", brainDir: "~/.brain/ai-research" }, ]; process.env.HOME = "/Users/developer"; for (const project of projectTypes) { process.env.COGNITIVE_BRAIN_DIR = project.brainDir; const configManager = new ConfigManager(); const memoryFilePath = configManager.getMemoryFilePath(); const expectedPath = `/Users/developer/.brain/${ project.type === "web" ? "web-projects" : project.type === "mobile" ? "mobile-apps" : project.type === "data" ? "data-science" : "ai-research" }/memory.json`; expect(memoryFilePath).toBe(expectedPath); } }); it("should maintain configuration consistency across multiple instances", () => { process.env.HOME = "/Users/testuser"; process.env.COGNITIVE_BRAIN_DIR = "~/.brain/shared"; // Create multiple config managers const configManager1 = new ConfigManager(); const configManager2 = new ConfigManager(); const configManager3 = new ConfigManager(); // All should have the same configuration const config1 = configManager1.getConfig(); const config2 = configManager2.getConfig(); const config3 = configManager3.getConfig(); expect(config1.brain_dir).toBe(config2.brain_dir); expect(config2.brain_dir).toBe(config3.brain_dir); expect(config1.brain_dir).toBe("~/.brain/shared"); // All should generate the same memory file path const path1 = configManager1.getMemoryFilePath(); const path2 = configManager2.getMemoryFilePath(); const path3 = configManager3.getMemoryFilePath(); expect(path1).toBe(path2); expect(path2).toBe(path3); expect(path1).toBe("/Users/testuser/.brain/shared/memory.json"); }); }); describe("error handling and resilience", () => { it("should handle missing HOME environment variable gracefully", () => { delete process.env.HOME; process.env.COGNITIVE_BRAIN_DIR = "~/.brain"; const configManager = new ConfigManager(); const brainPath = configManager.getBrainDirectoryPath(); // Should handle missing HOME gracefully (results in /.brain) expect(brainPath).toBe("/.brain"); const memoryFilePath = configManager.getMemoryFilePath(); expect(memoryFilePath).toBe("/.brain/memory.json"); }); it("should handle unusual but valid brain directory paths", () => { const unusualPaths = [ "/tmp/brain-with-hyphens", "/tmp/brain_with_underscores", "/tmp/brain.with.dots", "/tmp/brain@special#chars", "/tmp/very/deep/nested/brain/directory", ]; for (const brainDir of unusualPaths) { process.env.COGNITIVE_BRAIN_DIR = brainDir; const configManager = new ConfigManager(); const config = configManager.getConfig(); expect(config.brain_dir).toBe(brainDir); const memoryFilePath = configManager.getMemoryFilePath(); expect(memoryFilePath).toBe(`${brainDir}/memory.json`); } }); it("should maintain configuration integrity under concurrent access", () => { process.env.HOME = "/Users/testuser"; process.env.COGNITIVE_BRAIN_DIR = "~/.brain/concurrent-test"; // Simulate concurrent access const configManagers = Array.from( { length: 10 }, () => new ConfigManager() ); // All should have consistent configuration const configs = configManagers.map((cm) => cm.getConfig()); const memoryPaths = configManagers.map((cm) => cm.getMemoryFilePath()); // Verify all configurations are identical for (let i = 1; i < configs.length; i++) { expect(configs[i].brain_dir).toBe(configs[0].brain_dir); expect(memoryPaths[i]).toBe(memoryPaths[0]); } expect(configs[0].brain_dir).toBe("~/.brain/concurrent-test"); expect(memoryPaths[0]).toBe( "/Users/testuser/.brain/concurrent-test/memory.json" ); }); }); });

Latest Blog Posts

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/keyurgolani/ThoughtMcp'

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