test: add comprehensive tests for all Epic 1 stories
Some checks failed
CI / Test (pull_request) Failing after 17s
CI / Lint (pull_request) Failing after 18s
CI / Build (pull_request) Successful in 12s
CI / Format Check (pull_request) Successful in 2s

Story 1.2: Database Layer
- Test database client creation, connection, ping, and close
- Test connection pooling configuration
- Tests skip if database is not available (short mode)

Story 1.3: Health Monitoring and Metrics
- Test health registry registration and checking
- Test database health checker
- Test liveness and readiness checks
- Test metrics creation, middleware, and handler
- Test Prometheus metrics endpoint

Story 1.4: Error Handling and Error Bus
- Test channel-based error bus creation
- Test error publishing with context
- Test nil error handling
- Test channel full scenario
- Test graceful shutdown
- Fix Close() method to handle multiple calls safely

Story 1.5: HTTP Server and Middleware
- Test server creation with all middleware
- Test request ID middleware
- Test logging middleware
- Test panic recovery middleware
- Test CORS middleware
- Test timeout middleware
- Test health and metrics endpoints
- Test server shutdown

Story 1.6: OpenTelemetry Tracing
- Test tracer initialization (enabled/disabled)
- Test development and production modes
- Test OTLP exporter configuration
- Test graceful shutdown
- Test no-op tracer provider

All tests follow Go testing best practices:
- Table-driven tests where appropriate
- Parallel execution
- Proper mocking of interfaces
- Skip tests requiring external dependencies in short mode
This commit is contained in:
2025-11-05 21:03:27 +01:00
parent 278a727b8c
commit 5fdbb729bd
11 changed files with 1537 additions and 22 deletions

View File

@@ -12,11 +12,12 @@ import (
// ChannelBus implements a channel-based error bus.
type ChannelBus struct {
errors chan errorWithContext
logger logger.Logger
done chan struct{}
wg sync.WaitGroup
once sync.Once
errors chan errorWithContext
logger logger.Logger
done chan struct{}
wg sync.WaitGroup
once sync.Once
closeOnce sync.Once
}
type errorWithContext struct {
@@ -157,7 +158,9 @@ func (b *ChannelBus) Close() error {
close(b.done)
})
b.wg.Wait()
close(b.errors)
b.closeOnce.Do(func() {
close(b.errors)
})
return nil
}