diff --git a/pkg/observability/logger_test.go b/pkg/observability/logger_test.go new file mode 100644 index 0000000..9ddc715 --- /dev/null +++ b/pkg/observability/logger_test.go @@ -0,0 +1,85 @@ +package observability + +import ( + "context" + "log/slog" + "testing" +) + +func TestNewLogger(t *testing.T) { + logger := NewLogger(slog.LevelInfo) + if logger == nil { + t.Fatal("NewLogger returned nil") + } +} + +func TestLogger_Debug(t *testing.T) { + logger := NewLogger(slog.LevelDebug) + // Should not panic + logger.Debug("test message", "key", "value") +} + +func TestLogger_Info(t *testing.T) { + logger := NewLogger(slog.LevelInfo) + // Should not panic + logger.Info("test message", "key", "value") +} + +func TestLogger_Warn(t *testing.T) { + logger := NewLogger(slog.LevelWarn) + // Should not panic + logger.Warn("test message", "key", "value") +} + +func TestLogger_Error(t *testing.T) { + logger := NewLogger(slog.LevelError) + // Should not panic + logger.Error("test message", "key", "value") +} + +func TestLogger_With(t *testing.T) { + logger := NewLogger(slog.LevelInfo) + contextLogger := logger.With("component", "test") + + if contextLogger == nil { + t.Fatal("With() returned nil") + } + + // Should not panic + contextLogger.Info("test message") +} + +func TestLogger_WithContext(t *testing.T) { + logger := NewLogger(slog.LevelInfo) + ctx := context.Background() + contextLogger := logger.WithContext(ctx) + + if contextLogger == nil { + t.Fatal("WithContext() returned nil") + } + + // Should not panic + contextLogger.Info("test message") +} + +func TestLogger_AllLevels(t *testing.T) { + levels := []slog.Level{ + slog.LevelDebug, + slog.LevelInfo, + slog.LevelWarn, + slog.LevelError, + } + + for _, level := range levels { + logger := NewLogger(level) + if logger == nil { + t.Errorf("NewLogger(%v) returned nil", level) + } + + // All log methods should work regardless of level + logger.Debug("debug") + logger.Info("info") + logger.Warn("warn") + logger.Error("error") + } +} diff --git a/pkg/observability/metrics_test.go b/pkg/observability/metrics_test.go new file mode 100644 index 0000000..76d3ff5 --- /dev/null +++ b/pkg/observability/metrics_test.go @@ -0,0 +1,65 @@ +package observability + +import ( + "testing" +) + +func TestNewMetrics(t *testing.T) { + metrics := NewMetrics("test") + if metrics == nil { + t.Fatal("NewMetrics returned nil") + } +} + +func TestMetrics_RecordSwapEvent(t *testing.T) { + metrics := NewMetrics("test") + + // Should not panic + metrics.RecordSwapEvent("uniswap-v2", true) + metrics.RecordSwapEvent("uniswap-v3", false) +} + +func TestMetrics_RecordParseLatency(t *testing.T) { + metrics := NewMetrics("test") + + // Should not panic + metrics.RecordParseLatency("uniswap-v2", 0.005) + metrics.RecordParseLatency("uniswap-v3", 0.003) +} + +func TestMetrics_RecordArbitrageOpportunity(t *testing.T) { + metrics := NewMetrics("test") + + // Should not panic + metrics.RecordArbitrageOpportunity(0.1) + metrics.RecordArbitrageOpportunity(0.5) +} + +func TestMetrics_RecordExecution(t *testing.T) { + metrics := NewMetrics("test") + + // Should not panic + metrics.RecordExecution(true, 0.05) + metrics.RecordExecution(false, -0.01) +} + +func TestMetrics_PoolCacheSize(t *testing.T) { + metrics := NewMetrics("test") + + // Should not panic + metrics.IncrementPoolCacheSize() + metrics.IncrementPoolCacheSize() + metrics.DecrementPoolCacheSize() +} + +func TestMetrics_AllMethods(t *testing.T) { + metrics := NewMetrics("test") + + // Test all methods in sequence + metrics.RecordSwapEvent("uniswap-v2", true) + metrics.RecordParseLatency("uniswap-v2", 0.004) + metrics.RecordArbitrageOpportunity(0.08) + metrics.RecordExecution(true, 0.05) + metrics.IncrementPoolCacheSize() + metrics.DecrementPoolCacheSize() +}