package test import ( "RenewCMS/internal/infrastructure/persistence/database" "RenewCMS/internal/infrastructure/persistence/models" "path/filepath" "testing" "time" "github.com/glebarez/sqlite" "gorm.io/gorm" "gorm.io/gorm/logger" ) func TestProductionSQLiteDSNWaitsForTheWriteLock(t *testing.T) { t.Run("A second writer waits for the first instead of failing with a locked database", func(t *testing.T) { path := filepath.Join(t.TempDir(), "busy.db") open := func() *gorm.DB { db, err := gorm.Open(sqlite.Open(database.SQLiteDSN(path)), &gorm.Config{Logger: logger.Discard}) if err != nil { t.Fatalf("open: %v", err) } t.Cleanup(func() { if sqlDB, err := db.DB(); err == nil { _ = sqlDB.Close() } }) return db } first, second := open(), open() if err := first.AutoMigrate(&models.User{}); err != nil { t.Fatalf("migrate: %v", err) } tx := first.Begin() if err := tx.Create(&models.User{Username: "a", Password: "x", Email: "a@x.example"}).Error; err != nil { t.Fatalf("first write: %v", err) } go func() { time.Sleep(300 * time.Millisecond) tx.Commit() }() err := second.Create(&models.User{Username: "b", Password: "x", Email: "b@x.example"}).Error if err != nil { t.Errorf("second writer must wait for the lock, got %v", err) } }) }