Files
RenewCMS/test/sqlite_busy_timeout_test.go

50 lines
1.3 KiB
Go

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)
}
})
}