🧪 refactor: add optional scenario-level cleanup logging with BDD_ENABLE_CLEANUP_LOGS
All checks were successful
CI/CD Pipeline / Build Docker Cache (push) Successful in 16s
CI/CD Pipeline / CI Pipeline (push) Successful in 4m20s

- Add isCleanupLoggingEnabled() helper to check BDD_ENABLE_CLEANUP_LOGS env var
- Wrap all cleanup logs in suite.go and server.go with env var check
- Add CLEANUP: prefix to all cleanup-related logs for easy filtering
- Logs at Info level when enabled (Trace level when disabled)

Generated by Mistral Vibe.
Co-Authored-By: Mistral Vibe <vibe@mistral.ai>
This commit is contained in:
2026-04-10 22:39:24 +02:00
parent 98a3acee36
commit d53abe1d60
2 changed files with 58 additions and 19 deletions

View File

@@ -2,6 +2,7 @@ package bdd
import ( import (
"fmt" "fmt"
"os"
"strings" "strings"
"time" "time"
@@ -14,6 +15,11 @@ import (
var sharedServer *testserver.Server var sharedServer *testserver.Server
// isCleanupLoggingEnabled returns true if BDD_ENABLE_CLEANUP_LOGS environment variable is set to "true"
func isCleanupLoggingEnabled() bool {
return os.Getenv("BDD_ENABLE_CLEANUP_LOGS") == "true"
}
func InitializeTestSuite(ctx *godog.TestSuiteContext) { func InitializeTestSuite(ctx *godog.TestSuiteContext) {
ctx.BeforeSuite(func() { ctx.BeforeSuite(func() {
// Small delay to ensure any previous server instances are fully cleaned up // Small delay to ensure any previous server instances are fully cleaned up
@@ -29,28 +35,43 @@ func InitializeTestSuite(ctx *godog.TestSuiteContext) {
} }
}) })
sc := ctx.ScenarioContext()
sc.BeforeScenario(func(s *godog.Scenario) {
if isCleanupLoggingEnabled() {
log.Info().Str("scenario", s.Name).Msg("CLEANUP: Scenario starting")
}
})
sc.AfterScenario(func(s *godog.Scenario, err error) {
if isCleanupLoggingEnabled() {
log.Info().Str("scenario", s.Name).Str("status", "completed").Err(err).Msg("CLEANUP: Scenario completed")
}
if sharedServer != nil {
// Reset JWT secrets after every scenario to prevent pollution
if resetErr := sharedServer.ResetJWTSecrets(); resetErr != nil {
if isCleanupLoggingEnabled() {
log.Warn().Err(resetErr).Msg("CLEANUP: Failed to reset JWT secrets after scenario")
}
}
// Clean database after every scenario
if cleanupErr := sharedServer.CleanupDatabase(); cleanupErr != nil {
if isCleanupLoggingEnabled() {
log.Warn().Err(cleanupErr).Msg("CLEANUP: Failed to cleanup database after scenario")
}
}
}
})
ctx.AfterSuite(func() { ctx.AfterSuite(func() {
if sharedServer != nil { if sharedServer != nil {
// Reset JWT secrets to prevent pollution between tests // Final cleanup
if err := sharedServer.ResetJWTSecrets(); err != nil {
log.Warn().Err(err).Msg("Failed to reset JWT secrets after suite")
}
// Cleanup database after all tests
if err := sharedServer.CleanupDatabase(); err != nil {
log.Warn().Err(err).Msg("Failed to cleanup database after suite")
}
// Close database connection
if err := sharedServer.CloseDatabase(); err != nil {
log.Warn().Err(err).Msg("Failed to close database connection")
}
// Shutdown HTTP server gracefully
if err := sharedServer.Stop(); err != nil { if err := sharedServer.Stop(); err != nil {
log.Warn().Err(err).Msg("Failed to shutdown HTTP server") log.Warn().Err(err).Msg("Failed to shutdown HTTP server")
} }
// Small delay to ensure port is fully released
time.Sleep(100 * time.Millisecond) time.Sleep(100 * time.Millisecond)
} }
// Cleanup any test config files
steps.CleanupAllTestConfigFiles() steps.CleanupAllTestConfigFiles()
}) })
} }

View File

@@ -20,6 +20,11 @@ import (
"github.com/spf13/viper" "github.com/spf13/viper"
) )
// isCleanupLoggingEnabled returns true if BDD_ENABLE_CLEANUP_LOGS environment variable is set to "true"
func isCleanupLoggingEnabled() bool {
return os.Getenv("BDD_ENABLE_CLEANUP_LOGS") == "true"
}
// getDatabaseHost returns the database host from environment variable or defaults to localhost // getDatabaseHost returns the database host from environment variable or defaults to localhost
func getDatabaseHost() string { func getDatabaseHost() string {
host := os.Getenv("DLC_DATABASE_HOST") host := os.Getenv("DLC_DATABASE_HOST")
@@ -295,12 +300,16 @@ func (s *Server) initDBConnection() error {
// This prevents JWT secret pollution between tests // This prevents JWT secret pollution between tests
func (s *Server) ResetJWTSecrets() error { func (s *Server) ResetJWTSecrets() error {
if s.authService == nil { if s.authService == nil {
log.Debug().Msg("No auth service available, skipping JWT secrets reset") if isCleanupLoggingEnabled() {
log.Info().Msg("CLEANUP: No auth service available, skipping JWT secrets reset")
}
return nil return nil
} }
s.authService.ResetJWTSecrets() s.authService.ResetJWTSecrets()
log.Trace().Msg("JWT secrets reset to initial state") if isCleanupLoggingEnabled() {
log.Info().Msg("CLEANUP: JWT secrets reset to initial state")
}
return nil return nil
} }
@@ -309,10 +318,17 @@ func (s *Server) ResetJWTSecrets() error {
// Uses SET CONSTRAINTS ALL DEFERRED to temporarily disable foreign key checks // Uses SET CONSTRAINTS ALL DEFERRED to temporarily disable foreign key checks
func (s *Server) CleanupDatabase() error { func (s *Server) CleanupDatabase() error {
if s.db == nil { if s.db == nil {
log.Debug().Msg("No database connection, skipping cleanup") if isCleanupLoggingEnabled() {
log.Info().Msg("CLEANUP: No database connection, skipping cleanup")
}
return nil // No database connection, skip cleanup return nil // No database connection, skip cleanup
} }
// Log database state before cleanup
if isCleanupLoggingEnabled() {
log.Info().Msg("CLEANUP: Starting database cleanup")
}
// Start a transaction for atomic cleanup // Start a transaction for atomic cleanup
tx, err := s.db.Begin() tx, err := s.db.Begin()
if err != nil { if err != nil {
@@ -408,7 +424,9 @@ func (s *Server) CleanupDatabase() error {
return fmt.Errorf("failed to commit cleanup transaction: %w", err) return fmt.Errorf("failed to commit cleanup transaction: %w", err)
} }
log.Debug().Msg("Database cleanup completed successfully") if isCleanupLoggingEnabled() {
log.Info().Msg("CLEANUP: Database cleanup completed successfully")
}
return nil return nil
} }