Skip to main content
Glama

DollhouseMCP

by DollhouseMCP
DefaultElementProvider.safety.test.ts6.98 kB
/** * Tests for DefaultElementProvider test data safety features */ import { describe, it, expect, beforeEach, afterEach, jest } from '@jest/globals'; import { DefaultElementProvider } from '../../../../src/portfolio/DefaultElementProvider.js'; import * as fs from 'fs/promises'; import * as path from 'path'; import { fileURLToPath } from 'url'; const __filename = fileURLToPath(import.meta.url); const __dirname = path.dirname(__filename); describe('DefaultElementProvider - Test Data Safety', () => { let originalEnv: NodeJS.ProcessEnv; let provider: DefaultElementProvider; let tempDir: string; beforeEach(async () => { // Save original environment originalEnv = { ...process.env }; // Create temp directory for testing tempDir = path.join(__dirname, 'temp-test-portfolio'); await fs.mkdir(tempDir, { recursive: true }); }); afterEach(async () => { // Restore environment process.env = originalEnv; // Clean up temp directory try { await fs.rm(tempDir, { recursive: true, force: true }); } catch (error) { // Ignore cleanup errors } }); describe('Development Mode Detection', () => { it('should not load test data by default in development mode', async () => { // Force development mode using FORCE_PRODUCTION_MODE const originalForceMode = process.env.FORCE_PRODUCTION_MODE; const originalLoadTestData = process.env.DOLLHOUSE_LOAD_TEST_DATA; process.env.FORCE_PRODUCTION_MODE = 'false'; delete process.env.DOLLHOUSE_LOAD_TEST_DATA; try { // Create a new provider AFTER setting environment variables const devProvider = new DefaultElementProvider({ loadTestData: true }); // Try to populate defaults await devProvider.populateDefaults(tempDir); // Check that no files were copied const personasDir = path.join(tempDir, 'personas'); let dirExists = true; try { await fs.access(personasDir); } catch { dirExists = false; } if (dirExists) { const files = await fs.readdir(personasDir); // Should be empty or very minimal expect(files.length).toBe(0); } } finally { // Restore environment if (originalForceMode === undefined) { delete process.env.FORCE_PRODUCTION_MODE; } else { process.env.FORCE_PRODUCTION_MODE = originalForceMode; } if (originalLoadTestData === undefined) { delete process.env.DOLLHOUSE_LOAD_TEST_DATA; } else { process.env.DOLLHOUSE_LOAD_TEST_DATA = originalLoadTestData; } } }); it('should load test data when environment variable is set', async () => { process.env.DOLLHOUSE_LOAD_TEST_DATA = 'true'; provider = new DefaultElementProvider({ loadTestData: true }); // This would attempt to populate, but might not find data in test environment // The important part is that it doesn't skip due to development mode const consoleSpy = jest.spyOn(console, 'log'); await provider.populateDefaults(tempDir); // Should NOT see the "skipping" message when env var is set const skippingCalls = consoleSpy.mock.calls.filter(call => call.some(arg => typeof arg === 'string' && arg.includes('Skipping default element population')) ); expect(skippingCalls.length).toBe(0); consoleSpy.mockRestore(); }); it('should respect explicit config override', async () => { delete process.env.DOLLHOUSE_LOAD_TEST_DATA; // Explicitly enable test data via config provider = new DefaultElementProvider({ loadTestData: true }); const consoleSpy = jest.spyOn(console, 'log'); await provider.populateDefaults(tempDir); // Should NOT see the "skipping" message when explicitly enabled const skippingCalls = consoleSpy.mock.calls.filter(call => call.some(arg => typeof arg === 'string' && arg.includes('Skipping default element population')) ); expect(skippingCalls.length).toBe(0); consoleSpy.mockRestore(); }); it('should respect explicit config to disable', async () => { process.env.DOLLHOUSE_LOAD_TEST_DATA = 'true'; // Explicitly disable test data via config (config overrides env) provider = new DefaultElementProvider({ loadTestData: false }); const consoleSpy = jest.spyOn(console, 'log'); await provider.populateDefaults(tempDir); // Should see the "skipping" message when explicitly disabled const skippingCalls = consoleSpy.mock.calls.filter(call => call.some(arg => typeof arg === 'string' && arg.includes('Skipping default element population')) ); // Note: This behavior might vary based on implementation priorities // The test documents the expected behavior consoleSpy.mockRestore(); }); }); describe('Environment Variable Parsing', () => { it('should accept "true" as enabling test data', async () => { process.env.DOLLHOUSE_LOAD_TEST_DATA = 'true'; provider = new DefaultElementProvider({ loadTestData: true }); // The provider should be configured to load test data expect(provider['config'].loadTestData).toBe(true); }); it('should accept "1" as enabling test data', async () => { process.env.DOLLHOUSE_LOAD_TEST_DATA = '1'; provider = new DefaultElementProvider({ loadTestData: true }); // The provider should be configured to load test data expect(provider['config'].loadTestData).toBe(true); }); it('should treat other values as false', async () => { // Force development mode using FORCE_PRODUCTION_MODE const originalForceMode = process.env.FORCE_PRODUCTION_MODE; const originalLoadTestData = process.env.DOLLHOUSE_LOAD_TEST_DATA; process.env.FORCE_PRODUCTION_MODE = 'false'; process.env.DOLLHOUSE_LOAD_TEST_DATA = 'false'; try { // Create a new provider AFTER setting environment variables const devProvider = new DefaultElementProvider({ loadTestData: true }); // In development mode with "false" value, should not load test data expect(devProvider['config'].loadTestData).toBe(false); } finally { // Restore environment if (originalForceMode === undefined) { delete process.env.FORCE_PRODUCTION_MODE; } else { process.env.FORCE_PRODUCTION_MODE = originalForceMode; } if (originalLoadTestData === undefined) { delete process.env.DOLLHOUSE_LOAD_TEST_DATA; } else { process.env.DOLLHOUSE_LOAD_TEST_DATA = originalLoadTestData; } } }); }); });

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

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