package bdd import ( "fmt" "strings" "time" "dance-lessons-coach/pkg/bdd/steps" "dance-lessons-coach/pkg/bdd/testserver" "github.com/cucumber/godog" "github.com/rs/zerolog/log" ) var sharedServer *testserver.Server func InitializeTestSuite(ctx *godog.TestSuiteContext) { ctx.BeforeSuite(func() { // Small delay to ensure any previous server instances are fully cleaned up time.Sleep(50 * time.Millisecond) sharedServer = testserver.NewServer() if err := sharedServer.Start(); err != nil { // Improved error message for port conflicts if strings.Contains(err.Error(), "address already in use") { panic(fmt.Sprintf("Port conflict: %v. Try running 'lsof -i :9191' and 'kill -9 ' to free the port", err)) } panic(fmt.Sprintf("Failed to start test server: %v", err)) } }) ctx.AfterSuite(func() { if sharedServer != nil { // 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 { log.Warn().Err(err).Msg("Failed to shutdown HTTP server") } // Small delay to ensure port is fully released time.Sleep(100 * time.Millisecond) } // Cleanup any test config files steps.CleanupAllTestConfigFiles() }) } func InitializeScenario(ctx *godog.ScenarioContext) { client := testserver.NewClient(sharedServer) steps.InitializeAllSteps(ctx, client) }