Pulse/internal/monitoring/monitor_test.go
rcourtman c729b8c649 test: Add monitoring tests for parseDurationEnv, parseIntEnv, markFailed, logNodeMemorySource
Add comprehensive test coverage for:
- parseDurationEnv: empty/unset env, valid durations, invalid inputs
- parseIntEnv: empty/unset env, valid integers, invalid inputs
- markFailed: status setting, timestamps, failure reason
- logNodeMemorySource: nil handling, source change detection, log levels

All four functions now at 100% coverage (up from 0-78%).
2025-12-01 17:59:20 +00:00

164 lines
4.4 KiB
Go

package monitoring
import (
"testing"
"time"
)
func TestParseDurationEnv(t *testing.T) {
const testKey = "TEST_DURATION_ENV"
defaultVal := 30 * time.Second
t.Run("empty env var returns default", func(t *testing.T) {
t.Setenv(testKey, "")
result := parseDurationEnv(testKey, defaultVal)
if result != defaultVal {
t.Errorf("expected %v, got %v", defaultVal, result)
}
})
t.Run("unset env var returns default", func(t *testing.T) {
// t.Setenv automatically cleans up, so not setting means unset
result := parseDurationEnv("UNSET_DURATION_KEY_12345", defaultVal)
if result != defaultVal {
t.Errorf("expected %v, got %v", defaultVal, result)
}
})
t.Run("valid duration seconds", func(t *testing.T) {
t.Setenv(testKey, "1s")
result := parseDurationEnv(testKey, defaultVal)
expected := 1 * time.Second
if result != expected {
t.Errorf("expected %v, got %v", expected, result)
}
})
t.Run("valid duration minutes", func(t *testing.T) {
t.Setenv(testKey, "5m")
result := parseDurationEnv(testKey, defaultVal)
expected := 5 * time.Minute
if result != expected {
t.Errorf("expected %v, got %v", expected, result)
}
})
t.Run("valid duration composite", func(t *testing.T) {
t.Setenv(testKey, "2h30m")
result := parseDurationEnv(testKey, defaultVal)
expected := 2*time.Hour + 30*time.Minute
if result != expected {
t.Errorf("expected %v, got %v", expected, result)
}
})
t.Run("valid duration milliseconds", func(t *testing.T) {
t.Setenv(testKey, "500ms")
result := parseDurationEnv(testKey, defaultVal)
expected := 500 * time.Millisecond
if result != expected {
t.Errorf("expected %v, got %v", expected, result)
}
})
t.Run("invalid duration returns default", func(t *testing.T) {
t.Setenv(testKey, "invalid")
result := parseDurationEnv(testKey, defaultVal)
if result != defaultVal {
t.Errorf("expected default %v, got %v", defaultVal, result)
}
})
t.Run("numeric without unit returns default", func(t *testing.T) {
t.Setenv(testKey, "100")
result := parseDurationEnv(testKey, defaultVal)
if result != defaultVal {
t.Errorf("expected default %v, got %v", defaultVal, result)
}
})
t.Run("negative duration parses correctly", func(t *testing.T) {
t.Setenv(testKey, "-5s")
result := parseDurationEnv(testKey, defaultVal)
expected := -5 * time.Second
if result != expected {
t.Errorf("expected %v, got %v", expected, result)
}
})
}
func TestParseIntEnv(t *testing.T) {
const testKey = "TEST_INT_ENV"
defaultVal := 42
t.Run("empty env var returns default", func(t *testing.T) {
t.Setenv(testKey, "")
result := parseIntEnv(testKey, defaultVal)
if result != defaultVal {
t.Errorf("expected %d, got %d", defaultVal, result)
}
})
t.Run("unset env var returns default", func(t *testing.T) {
result := parseIntEnv("UNSET_INT_KEY_12345", defaultVal)
if result != defaultVal {
t.Errorf("expected %d, got %d", defaultVal, result)
}
})
t.Run("valid positive integer", func(t *testing.T) {
t.Setenv(testKey, "100")
result := parseIntEnv(testKey, defaultVal)
if result != 100 {
t.Errorf("expected 100, got %d", result)
}
})
t.Run("valid zero", func(t *testing.T) {
t.Setenv(testKey, "0")
result := parseIntEnv(testKey, defaultVal)
if result != 0 {
t.Errorf("expected 0, got %d", result)
}
})
t.Run("valid negative integer", func(t *testing.T) {
t.Setenv(testKey, "-50")
result := parseIntEnv(testKey, defaultVal)
if result != -50 {
t.Errorf("expected -50, got %d", result)
}
})
t.Run("invalid string returns default", func(t *testing.T) {
t.Setenv(testKey, "not-a-number")
result := parseIntEnv(testKey, defaultVal)
if result != defaultVal {
t.Errorf("expected default %d, got %d", defaultVal, result)
}
})
t.Run("float returns default", func(t *testing.T) {
t.Setenv(testKey, "3.14")
result := parseIntEnv(testKey, defaultVal)
if result != defaultVal {
t.Errorf("expected default %d, got %d", defaultVal, result)
}
})
t.Run("whitespace returns default", func(t *testing.T) {
t.Setenv(testKey, " ")
result := parseIntEnv(testKey, defaultVal)
if result != defaultVal {
t.Errorf("expected default %d, got %d", defaultVal, result)
}
})
t.Run("number with trailing text returns default", func(t *testing.T) {
t.Setenv(testKey, "100abc")
result := parseIntEnv(testKey, defaultVal)
if result != defaultVal {
t.Errorf("expected default %d, got %d", defaultVal, result)
}
})
}