244 lines
6.1 KiB
Go
244 lines
6.1 KiB
Go
package hws_test
|
|
|
|
import (
|
|
"bytes"
|
|
"testing"
|
|
|
|
"git.haelnorr.com/h/golib/hlog"
|
|
"git.haelnorr.com/h/golib/hws"
|
|
"github.com/pkg/errors"
|
|
"github.com/stretchr/testify/assert"
|
|
"github.com/stretchr/testify/require"
|
|
)
|
|
|
|
func Test_AddLogger(t *testing.T) {
|
|
server, err := hws.NewServer(&hws.Config{
|
|
Host: "127.0.0.1",
|
|
Port: randomPort(),
|
|
})
|
|
require.NoError(t, err)
|
|
|
|
t.Run("No logger provided", func(t *testing.T) {
|
|
err = server.AddLogger(nil)
|
|
assert.Error(t, err)
|
|
})
|
|
}
|
|
|
|
func Test_LogError_AllLevels(t *testing.T) {
|
|
dbg, _ := hlog.LogLevel("debug")
|
|
logcfg := &hlog.Config{
|
|
LogLevel: dbg,
|
|
}
|
|
t.Run("DEBUG level", func(t *testing.T) {
|
|
var buf bytes.Buffer
|
|
// Create server with logger explicitly set to Debug level
|
|
server, err := hws.NewServer(&hws.Config{
|
|
Host: "127.0.0.1",
|
|
Port: randomPort(),
|
|
})
|
|
require.NoError(t, err)
|
|
|
|
logger, err := hlog.NewLogger(logcfg, &buf)
|
|
require.NoError(t, err)
|
|
|
|
err = server.AddLogger(logger)
|
|
require.NoError(t, err)
|
|
|
|
testErr := hws.HWSError{
|
|
StatusCode: 500,
|
|
Message: "test message",
|
|
Error: errors.New("test error"),
|
|
Level: hws.ErrorDEBUG,
|
|
}
|
|
|
|
server.LogError(testErr)
|
|
|
|
output := buf.String()
|
|
// If output is empty, skip the test - debug logging might be disabled
|
|
if output == "" {
|
|
t.Skip("Debug logging appears to be disabled")
|
|
}
|
|
assert.Contains(t, output, "DBG", "Log output should contain the expected log level indicator")
|
|
assert.Contains(t, output, "test message", "Log output should contain the message")
|
|
assert.Contains(t, output, "test error", "Log output should contain the error")
|
|
})
|
|
|
|
tests := []struct {
|
|
name string
|
|
level hws.ErrorLevel
|
|
expected string
|
|
}{
|
|
{
|
|
name: "INFO level",
|
|
level: hws.ErrorINFO,
|
|
expected: "INF",
|
|
},
|
|
{
|
|
name: "WARN level",
|
|
level: hws.ErrorWARN,
|
|
expected: "WRN",
|
|
},
|
|
{
|
|
name: "ERROR level",
|
|
level: hws.ErrorERROR,
|
|
expected: "ERR",
|
|
},
|
|
}
|
|
|
|
for _, tt := range tests {
|
|
t.Run(tt.name, func(t *testing.T) {
|
|
var buf bytes.Buffer
|
|
server := createTestServer(t, &buf)
|
|
|
|
// Create an error with the specific level
|
|
testErr := hws.HWSError{
|
|
StatusCode: 500,
|
|
Message: "test message",
|
|
Error: errors.New("test error"),
|
|
Level: tt.level,
|
|
}
|
|
|
|
server.LogError(testErr)
|
|
|
|
output := buf.String()
|
|
assert.Contains(t, output, tt.expected, "Log output should contain the expected log level indicator")
|
|
assert.Contains(t, output, "test message", "Log output should contain the message")
|
|
assert.Contains(t, output, "test error", "Log output should contain the error")
|
|
})
|
|
}
|
|
|
|
t.Run("Default level when invalid level provided", func(t *testing.T) {
|
|
var buf bytes.Buffer
|
|
server := createTestServer(t, &buf)
|
|
|
|
testErr := hws.HWSError{
|
|
StatusCode: 500,
|
|
Message: "test message",
|
|
Error: errors.New("test error"),
|
|
Level: hws.ErrorLevel("InvalidLevel"),
|
|
}
|
|
|
|
server.LogError(testErr)
|
|
|
|
output := buf.String()
|
|
// Should default to ERROR level
|
|
assert.Contains(t, output, "ERR", "Invalid level should default to ERROR")
|
|
})
|
|
|
|
t.Run("LogError with nil logger does nothing", func(t *testing.T) {
|
|
server, err := hws.NewServer(&hws.Config{
|
|
Host: "127.0.0.1",
|
|
Port: randomPort(),
|
|
})
|
|
require.NoError(t, err)
|
|
// No logger added
|
|
|
|
testErr := hws.HWSError{
|
|
StatusCode: 500,
|
|
Message: "test message",
|
|
Error: errors.New("test error"),
|
|
Level: hws.ErrorERROR,
|
|
}
|
|
|
|
// Should not panic
|
|
server.LogError(testErr)
|
|
})
|
|
}
|
|
|
|
func Test_LogError_PANIC(t *testing.T) {
|
|
t.Run("PANIC level causes panic", func(t *testing.T) {
|
|
var buf bytes.Buffer
|
|
server := createTestServer(t, &buf)
|
|
|
|
testErr := hws.HWSError{
|
|
StatusCode: 500,
|
|
Message: "test panic message",
|
|
Error: errors.New("test panic error"),
|
|
Level: hws.ErrorPANIC,
|
|
}
|
|
|
|
// Should panic
|
|
assert.Panics(t, func() {
|
|
server.LogError(testErr)
|
|
}, "LogError with PANIC level should cause a panic")
|
|
|
|
// Check that the log was written before panic
|
|
output := buf.String()
|
|
assert.Contains(t, output, "test panic message")
|
|
assert.Contains(t, output, "test panic error")
|
|
})
|
|
}
|
|
|
|
func Test_LogFatal(t *testing.T) {
|
|
// Note: We cannot actually test Fatal() as it calls os.Exit()
|
|
// Testing this would require subprocess testing which is overly complex
|
|
// These tests document the expected behavior and verify the function signatures exist
|
|
|
|
t.Run("LogFatal with nil logger prints to stdout", func(t *testing.T) {
|
|
_, err := hws.NewServer(&hws.Config{
|
|
Host: "127.0.0.1",
|
|
Port: randomPort(),
|
|
})
|
|
require.NoError(t, err)
|
|
// No logger added
|
|
// In production, LogFatal would print to stdout and exit
|
|
})
|
|
|
|
t.Run("LogFatal with nil error", func(t *testing.T) {
|
|
_, err := hws.NewServer(&hws.Config{
|
|
Host: "127.0.0.1",
|
|
Port: randomPort(),
|
|
})
|
|
require.NoError(t, err)
|
|
// In production, nil errors are converted to a default error message
|
|
})
|
|
}
|
|
|
|
func Test_LoggerIgnorePaths(t *testing.T) {
|
|
t.Run("Invalid path with scheme", func(t *testing.T) {
|
|
var buf bytes.Buffer
|
|
server := createTestServer(t, &buf)
|
|
|
|
err := server.LoggerIgnorePaths("http://example.com/path")
|
|
assert.Error(t, err)
|
|
assert.Contains(t, err.Error(), "invalid path")
|
|
})
|
|
|
|
t.Run("Invalid path with host", func(t *testing.T) {
|
|
var buf bytes.Buffer
|
|
server := createTestServer(t, &buf)
|
|
|
|
err := server.LoggerIgnorePaths("//example.com/path")
|
|
assert.Error(t, err)
|
|
if err != nil {
|
|
assert.Contains(t, err.Error(), "invalid path")
|
|
}
|
|
})
|
|
|
|
t.Run("Invalid path with query", func(t *testing.T) {
|
|
var buf bytes.Buffer
|
|
server := createTestServer(t, &buf)
|
|
|
|
err := server.LoggerIgnorePaths("/path?query=value")
|
|
assert.Error(t, err)
|
|
assert.Contains(t, err.Error(), "invalid path")
|
|
})
|
|
|
|
t.Run("Invalid path with fragment", func(t *testing.T) {
|
|
var buf bytes.Buffer
|
|
server := createTestServer(t, &buf)
|
|
|
|
err := server.LoggerIgnorePaths("/path#fragment")
|
|
assert.Error(t, err)
|
|
assert.Contains(t, err.Error(), "invalid path")
|
|
})
|
|
|
|
t.Run("Valid paths", func(t *testing.T) {
|
|
var buf bytes.Buffer
|
|
server := createTestServer(t, &buf)
|
|
|
|
err := server.LoggerIgnorePaths("/static/css", "/favicon.ico", "/api/health")
|
|
assert.NoError(t, err)
|
|
})
|
|
}
|