Skip to main content
Glama

claude-mermaid

logger.test.ts4.23 kB
import { describe, it, expect, beforeAll, afterAll } from "vitest"; import { LogLevel, mcpLogger, webLogger, createTestLoggers } from "../src/logger.js"; import { getLogsDir } from "../src/file-utils.js"; import { readFile, mkdir, mkdtemp } from "fs/promises"; import { tmpdir } from "os"; import { join } from "path"; describe("Logger", () => { let testLogsDir: string; let testMcpLogger: ReturnType<typeof createTestLoggers>["mcpLogger"]; let testWebLogger: ReturnType<typeof createTestLoggers>["webLogger"]; let originalLogLevel: string | undefined; beforeAll(async () => { originalLogLevel = process.env.CLAUDE_MERMAID_LOG_LEVEL; // Enable logging for logger tests (setup.ts sets it to OFF) process.env.CLAUDE_MERMAID_LOG_LEVEL = "INFO"; testLogsDir = await mkdtemp(join(tmpdir(), "claude-mermaid-test-logs-")); const loggers = createTestLoggers(testLogsDir); testMcpLogger = loggers.mcpLogger; testWebLogger = loggers.webLogger; }); afterAll(() => { if (originalLogLevel) { process.env.CLAUDE_MERMAID_LOG_LEVEL = originalLogLevel; } else { delete process.env.CLAUDE_MERMAID_LOG_LEVEL; } }); describe("Log Levels", () => { it("should have correct numeric values", () => { expect(LogLevel.DEBUG).toBe(0); expect(LogLevel.INFO).toBe(1); expect(LogLevel.WARN).toBe(2); expect(LogLevel.ERROR).toBe(3); expect(LogLevel.OFF).toBe(4); }); it("should order from most to least verbose", () => { expect(LogLevel.DEBUG).toBeLessThan(LogLevel.INFO); expect(LogLevel.INFO).toBeLessThan(LogLevel.WARN); expect(LogLevel.WARN).toBeLessThan(LogLevel.ERROR); expect(LogLevel.ERROR).toBeLessThan(LogLevel.OFF); }); }); describe("Logger instances", () => { it("should create mcpLogger and webLogger", () => { expect(mcpLogger).toBeDefined(); expect(webLogger).toBeDefined(); expect(mcpLogger.info).toBeDefined(); expect(webLogger.info).toBeDefined(); }); it("should create test loggers with custom directory", () => { expect(testMcpLogger).toBeDefined(); expect(testWebLogger).toBeDefined(); expect(testMcpLogger.info).toBeDefined(); expect(testWebLogger.info).toBeDefined(); }); }); describe("Log file paths", () => { it("should use correct directory", () => { const logsDir = getLogsDir(); expect(logsDir).toContain(".config/claude-mermaid/logs"); }); it("should use custom directory for test loggers", () => { expect(testLogsDir).toContain("claude-mermaid-test-logs-"); }); }); describe("Logger behavior", () => { it("should support all log methods", () => { expect(typeof testMcpLogger.debug).toBe("function"); expect(typeof testMcpLogger.info).toBe("function"); expect(typeof testMcpLogger.warn).toBe("function"); expect(typeof testMcpLogger.error).toBe("function"); expect(typeof testWebLogger.debug).toBe("function"); expect(typeof testWebLogger.info).toBe("function"); expect(typeof testWebLogger.warn).toBe("function"); expect(typeof testWebLogger.error).toBe("function"); }); it("should write logs to test directory", async () => { testMcpLogger.info("Test message"); await new Promise((resolve) => setTimeout(resolve, 100)); const content = await readFile(join(testLogsDir, "mcp.log"), "utf-8"); expect(content).toContain("Test message"); }); it("should write to separate log files", async () => { testMcpLogger.info("MCP test message"); testWebLogger.info("Web test message"); await new Promise((resolve) => setTimeout(resolve, 100)); const mcpContent = await readFile(join(testLogsDir, "mcp.log"), "utf-8"); const webContent = await readFile(join(testLogsDir, "web.log"), "utf-8"); expect(mcpContent).toContain("MCP test message"); expect(webContent).toContain("Web test message"); }); }); describe("Error handling", () => { it("should not throw on logging errors", () => { expect(() => testMcpLogger.info("Test")).not.toThrow(); expect(() => testWebLogger.error("Test")).not.toThrow(); }); }); });

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/veelenga/claude-mermaid'

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