Skip to main content
Glama
Config.test.js29 kB
/** * Comprehensive tests for Config.ts * Target: Increase coverage from 60% to 85%+ * * Covers: * - Singleton pattern * - Environment variable loading * - Configuration parsing (integers, floats, booleans) * - Default values * - WordPress configuration * - Cache configuration * - Security configuration * - SEO configuration * - CI detection * - Helper methods */ import { describe, it, expect, beforeEach, afterEach } from "vitest"; import { Config, ConfigHelpers, config } from "@/config/Config.js"; describe("Config.ts - Comprehensive Coverage", () => { let originalEnv; beforeEach(() => { originalEnv = { ...process.env }; Config.reset(); // Clean environment delete process.env.NODE_ENV; delete process.env.DEBUG; delete process.env.CI; delete process.env.GITHUB_ACTIONS; delete process.env.TRAVIS; delete process.env.CIRCLECI; }); afterEach(() => { process.env = originalEnv; Config.reset(); }); describe("Singleton Pattern", () => { it("should create a single instance", () => { const instance1 = Config.getInstance(); const instance2 = Config.getInstance(); expect(instance1).toBe(instance2); expect(instance1).toBeInstanceOf(Config); }); it("should reset and create new instance", () => { const instance1 = Config.getInstance(); Config.reset(); const instance2 = Config.getInstance(); expect(instance1).not.toBe(instance2); }); it("should return configuration object", () => { const cfg = Config.getInstance().get(); expect(cfg).toBeDefined(); expect(cfg).toHaveProperty("wordpress"); expect(cfg).toHaveProperty("app"); expect(cfg).toHaveProperty("debug"); expect(cfg).toHaveProperty("cache"); expect(cfg).toHaveProperty("security"); expect(cfg).toHaveProperty("seo"); }); it("config() helper should return same object as getInstance().get()", () => { const cfg1 = config(); const cfg2 = Config.getInstance().get(); expect(cfg1).toEqual(cfg2); }); }); describe("WordPress Configuration", () => { it("should load WordPress site URL", () => { process.env.WORDPRESS_SITE_URL = "https://example.com"; Config.reset(); const cfg = config(); expect(cfg.wordpress.siteUrl).toBe("https://example.com"); }); it("should load WordPress username", () => { process.env.WORDPRESS_USERNAME = "admin"; Config.reset(); const cfg = config(); expect(cfg.wordpress.username).toBe("admin"); }); it("should load WordPress app password", () => { process.env.WORDPRESS_APP_PASSWORD = "abcd 1234 efgh 5678"; Config.reset(); const cfg = config(); expect(cfg.wordpress.appPassword).toBe("abcd 1234 efgh 5678"); }); it("should load WordPress basic auth password", () => { process.env.WORDPRESS_PASSWORD = "secret123"; Config.reset(); const cfg = config(); expect(cfg.wordpress.password).toBe("secret123"); }); it("should default to app-password auth method", () => { delete process.env.WORDPRESS_AUTH_METHOD; Config.reset(); const cfg = config(); expect(cfg.wordpress.authMethod).toBe("app-password"); }); it("should load custom auth method", () => { process.env.WORDPRESS_AUTH_METHOD = "jwt"; Config.reset(); const cfg = config(); expect(cfg.wordpress.authMethod).toBe("jwt"); }); it("should load JWT secret", () => { process.env.WORDPRESS_JWT_SECRET = "jwt-secret-key"; Config.reset(); const cfg = config(); expect(cfg.wordpress.jwtSecret).toBe("jwt-secret-key"); }); it("should load JWT password", () => { process.env.WORDPRESS_JWT_PASSWORD = "jwt-password"; Config.reset(); const cfg = config(); expect(cfg.wordpress.jwtPassword).toBe("jwt-password"); }); it("should load API key", () => { process.env.WORDPRESS_API_KEY = "api-key-123"; Config.reset(); const cfg = config(); expect(cfg.wordpress.apiKey).toBe("api-key-123"); }); it("should load cookie nonce", () => { process.env.WORDPRESS_COOKIE_NONCE = "nonce-123"; Config.reset(); const cfg = config(); expect(cfg.wordpress.cookieNonce).toBe("nonce-123"); }); it("should parse timeout as integer", () => { process.env.WORDPRESS_TIMEOUT = "60000"; Config.reset(); const cfg = config(); expect(cfg.wordpress.timeout).toBe(60000); expect(typeof cfg.wordpress.timeout).toBe("number"); }); it("should use default timeout", () => { delete process.env.WORDPRESS_TIMEOUT; Config.reset(); const cfg = config(); expect(cfg.wordpress.timeout).toBe(30000); }); it("should parse max retries as integer", () => { process.env.WORDPRESS_MAX_RETRIES = "5"; Config.reset(); const cfg = config(); expect(cfg.wordpress.maxRetries).toBe(5); expect(typeof cfg.wordpress.maxRetries).toBe("number"); }); it("should use default max retries", () => { delete process.env.WORDPRESS_MAX_RETRIES; Config.reset(); const cfg = config(); expect(cfg.wordpress.maxRetries).toBe(3); }); }); describe("App Configuration", () => { it("should detect development environment", () => { process.env.NODE_ENV = "development"; Config.reset(); const cfg = config(); expect(cfg.app.nodeEnv).toBe("development"); expect(cfg.app.isDevelopment).toBe(true); expect(cfg.app.isProduction).toBe(false); expect(cfg.app.isTest).toBe(false); expect(cfg.app.isDXT).toBe(false); }); it("should detect production environment", () => { process.env.NODE_ENV = "production"; Config.reset(); const cfg = config(); expect(cfg.app.nodeEnv).toBe("production"); expect(cfg.app.isProduction).toBe(true); expect(cfg.app.isDevelopment).toBe(false); expect(cfg.app.isTest).toBe(false); expect(cfg.app.isDXT).toBe(false); }); it("should detect test environment", () => { process.env.NODE_ENV = "test"; Config.reset(); const cfg = config(); expect(cfg.app.nodeEnv).toBe("test"); expect(cfg.app.isTest).toBe(true); expect(cfg.app.isDevelopment).toBe(false); expect(cfg.app.isProduction).toBe(false); expect(cfg.app.isDXT).toBe(false); }); it("should detect DXT environment", () => { process.env.NODE_ENV = "dxt"; Config.reset(); const cfg = config(); expect(cfg.app.nodeEnv).toBe("dxt"); expect(cfg.app.isDXT).toBe(true); expect(cfg.app.isDevelopment).toBe(false); expect(cfg.app.isProduction).toBe(false); expect(cfg.app.isTest).toBe(false); }); it("should default to development when NODE_ENV is undefined", () => { delete process.env.NODE_ENV; Config.reset(); const cfg = config(); expect(cfg.app.nodeEnv).toBe("development"); expect(cfg.app.isDevelopment).toBe(true); }); it("should detect CI from GITHUB_ACTIONS", () => { process.env.GITHUB_ACTIONS = "true"; Config.reset(); const cfg = config(); expect(cfg.app.isCI).toBe(true); }); it("should detect CI from TRAVIS", () => { process.env.TRAVIS = "true"; Config.reset(); const cfg = config(); expect(cfg.app.isCI).toBe(true); }); it("should detect CI from CIRCLECI", () => { process.env.CIRCLECI = "true"; Config.reset(); const cfg = config(); expect(cfg.app.isCI).toBe(true); }); it("should detect CI from generic CI variable", () => { process.env.CI = "true"; Config.reset(); const cfg = config(); expect(cfg.app.isCI).toBe(true); }); it("should detect CI from NODE_ENV=ci", () => { process.env.NODE_ENV = "ci"; Config.reset(); const cfg = config(); expect(cfg.app.isCI).toBe(true); }); it("should not detect CI in normal environment", () => { delete process.env.CI; delete process.env.GITHUB_ACTIONS; delete process.env.TRAVIS; delete process.env.CIRCLECI; process.env.NODE_ENV = "development"; Config.reset(); const cfg = config(); expect(cfg.app.isCI).toBe(false); }); }); describe("Debug Configuration", () => { it("should enable debug when DEBUG=true", () => { process.env.DEBUG = "true"; Config.reset(); const cfg = config(); expect(cfg.debug.enabled).toBe(true); }); it("should disable debug by default", () => { delete process.env.DEBUG; Config.reset(); const cfg = config(); expect(cfg.debug.enabled).toBe(false); }); it("should load log level", () => { process.env.LOG_LEVEL = "debug"; Config.reset(); const cfg = config(); expect(cfg.debug.logLevel).toBe("debug"); }); it("should default to info log level", () => { delete process.env.LOG_LEVEL; Config.reset(); const cfg = config(); expect(cfg.debug.logLevel).toBe("info"); }); }); describe("Cache Configuration", () => { it("should enable cache by default", () => { delete process.env.CACHE_DISABLED; delete process.env.DISABLE_CACHE; Config.reset(); const cfg = config(); expect(cfg.cache.disabled).toBe(false); }); it("should disable cache with CACHE_DISABLED=true", () => { process.env.CACHE_DISABLED = "true"; Config.reset(); const cfg = config(); expect(cfg.cache.disabled).toBe(true); }); it("should disable cache with DISABLE_CACHE=true", () => { process.env.DISABLE_CACHE = "true"; Config.reset(); const cfg = config(); expect(cfg.cache.disabled).toBe(true); }); it("should handle truthy values for cache disable", () => { const truthyValues = ["true", "1", "yes", "on", "enable", "enabled"]; truthyValues.forEach((value) => { process.env.CACHE_DISABLED = value; Config.reset(); const cfg = config(); expect(cfg.cache.disabled).toBe(true); }); }); it("should handle falsy values for cache disable", () => { const falsyValues = ["false", "0", "no", "off"]; falsyValues.forEach((value) => { process.env.CACHE_DISABLED = value; Config.reset(); const cfg = config(); expect(cfg.cache.disabled).toBe(false); }); }); it("should parse cache TTL as integer", () => { process.env.CACHE_TTL = "600"; Config.reset(); const cfg = config(); expect(cfg.cache.ttl).toBe(600); expect(typeof cfg.cache.ttl).toBe("number"); }); it("should use default cache TTL", () => { delete process.env.CACHE_TTL; Config.reset(); const cfg = config(); expect(cfg.cache.ttl).toBe(300); }); it("should parse cache max items", () => { process.env.CACHE_MAX_ITEMS = "5000"; Config.reset(); const cfg = config(); expect(cfg.cache.maxItems).toBe(5000); }); it("should use default cache max items", () => { delete process.env.CACHE_MAX_ITEMS; Config.reset(); const cfg = config(); expect(cfg.cache.maxItems).toBe(1000); }); it("should parse cache max memory MB", () => { process.env.CACHE_MAX_MEMORY_MB = "100"; Config.reset(); const cfg = config(); expect(cfg.cache.maxMemoryMB).toBe(100); }); it("should use default cache max memory", () => { delete process.env.CACHE_MAX_MEMORY_MB; Config.reset(); const cfg = config(); expect(cfg.cache.maxMemoryMB).toBe(50); }); }); describe("Security Configuration", () => { it("should enable rate limiting by default", () => { delete process.env.RATE_LIMIT_ENABLED; Config.reset(); const cfg = config(); expect(cfg.security.rateLimitEnabled).toBe(true); }); it("should disable rate limiting when explicitly disabled", () => { process.env.RATE_LIMIT_ENABLED = "false"; Config.reset(); const cfg = config(); expect(cfg.security.rateLimitEnabled).toBe(false); }); it("should parse rate limit requests", () => { process.env.RATE_LIMIT_REQUESTS = "200"; Config.reset(); const cfg = config(); expect(cfg.security.rateLimitRequests).toBe(200); }); it("should use default rate limit requests", () => { delete process.env.RATE_LIMIT_REQUESTS; Config.reset(); const cfg = config(); expect(cfg.security.rateLimitRequests).toBe(100); }); it("should parse rate limit window", () => { process.env.RATE_LIMIT_WINDOW = "120000"; Config.reset(); const cfg = config(); expect(cfg.security.rateLimitWindow).toBe(120000); }); it("should use default rate limit window", () => { delete process.env.RATE_LIMIT_WINDOW; Config.reset(); const cfg = config(); expect(cfg.security.rateLimitWindow).toBe(60000); }); it("should parse rate limit", () => { process.env.RATE_LIMIT = "120"; Config.reset(); const cfg = config(); expect(cfg.security.rateLimit).toBe(120); }); it("should use default rate limit", () => { delete process.env.RATE_LIMIT; Config.reset(); const cfg = config(); expect(cfg.security.rateLimit).toBe(60); }); it("should disable strict mode by default", () => { delete process.env.SECURITY_STRICT_MODE; Config.reset(); const cfg = config(); expect(cfg.security.strictMode).toBe(false); }); it("should enable strict mode when set", () => { process.env.SECURITY_STRICT_MODE = "true"; Config.reset(); const cfg = config(); expect(cfg.security.strictMode).toBe(true); }); }); describe("Error Configuration", () => { it("should enable legacy logs by default", () => { delete process.env.LEGACY_ERROR_LOGS; Config.reset(); const cfg = config(); expect(cfg.error.legacyLogsEnabled).toBe(true); }); it("should disable legacy logs when set to 0", () => { process.env.LEGACY_ERROR_LOGS = "0"; Config.reset(); const cfg = config(); expect(cfg.error.legacyLogsEnabled).toBe(false); }); }); describe("Testing Configuration", () => { it("should parse coverage tolerance as float", () => { process.env.COVERAGE_TOLERANCE = "0.95"; Config.reset(); const cfg = config(); expect(cfg.testing.coverageTolerance).toBe(0.95); expect(typeof cfg.testing.coverageTolerance).toBe("number"); }); it("should use default coverage tolerance", () => { delete process.env.COVERAGE_TOLERANCE; Config.reset(); const cfg = config(); expect(cfg.testing.coverageTolerance).toBe(1.0); }); it("should skip pact tests when enabled", () => { process.env.SKIP_PACT_TESTS = "true"; Config.reset(); const cfg = config(); expect(cfg.testing.skipPactTests).toBe(true); }); it("should not skip pact tests by default", () => { delete process.env.SKIP_PACT_TESTS; Config.reset(); const cfg = config(); expect(cfg.testing.skipPactTests).toBe(false); }); it("should enable performance tests when set", () => { process.env.PERFORMANCE_TEST = "true"; Config.reset(); const cfg = config(); expect(cfg.testing.performanceTest).toBe(true); }); it("should disable performance tests by default", () => { delete process.env.PERFORMANCE_TEST; Config.reset(); const cfg = config(); expect(cfg.testing.performanceTest).toBe(false); }); }); describe("CI Configuration", () => { it("should detect GitHub Actions provider", () => { process.env.GITHUB_ACTIONS = "true"; Config.reset(); const cfg = config(); expect(cfg.ci.isCI).toBe(true); expect(cfg.ci.provider).toBe("github-actions"); expect(cfg.ci.isGitHubActions).toBe(true); expect(cfg.ci.isTravis).toBe(false); expect(cfg.ci.isCircleCI).toBe(false); }); it("should detect Travis provider", () => { process.env.TRAVIS = "true"; Config.reset(); const cfg = config(); expect(cfg.ci.isCI).toBe(true); expect(cfg.ci.provider).toBe("travis"); expect(cfg.ci.isTravis).toBe(true); expect(cfg.ci.isGitHubActions).toBe(false); expect(cfg.ci.isCircleCI).toBe(false); }); it("should detect CircleCI provider", () => { process.env.CIRCLECI = "true"; Config.reset(); const cfg = config(); expect(cfg.ci.isCI).toBe(true); expect(cfg.ci.provider).toBe("circleci"); expect(cfg.ci.isCircleCI).toBe(true); expect(cfg.ci.isGitHubActions).toBe(false); expect(cfg.ci.isTravis).toBe(false); }); it("should detect generic CI provider", () => { process.env.CI = "true"; Config.reset(); const cfg = config(); expect(cfg.ci.isCI).toBe(true); expect(cfg.ci.provider).toBe("generic"); }); it("should return null provider when not in CI", () => { delete process.env.CI; delete process.env.GITHUB_ACTIONS; delete process.env.TRAVIS; delete process.env.CIRCLECI; Config.reset(); const cfg = config(); expect(cfg.ci.isCI).toBe(false); expect(cfg.ci.provider).toBeNull(); }); }); describe("SEO Configuration", () => { it("should enable SEO by default", () => { delete process.env.SEO_ENABLED; Config.reset(); const cfg = config(); expect(cfg.seo.enabled).toBe(true); }); it("should disable SEO when set", () => { process.env.SEO_ENABLED = "false"; Config.reset(); const cfg = config(); expect(cfg.seo.enabled).toBe(false); }); it("should load SEO provider settings", () => { process.env.SEO_PROVIDER_SEARCH_CONSOLE = "true"; process.env.SEO_PROVIDER_DATAFORSEO = "true"; process.env.SEO_PROVIDER_AHREFS = "true"; Config.reset(); const cfg = config(); expect(cfg.seo.providers.searchConsole).toBe(true); expect(cfg.seo.providers.dataForSEO).toBe(true); expect(cfg.seo.providers.ahrefs).toBe(true); }); it("should disable SEO providers by default", () => { delete process.env.SEO_PROVIDER_SEARCH_CONSOLE; delete process.env.SEO_PROVIDER_DATAFORSEO; delete process.env.SEO_PROVIDER_AHREFS; Config.reset(); const cfg = config(); expect(cfg.seo.providers.searchConsole).toBe(false); expect(cfg.seo.providers.dataForSEO).toBe(false); expect(cfg.seo.providers.ahrefs).toBe(false); }); it("should parse SEO limit integers", () => { process.env.SEO_BULK_OPERATION_SIZE = "20"; process.env.SEO_RATE_LIMIT_PER_MINUTE = "60"; process.env.SEO_MAX_CONCURRENT_ANALYSIS = "10"; Config.reset(); const cfg = config(); expect(cfg.seo.limits.bulkOperationSize).toBe(20); expect(cfg.seo.limits.rateLimitPerMinute).toBe(60); expect(cfg.seo.limits.maxConcurrentAnalysis).toBe(10); }); it("should use default SEO limits", () => { delete process.env.SEO_BULK_OPERATION_SIZE; delete process.env.SEO_RATE_LIMIT_PER_MINUTE; delete process.env.SEO_MAX_CONCURRENT_ANALYSIS; Config.reset(); const cfg = config(); expect(cfg.seo.limits.bulkOperationSize).toBe(10); expect(cfg.seo.limits.rateLimitPerMinute).toBe(30); expect(cfg.seo.limits.maxConcurrentAnalysis).toBe(5); }); it("should parse SEO cache TTL values", () => { process.env.SEO_CACHE_ANALYSIS_TTL = "43200"; process.env.SEO_CACHE_SCHEMA_TTL = "172800"; process.env.SEO_CACHE_AUDIT_TTL = "7200"; process.env.SEO_CACHE_KEYWORDS_TTL = "1209600"; Config.reset(); const cfg = config(); expect(cfg.seo.cache.analysisTTL).toBe(43200); expect(cfg.seo.cache.schemaTTL).toBe(172800); expect(cfg.seo.cache.auditTTL).toBe(7200); expect(cfg.seo.cache.keywordsTTL).toBe(1209600); }); it("should use default SEO cache TTL values", () => { delete process.env.SEO_CACHE_ANALYSIS_TTL; delete process.env.SEO_CACHE_SCHEMA_TTL; delete process.env.SEO_CACHE_AUDIT_TTL; delete process.env.SEO_CACHE_KEYWORDS_TTL; Config.reset(); const cfg = config(); expect(cfg.seo.cache.analysisTTL).toBe(21600); // 6 hours expect(cfg.seo.cache.schemaTTL).toBe(86400); // 24 hours expect(cfg.seo.cache.auditTTL).toBe(3600); // 1 hour expect(cfg.seo.cache.keywordsTTL).toBe(604800); // 7 days }); it("should parse SEO metadata lengths", () => { process.env.SEO_TITLE_MAX_LENGTH = "70"; process.env.SEO_DESCRIPTION_MAX_LENGTH = "200"; process.env.SEO_DESCRIPTION_MIN_LENGTH = "150"; Config.reset(); const cfg = config(); expect(cfg.seo.metadata.titleMaxLength).toBe(70); expect(cfg.seo.metadata.descriptionMaxLength).toBe(200); expect(cfg.seo.metadata.descriptionMinLength).toBe(150); }); it("should use default SEO metadata lengths", () => { delete process.env.SEO_TITLE_MAX_LENGTH; delete process.env.SEO_DESCRIPTION_MAX_LENGTH; delete process.env.SEO_DESCRIPTION_MIN_LENGTH; Config.reset(); const cfg = config(); expect(cfg.seo.metadata.titleMaxLength).toBe(60); expect(cfg.seo.metadata.descriptionMaxLength).toBe(160); expect(cfg.seo.metadata.descriptionMinLength).toBe(155); }); it("should parse SEO analysis floats", () => { process.env.SEO_MIN_WORD_COUNT = "500"; process.env.SEO_TARGET_KEYWORD_DENSITY = "3.0"; process.env.SEO_MAX_KEYWORD_DENSITY = "4.5"; process.env.SEO_MIN_READABILITY_SCORE = "70"; Config.reset(); const cfg = config(); expect(cfg.seo.analysis.minWordCount).toBe(500); expect(cfg.seo.analysis.targetKeywordDensity).toBe(3.0); expect(cfg.seo.analysis.maxKeywordDensity).toBe(4.5); expect(cfg.seo.analysis.minReadabilityScore).toBe(70); }); it("should use default SEO analysis values", () => { delete process.env.SEO_MIN_WORD_COUNT; delete process.env.SEO_TARGET_KEYWORD_DENSITY; delete process.env.SEO_MAX_KEYWORD_DENSITY; delete process.env.SEO_MIN_READABILITY_SCORE; Config.reset(); const cfg = config(); expect(cfg.seo.analysis.minWordCount).toBe(300); expect(cfg.seo.analysis.targetKeywordDensity).toBe(2.5); expect(cfg.seo.analysis.maxKeywordDensity).toBe(3.5); expect(cfg.seo.analysis.minReadabilityScore).toBe(60); }); }); describe("Instance Methods", () => { it("shouldDebug() should return true when debug enabled", () => { process.env.DEBUG = "true"; process.env.NODE_ENV = "development"; Config.reset(); const instance = Config.getInstance(); expect(instance.shouldDebug()).toBe(true); }); it("shouldDebug() should return false when debug disabled", () => { delete process.env.DEBUG; Config.reset(); const instance = Config.getInstance(); expect(instance.shouldDebug()).toBe(false); }); it("shouldDebug() should return false in DXT mode", () => { process.env.DEBUG = "true"; process.env.NODE_ENV = "dxt"; Config.reset(); const instance = Config.getInstance(); expect(instance.shouldDebug()).toBe(false); }); it("shouldUseCache() should return true when cache enabled", () => { delete process.env.CACHE_DISABLED; Config.reset(); const instance = Config.getInstance(); expect(instance.shouldUseCache()).toBe(true); }); it("shouldUseCache() should return false when cache disabled", () => { process.env.CACHE_DISABLED = "true"; Config.reset(); const instance = Config.getInstance(); expect(instance.shouldUseCache()).toBe(false); }); it("shouldLogInfo() should return true in development", () => { process.env.NODE_ENV = "development"; Config.reset(); const instance = Config.getInstance(); expect(instance.shouldLogInfo()).toBe(true); }); it("shouldLogInfo() should return false in test mode", () => { process.env.NODE_ENV = "test"; Config.reset(); const instance = Config.getInstance(); expect(instance.shouldLogInfo()).toBe(false); }); it("shouldLogInfo() should return false in DXT mode", () => { process.env.NODE_ENV = "dxt"; Config.reset(); const instance = Config.getInstance(); expect(instance.shouldLogInfo()).toBe(false); }); it("hasWordPressConfig() should return true when fully configured", () => { process.env.WORDPRESS_SITE_URL = "https://example.com"; process.env.WORDPRESS_USERNAME = "admin"; process.env.WORDPRESS_APP_PASSWORD = "password"; Config.reset(); const instance = Config.getInstance(); expect(instance.hasWordPressConfig()).toBe(true); }); it("hasWordPressConfig() should return false when missing site URL", () => { delete process.env.WORDPRESS_SITE_URL; process.env.WORDPRESS_USERNAME = "admin"; process.env.WORDPRESS_APP_PASSWORD = "password"; Config.reset(); const instance = Config.getInstance(); expect(instance.hasWordPressConfig()).toBe(false); }); it("hasWordPressConfig() should return false when missing username", () => { process.env.WORDPRESS_SITE_URL = "https://example.com"; delete process.env.WORDPRESS_USERNAME; process.env.WORDPRESS_APP_PASSWORD = "password"; Config.reset(); const instance = Config.getInstance(); expect(instance.hasWordPressConfig()).toBe(false); }); it("hasWordPressConfig() should return false when missing password", () => { process.env.WORDPRESS_SITE_URL = "https://example.com"; process.env.WORDPRESS_USERNAME = "admin"; delete process.env.WORDPRESS_APP_PASSWORD; Config.reset(); const instance = Config.getInstance(); expect(instance.hasWordPressConfig()).toBe(false); }); it("getOperationTimeout() should return 5s in test mode", () => { process.env.NODE_ENV = "test"; Config.reset(); const instance = Config.getInstance(); expect(instance.getOperationTimeout()).toBe(5000); }); it("getOperationTimeout() should return 30s in CI", () => { process.env.CI = "true"; process.env.NODE_ENV = "development"; Config.reset(); const instance = Config.getInstance(); expect(instance.getOperationTimeout()).toBe(30000); }); it("getOperationTimeout() should return 60s in development/production", () => { process.env.NODE_ENV = "development"; delete process.env.CI; Config.reset(); const instance = Config.getInstance(); expect(instance.getOperationTimeout()).toBe(60000); }); }); describe("ConfigHelpers", () => { it("should provide environment checks", () => { process.env.NODE_ENV = "development"; Config.reset(); expect(ConfigHelpers.isDev()).toBe(true); expect(ConfigHelpers.isProd()).toBe(false); expect(ConfigHelpers.isTest()).toBe(false); expect(ConfigHelpers.isDXT()).toBe(false); expect(ConfigHelpers.isCI()).toBe(false); }); it("should provide feature flags", () => { process.env.DEBUG = "true"; process.env.NODE_ENV = "development"; delete process.env.CACHE_DISABLED; process.env.WORDPRESS_SITE_URL = "https://example.com"; process.env.WORDPRESS_USERNAME = "admin"; process.env.WORDPRESS_APP_PASSWORD = "password"; Config.reset(); expect(ConfigHelpers.shouldDebug()).toBe(true); expect(ConfigHelpers.shouldUseCache()).toBe(true); expect(ConfigHelpers.shouldLogInfo()).toBe(true); expect(ConfigHelpers.hasWordPressConfig()).toBe(true); }); it("should provide timeout helpers", () => { process.env.NODE_ENV = "development"; delete process.env.CI; Config.reset(); const operationTimeout = ConfigHelpers.getTimeout("operation"); const uploadTimeout = ConfigHelpers.getTimeout("upload"); const testTimeout = ConfigHelpers.getTimeout("test"); expect(operationTimeout).toBe(60000); expect(uploadTimeout).toBe(300000); // 5x operation expect(testTimeout).toBe(10000); }); it("should return operation timeout as default", () => { process.env.NODE_ENV = "development"; Config.reset(); const defaultTimeout = ConfigHelpers.getTimeout(); const operationTimeout = ConfigHelpers.getTimeout("operation"); expect(defaultTimeout).toBe(operationTimeout); }); }); });

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/docdyhr/mcp-wordpress'

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