UNPKG

@agentics.org/sparc2

Version:

SPARC 2.0 - Autonomous Vector Coding Agent + MCP. SPARC 2.0, vectorized AI code analysis, is an intelligent coding agent framework built to automate and streamline software development. It combines secure execution environments, and version control into a

277 lines (229 loc) 8.97 kB
import { assertEquals, assertStringIncludes, } from "https://deno.land/std@0.203.0/testing/asserts.ts"; // Import the real functions for reference import * as realLogger from "./logger.ts"; // Track calls to our mock function let vectorStoreLogCalls: any[] = []; // Create mock implementations of the logger functions const mockVectorStoreLog = async (entry: any) => { vectorStoreLogCalls.push(entry); return Promise.resolve(); }; // Variable to hold the current implementation of mockVectorStoreLog let currentMockVectorStoreLog = mockVectorStoreLog; // Create a mock version of logMessage that uses our mock vectorStoreLog async function logMessage( level: realLogger.LogLevel, message: string, metadata: Record<string, unknown> = {}, ): Promise<void> { const logEntry: realLogger.LogEntry = { timestamp: new Date().toISOString(), level, message, metadata, }; // Format the message the same way the real logger does const formattedMessage = formatLogMessage(logEntry); // Use different console methods based on log level switch (level) { case "error": console.error(formattedMessage); break; case "warn": console.warn(formattedMessage); break; case "debug": console.debug(formattedMessage); break; case "info": default: console.log(formattedMessage); } // Call our mock vectorStoreLog try { await currentMockVectorStoreLog(logEntry); } catch (error) { // Don't let vector store errors affect the application const errorMessage = error instanceof Error ? error.message : String(error); console.error(`Failed to store log in vector store: ${errorMessage}`); } } // Helper function to format log messages (copied from the real logger) function formatLogMessage(entry: realLogger.LogEntry): string { const { timestamp, level, message, metadata } = entry; const metadataStr = Object.keys(metadata).length > 0 ? `\n ${JSON.stringify(metadata, null, 2)}` : ""; return `[${timestamp}] [${level.toUpperCase()}] ${message}${metadataStr}`; } // Convenience methods that call our mock logMessage async function logInfo(message: string, metadata: Record<string, unknown> = {}): Promise<void> { return logMessage("info", message, metadata); } async function logError(message: string, metadata: Record<string, unknown> = {}): Promise<void> { return logMessage("error", message, metadata); } async function logDebug(message: string, metadata: Record<string, unknown> = {}): Promise<void> { return logMessage("debug", message, metadata); } async function logWarn(message: string, metadata: Record<string, unknown> = {}): Promise<void> { return logMessage("warn", message, metadata); } // Setup and teardown for each test function setupMocks() { // Mock console methods const originalConsole = { log: console.log, error: console.error, warn: console.warn, debug: console.debug, }; // Create console mocks that capture calls const consoleCalls = { log: [] as string[], error: [] as string[], warn: [] as string[], debug: [] as string[], }; console.log = (message: string) => { consoleCalls.log.push(message); // Uncomment for debugging: originalConsole.log(message); }; console.error = (message: string) => { consoleCalls.error.push(message); // Uncomment for debugging: originalConsole.error(message); }; console.warn = (message: string) => { consoleCalls.warn.push(message); // Uncomment for debugging: originalConsole.warn(message); }; console.debug = (message: string) => { consoleCalls.debug.push(message); // Uncomment for debugging: originalConsole.debug(message); }; // Reset vector store log calls vectorStoreLogCalls = []; return { originalConsole, consoleCalls }; } function restoreMocks(originalConsole: any) { // Restore original console methods console.log = originalConsole.log; console.error = originalConsole.error; console.warn = originalConsole.warn; console.debug = originalConsole.debug; } Deno.test("logMessage logs to console with correct level", async () => { const { originalConsole, consoleCalls } = setupMocks(); try { // Test info level await logMessage("info", "Test info message"); assertEquals(consoleCalls.log.length, 1); assertStringIncludes(consoleCalls.log[0], "[INFO] Test info message"); // Test error level await logMessage("error", "Test error message"); assertEquals(consoleCalls.error.length, 1); assertStringIncludes(consoleCalls.error[0], "[ERROR] Test error message"); // Test warn level await logMessage("warn", "Test warn message"); assertEquals(consoleCalls.warn.length, 1); assertStringIncludes(consoleCalls.warn[0], "[WARN] Test warn message"); // Test debug level await logMessage("debug", "Test debug message"); assertEquals(consoleCalls.debug.length, 1); assertStringIncludes(consoleCalls.debug[0], "[DEBUG] Test debug message"); } finally { restoreMocks(originalConsole); } }); Deno.test("logMessage includes metadata in log output", async () => { const { originalConsole, consoleCalls } = setupMocks(); try { const metadata = { userId: 123, action: "login" }; await logMessage("info", "Test with metadata", metadata); assertEquals(consoleCalls.log.length, 1); assertStringIncludes(consoleCalls.log[0], "userId"); assertStringIncludes(consoleCalls.log[0], "123"); assertStringIncludes(consoleCalls.log[0], "action"); assertStringIncludes(consoleCalls.log[0], "login"); } finally { restoreMocks(originalConsole); } }); Deno.test("logMessage calls vectorStoreLog with correct data", async () => { const { originalConsole } = setupMocks(); try { const metadata = { userId: 123 }; await logMessage("info", "Test vector store", metadata); assertEquals(vectorStoreLogCalls.length, 1); assertEquals(vectorStoreLogCalls[0].level, "info"); assertEquals(vectorStoreLogCalls[0].message, "Test vector store"); assertEquals(vectorStoreLogCalls[0].metadata, metadata); // Check timestamp is a string (we can't know the exact value) assertEquals(typeof vectorStoreLogCalls[0].timestamp, "string"); } finally { restoreMocks(originalConsole); } }); Deno.test("logMessage handles vectorStoreLog errors gracefully", async () => { const { originalConsole, consoleCalls } = setupMocks(); // Save the original implementation const originalMockVectorStoreLog = currentMockVectorStoreLog; try { // Save the original mockVectorStoreLog function // Replace mockVectorStoreLog with a function that throws an error currentMockVectorStoreLog = async () => { throw new Error("Test error"); }; await logMessage("info", "This should not fail"); // Should still log the original message assertEquals(consoleCalls.log.length, 1); assertStringIncludes(consoleCalls.log[0], "This should not fail"); // Should log the error about vector store assertEquals(consoleCalls.error.length, 1); assertStringIncludes(consoleCalls.error[0], "Failed to store log in vector store"); } finally { // Restore the original mockVectorStoreLog function currentMockVectorStoreLog = originalMockVectorStoreLog; restoreMocks(originalConsole); } }); Deno.test("convenience methods call logMessage with correct parameters", async () => { const { originalConsole } = setupMocks(); try { // Test logInfo await logInfo("Info message", { source: "test" }); assertEquals(vectorStoreLogCalls.length, 1); assertEquals(vectorStoreLogCalls[0].level, "info"); assertEquals(vectorStoreLogCalls[0].message, "Info message"); assertEquals(vectorStoreLogCalls[0].metadata.source, "test"); // Clear calls vectorStoreLogCalls = []; // Test logError await logError("Error message", { source: "test" }); assertEquals(vectorStoreLogCalls.length, 1); assertEquals(vectorStoreLogCalls[0].level, "error"); assertEquals(vectorStoreLogCalls[0].message, "Error message"); assertEquals(vectorStoreLogCalls[0].metadata.source, "test"); // Clear calls vectorStoreLogCalls = []; // Test logDebug await logDebug("Debug message", { source: "test" }); assertEquals(vectorStoreLogCalls.length, 1); assertEquals(vectorStoreLogCalls[0].level, "debug"); assertEquals(vectorStoreLogCalls[0].message, "Debug message"); assertEquals(vectorStoreLogCalls[0].metadata.source, "test"); // Clear calls vectorStoreLogCalls = []; // Test logWarn await logWarn("Warn message", { source: "test" }); assertEquals(vectorStoreLogCalls.length, 1); assertEquals(vectorStoreLogCalls[0].level, "warn"); assertEquals(vectorStoreLogCalls[0].message, "Warn message"); assertEquals(vectorStoreLogCalls[0].metadata.source, "test"); } finally { restoreMocks(originalConsole); } });