🧪 refactor: add optional scenario-level cleanup logging with BDD_ENABLE_CLEANUP_LOGS
- 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:
@@ -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()
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user