Files
bamort/backend/database/testhelper.go
T

85 lines
2.0 KiB
Go
Raw Normal View History

2025-07-24 07:39:43 +02:00
package database
import (
"io"
"os"
"path/filepath"
"gorm.io/driver/sqlite"
"gorm.io/gorm"
)
var isTestDb bool
2025-07-29 10:51:03 +02:00
var testdbTempDir string
2025-07-24 07:39:43 +02:00
// copyFile copies a file from src to dst
func copyFile(src, dst string) error {
sourceFile, err := os.Open(src)
if err != nil {
return err
}
defer sourceFile.Close()
destFile, err := os.Create(dst)
if err != nil {
return err
}
defer destFile.Close()
_, err = io.Copy(destFile, sourceFile)
return err
}
2025-07-29 10:51:03 +02:00
// The Database for testing is created from the live database whenever needed and stored in the path defined in database.PreparedTestDB
// to use the test database make a temporary copy of it and then open this new copy as testing database
// This allows to have a clean database for each test run without affecting the live database
// However SetupTestDB can still open the live database if required by setting isTestDb to false
2025-07-24 07:39:43 +02:00
// SetupTestDB creates an in-memory SQLite database for testing
// Parameters:
2025-07-29 10:51:03 +02:00
// - opts[0]: isTestDb (bool) - whether to use precopied SQLite (true) or persistent (Live) MariaDB (false)
2025-07-24 07:39:43 +02:00
func SetupTestDB(opts ...bool) {
isTestDb = true
if len(opts) > 0 {
isTestDb = opts[0]
}
if DB == nil {
var db *gorm.DB
if isTestDb {
2025-07-29 10:51:03 +02:00
testdbTempDir, err := os.MkdirTemp("", "bamort-test-")
2025-07-24 07:39:43 +02:00
if err != nil {
2025-07-29 10:51:03 +02:00
panic("failed to create temporary directory: " + err.Error())
2025-07-24 07:39:43 +02:00
}
2025-07-29 10:51:03 +02:00
targetFile := filepath.Join(testdbTempDir, "test_backup.db")
err = copyFile(PreparedTestDB, targetFile)
2025-07-24 07:39:43 +02:00
if err != nil {
2025-07-29 10:51:03 +02:00
panic("failed to copy prepared test database: " + err.Error())
2025-07-24 07:39:43 +02:00
}
2025-07-29 10:51:03 +02:00
db, err = gorm.Open(sqlite.Open(targetFile), &gorm.Config{})
2025-07-24 07:39:43 +02:00
if err != nil {
2025-07-29 10:51:03 +02:00
panic("failed to connect to the test database: " + err.Error())
}
defer os.RemoveAll(testdbTempDir)
} else {
//* //testing with persistent MariaDB
db = ConnectDatabase()
if db == nil {
2025-07-24 07:39:43 +02:00
panic("failed to connect to the live database")
}
}
DB = db
}
}
func ResetTestDB() {
if isTestDb {
sqlDB, err := DB.DB()
if err == nil {
sqlDB.Close()
DB = nil
2025-07-29 10:51:03 +02:00
os.RemoveAll(testdbTempDir)
2025-07-24 07:39:43 +02:00
}
}
}