@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
text/typescript
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);
}
});