test: Add comprehensive test suite for secret manager - CLI, debug, secret, and vault tests with in-memory filesystem for fast isolated testing
This commit is contained in:
@@ -0,0 +1,141 @@
|
||||
package secret
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"log/slog"
|
||||
"os"
|
||||
"strings"
|
||||
"syscall"
|
||||
"testing"
|
||||
|
||||
"golang.org/x/term"
|
||||
)
|
||||
|
||||
func TestDebugLogging(t *testing.T) {
|
||||
// Save original GODEBUG and restore it
|
||||
originalGodebug := os.Getenv("GODEBUG")
|
||||
defer func() {
|
||||
if originalGodebug == "" {
|
||||
os.Unsetenv("GODEBUG")
|
||||
} else {
|
||||
os.Setenv("GODEBUG", originalGodebug)
|
||||
}
|
||||
// Re-initialize debug system with original setting
|
||||
initDebugLogging()
|
||||
}()
|
||||
|
||||
tests := []struct {
|
||||
name string
|
||||
godebug string
|
||||
expectEnabled bool
|
||||
}{
|
||||
{
|
||||
name: "debug enabled",
|
||||
godebug: "berlin.sneak.pkg.secret",
|
||||
expectEnabled: true,
|
||||
},
|
||||
{
|
||||
name: "debug enabled with other flags",
|
||||
godebug: "other=1,berlin.sneak.pkg.secret,another=value",
|
||||
expectEnabled: true,
|
||||
},
|
||||
{
|
||||
name: "debug disabled",
|
||||
godebug: "other=1",
|
||||
expectEnabled: false,
|
||||
},
|
||||
{
|
||||
name: "debug disabled empty",
|
||||
godebug: "",
|
||||
expectEnabled: false,
|
||||
},
|
||||
}
|
||||
|
||||
for _, tt := range tests {
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
// Set GODEBUG
|
||||
if tt.godebug == "" {
|
||||
os.Unsetenv("GODEBUG")
|
||||
} else {
|
||||
os.Setenv("GODEBUG", tt.godebug)
|
||||
}
|
||||
|
||||
// Re-initialize debug system
|
||||
initDebugLogging()
|
||||
|
||||
// Test if debug is enabled
|
||||
enabled := IsDebugEnabled()
|
||||
if enabled != tt.expectEnabled {
|
||||
t.Errorf("IsDebugEnabled() = %v, want %v", enabled, tt.expectEnabled)
|
||||
}
|
||||
|
||||
// If debug should be enabled, test that debug output works
|
||||
if tt.expectEnabled {
|
||||
// Capture debug output by redirecting the colorized handler
|
||||
var buf bytes.Buffer
|
||||
|
||||
// Override the debug logger for testing
|
||||
oldLogger := debugLogger
|
||||
if term.IsTerminal(int(syscall.Stderr)) {
|
||||
// TTY: use colorized handler with our buffer
|
||||
debugLogger = slog.New(newColorizedHandler(&buf))
|
||||
} else {
|
||||
// Non-TTY: use JSON handler with our buffer
|
||||
debugLogger = slog.New(slog.NewJSONHandler(&buf, &slog.HandlerOptions{
|
||||
Level: slog.LevelDebug,
|
||||
}))
|
||||
}
|
||||
|
||||
// Test debug output
|
||||
Debug("test message", "key", "value")
|
||||
|
||||
// Restore original logger
|
||||
debugLogger = oldLogger
|
||||
|
||||
// Check that output was generated
|
||||
output := buf.String()
|
||||
if !strings.Contains(output, "test message") {
|
||||
t.Errorf("Debug output does not contain expected message. Got: %s", output)
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func TestDebugFunctions(t *testing.T) {
|
||||
// Enable debug for testing
|
||||
originalGodebug := os.Getenv("GODEBUG")
|
||||
os.Setenv("GODEBUG", "berlin.sneak.pkg.secret")
|
||||
defer func() {
|
||||
if originalGodebug == "" {
|
||||
os.Unsetenv("GODEBUG")
|
||||
} else {
|
||||
os.Setenv("GODEBUG", originalGodebug)
|
||||
}
|
||||
initDebugLogging()
|
||||
}()
|
||||
|
||||
initDebugLogging()
|
||||
|
||||
if !IsDebugEnabled() {
|
||||
t.Skip("Debug not enabled, skipping debug function tests")
|
||||
}
|
||||
|
||||
// Test that debug functions don't panic and can be called
|
||||
t.Run("Debug", func(t *testing.T) {
|
||||
Debug("test debug message")
|
||||
Debug("test with args", "key", "value", "number", 42)
|
||||
})
|
||||
|
||||
t.Run("DebugF", func(t *testing.T) {
|
||||
DebugF("formatted message: %s %d", "test", 123)
|
||||
})
|
||||
|
||||
t.Run("DebugWith", func(t *testing.T) {
|
||||
DebugWith("structured message",
|
||||
slog.String("string_key", "string_value"),
|
||||
slog.Int("int_key", 42),
|
||||
slog.Bool("bool_key", true),
|
||||
)
|
||||
})
|
||||
}
|
||||
Reference in New Issue
Block a user