grokkit/internal/logger/logger_test.go
Greg Gauthier 918ccc01c8
All checks were successful
CI / Test (push) Successful in 31s
CI / Lint (push) Successful in 25s
CI / Build (push) Successful in 22s
Release / Create Release (push) Successful in 36s
refactor(tests): improve error handling and defer usage
- Add error checking for os.Setenv and io operations in test files
- Use anonymous functions in defer to ignore errors from os.Remove, os.Setenv, etc.
- Minor formatting and consistency fixes in tests and client code
2026-03-02 21:33:11 +00:00

121 lines
2.8 KiB
Go

package logger
import (
"os"
"path/filepath"
"strings"
"testing"
)
func setHome(t *testing.T, dir string) {
t.Helper()
if err := os.Setenv("HOME", dir); err != nil {
t.Fatal(err)
}
}
func TestInit(t *testing.T) {
tmpDir := t.TempDir()
oldHome := os.Getenv("HOME")
setHome(t, tmpDir)
defer func() { _ = os.Setenv("HOME", oldHome) }()
tests := []struct {
name string
logLevel string
}{
{"default level", "info"},
{"debug level", "debug"},
{"warn level", "warn"},
{"error level", "error"},
{"invalid level defaults to info", "invalid"},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
err := Init(tt.logLevel)
if err != nil {
t.Errorf("Init(%q) unexpected error: %v", tt.logLevel, err)
}
logFile := filepath.Join(tmpDir, ".config", "grokkit", "grokkit.log")
if _, err := os.Stat(logFile); os.IsNotExist(err) {
t.Errorf("Log file not created at %s", logFile)
}
})
}
}
func TestLogging(t *testing.T) {
tmpDir := t.TempDir()
oldHome := os.Getenv("HOME")
setHome(t, tmpDir)
defer func() { _ = os.Setenv("HOME", oldHome) }()
if err := Init("debug"); err != nil {
t.Fatalf("Init() failed: %v", err)
}
Debug("test debug message", "key", "value")
Info("test info message", "count", 42)
Warn("test warn message", "enabled", true)
Error("test error message", "error", "something went wrong")
logFile := filepath.Join(tmpDir, ".config", "grokkit", "grokkit.log")
content, err := os.ReadFile(logFile)
if err != nil {
t.Errorf("Failed to read log file: %v", err)
}
if len(content) == 0 {
t.Errorf("Log file is empty")
}
contentStr := string(content)
if !strings.Contains(contentStr, `"level"`) {
t.Errorf("Log content doesn't contain JSON level field")
}
if !strings.Contains(contentStr, `"msg"`) {
t.Errorf("Log content doesn't contain JSON msg field")
}
}
func TestSetLevel(t *testing.T) {
tmpDir := t.TempDir()
oldHome := os.Getenv("HOME")
setHome(t, tmpDir)
defer func() { _ = os.Setenv("HOME", oldHome) }()
if err := Init("info"); err != nil {
t.Fatalf("Init() failed: %v", err)
}
SetLevel("debug")
Debug("debug after level change", "test", true)
logFile := filepath.Join(tmpDir, ".config", "grokkit", "grokkit.log")
content, err := os.ReadFile(logFile)
if err != nil {
t.Errorf("Failed to read log file: %v", err)
}
if !strings.Contains(string(content), "debug after level change") {
t.Errorf("Debug message not found after level change")
}
}
func TestWith(t *testing.T) {
tmpDir := t.TempDir()
oldHome := os.Getenv("HOME")
setHome(t, tmpDir)
defer func() { _ = os.Setenv("HOME", oldHome) }()
if err := Init("info"); err != nil {
t.Fatalf("Init() failed: %v", err)
}
contextLogger := With("request_id", "123", "user", "testuser")
if contextLogger == nil {
t.Errorf("With() returned nil logger")
}
}