mirror of
https://github.com/kjanat/articulate-parser.git
synced 2026-01-16 09:02:10 +01:00
Introduces `context.Context` to the `FetchCourse` method and its call chain, allowing for cancellable network requests and timeouts. This improves application robustness when fetching remote course data. A new configuration package centralizes application settings, loading them from environment variables with sensible defaults for base URL, request timeout, and logging. Standard `log` and `fmt` calls are replaced with a structured logging system built on `slog`, supporting both JSON and human-readable text formats. This change also includes: - Extensive benchmarks and example tests. - Simplified Go doc comments across several packages. BREAKING CHANGE: The `NewArticulateParser` constructor signature has been updated to accept a logger, base URL, and timeout, which are now supplied via the new configuration system.
97 lines
2.7 KiB
Go
97 lines
2.7 KiB
Go
// Package services_test provides benchmarks for the logger implementations.
|
|
package services
|
|
|
|
import (
|
|
"context"
|
|
"io"
|
|
"log/slog"
|
|
"testing"
|
|
)
|
|
|
|
// BenchmarkSlogLogger_Info benchmarks structured JSON logging.
|
|
func BenchmarkSlogLogger_Info(b *testing.B) {
|
|
// Create logger that writes to io.Discard to avoid benchmark noise
|
|
opts := &slog.HandlerOptions{Level: slog.LevelInfo}
|
|
handler := slog.NewJSONHandler(io.Discard, opts)
|
|
logger := &SlogLogger{logger: slog.New(handler)}
|
|
|
|
b.ResetTimer()
|
|
for b.Loop() {
|
|
logger.Info("test message", "key1", "value1", "key2", 42, "key3", true)
|
|
}
|
|
}
|
|
|
|
// BenchmarkSlogLogger_Debug benchmarks debug level logging.
|
|
func BenchmarkSlogLogger_Debug(b *testing.B) {
|
|
opts := &slog.HandlerOptions{Level: slog.LevelDebug}
|
|
handler := slog.NewJSONHandler(io.Discard, opts)
|
|
logger := &SlogLogger{logger: slog.New(handler)}
|
|
|
|
b.ResetTimer()
|
|
for b.Loop() {
|
|
logger.Debug("debug message", "operation", "test", "duration", 123)
|
|
}
|
|
}
|
|
|
|
// BenchmarkSlogLogger_Error benchmarks error logging.
|
|
func BenchmarkSlogLogger_Error(b *testing.B) {
|
|
opts := &slog.HandlerOptions{Level: slog.LevelError}
|
|
handler := slog.NewJSONHandler(io.Discard, opts)
|
|
logger := &SlogLogger{logger: slog.New(handler)}
|
|
|
|
b.ResetTimer()
|
|
for b.Loop() {
|
|
logger.Error("error occurred", "error", "test error", "code", 500)
|
|
}
|
|
}
|
|
|
|
// BenchmarkTextLogger_Info benchmarks text logging.
|
|
func BenchmarkTextLogger_Info(b *testing.B) {
|
|
opts := &slog.HandlerOptions{Level: slog.LevelInfo}
|
|
handler := slog.NewTextHandler(io.Discard, opts)
|
|
logger := &SlogLogger{logger: slog.New(handler)}
|
|
|
|
b.ResetTimer()
|
|
for b.Loop() {
|
|
logger.Info("test message", "key1", "value1", "key2", 42)
|
|
}
|
|
}
|
|
|
|
// BenchmarkNoOpLogger benchmarks the no-op logger.
|
|
func BenchmarkNoOpLogger(b *testing.B) {
|
|
logger := NewNoOpLogger()
|
|
|
|
b.ResetTimer()
|
|
for b.Loop() {
|
|
logger.Info("test message", "key1", "value1", "key2", 42)
|
|
logger.Error("error message", "error", "test")
|
|
}
|
|
}
|
|
|
|
// BenchmarkLogger_With benchmarks logger with context.
|
|
func BenchmarkLogger_With(b *testing.B) {
|
|
opts := &slog.HandlerOptions{Level: slog.LevelInfo}
|
|
handler := slog.NewJSONHandler(io.Discard, opts)
|
|
logger := &SlogLogger{logger: slog.New(handler)}
|
|
|
|
b.ResetTimer()
|
|
for b.Loop() {
|
|
contextLogger := logger.With("request_id", "123", "user_id", "456")
|
|
contextLogger.Info("operation completed")
|
|
}
|
|
}
|
|
|
|
// BenchmarkLogger_WithContext benchmarks logger with Go context.
|
|
func BenchmarkLogger_WithContext(b *testing.B) {
|
|
opts := &slog.HandlerOptions{Level: slog.LevelInfo}
|
|
handler := slog.NewJSONHandler(io.Discard, opts)
|
|
logger := &SlogLogger{logger: slog.New(handler)}
|
|
ctx := context.Background()
|
|
|
|
b.ResetTimer()
|
|
for b.Loop() {
|
|
contextLogger := logger.WithContext(ctx)
|
|
contextLogger.Info("context operation")
|
|
}
|
|
}
|