2025-07-24 07:39:43 +02:00
|
|
|
package database
|
|
|
|
|
|
|
|
|
|
import (
|
2025-08-11 07:46:53 +02:00
|
|
|
"bamort/logger"
|
2025-07-24 07:39:43 +02:00
|
|
|
"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 {
|
2025-08-11 07:46:53 +02:00
|
|
|
logger.Debug("copyFile: Kopiere Datei von %s nach %s", src, dst)
|
|
|
|
|
|
2025-07-24 07:39:43 +02:00
|
|
|
sourceFile, err := os.Open(src)
|
|
|
|
|
if err != nil {
|
2025-08-11 07:46:53 +02:00
|
|
|
logger.Error("copyFile: Fehler beim Öffnen der Quelldatei %s: %s", src, err.Error())
|
2025-07-24 07:39:43 +02:00
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
defer sourceFile.Close()
|
|
|
|
|
|
|
|
|
|
destFile, err := os.Create(dst)
|
|
|
|
|
if err != nil {
|
2025-08-11 07:46:53 +02:00
|
|
|
logger.Error("copyFile: Fehler beim Erstellen der Zieldatei %s: %s", dst, err.Error())
|
2025-07-24 07:39:43 +02:00
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
defer destFile.Close()
|
|
|
|
|
|
2025-08-11 07:46:53 +02:00
|
|
|
copied, err := io.Copy(destFile, sourceFile)
|
|
|
|
|
if err != nil {
|
|
|
|
|
logger.Error("copyFile: Fehler beim Kopieren der Datei: %s", err.Error())
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
logger.Debug("copyFile: Erfolgreich %d Bytes kopiert von %s nach %s", copied, src, dst)
|
2025-07-24 07:39:43 +02:00
|
|
|
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) {
|
2025-08-11 07:46:53 +02:00
|
|
|
logger.Debug("SetupTestDB aufgerufen")
|
|
|
|
|
|
2025-07-24 07:39:43 +02:00
|
|
|
isTestDb = true
|
|
|
|
|
|
|
|
|
|
if len(opts) > 0 {
|
|
|
|
|
isTestDb = opts[0]
|
2025-08-11 07:46:53 +02:00
|
|
|
logger.Debug("SetupTestDB: isTestDb Parameter überschrieben auf %t", isTestDb)
|
2025-07-24 07:39:43 +02:00
|
|
|
}
|
|
|
|
|
|
2025-08-11 07:46:53 +02:00
|
|
|
logger.Debug("SetupTestDB: Verwende Test-Datenbank: %t", isTestDb)
|
|
|
|
|
|
2025-07-24 07:39:43 +02:00
|
|
|
if DB == nil {
|
2025-08-11 07:46:53 +02:00
|
|
|
logger.Debug("SetupTestDB: DB ist nil, erstelle neue Datenbankverbindung")
|
2025-07-24 07:39:43 +02:00
|
|
|
var db *gorm.DB
|
2025-08-11 07:46:53 +02:00
|
|
|
|
2025-07-24 07:39:43 +02:00
|
|
|
if isTestDb {
|
2025-08-11 07:46:53 +02:00
|
|
|
logger.Info("SetupTestDB: Erstelle SQLite Test-Datenbank")
|
|
|
|
|
|
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-08-11 07:46:53 +02:00
|
|
|
logger.Error("SetupTestDB: Fehler beim Erstellen des temporären Verzeichnisses: %s", err.Error())
|
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-08-11 07:46:53 +02:00
|
|
|
logger.Debug("SetupTestDB: Temporäres Verzeichnis erstellt: %s", testdbTempDir)
|
|
|
|
|
|
2025-07-29 10:51:03 +02:00
|
|
|
targetFile := filepath.Join(testdbTempDir, "test_backup.db")
|
2025-08-11 07:46:53 +02:00
|
|
|
logger.Debug("SetupTestDB: Ziel-Datei: %s", targetFile)
|
|
|
|
|
logger.Debug("SetupTestDB: Quelle-Datei: %s", PreparedTestDB)
|
|
|
|
|
|
2025-07-29 10:51:03 +02:00
|
|
|
err = copyFile(PreparedTestDB, targetFile)
|
2025-07-24 07:39:43 +02:00
|
|
|
if err != nil {
|
2025-08-11 07:46:53 +02:00
|
|
|
logger.Error("SetupTestDB: Fehler beim Kopieren der Test-Datenbank: %s", err.Error())
|
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-08-11 07:46:53 +02:00
|
|
|
logger.Info("SetupTestDB: Test-Datenbank erfolgreich kopiert")
|
|
|
|
|
|
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-08-11 07:46:53 +02:00
|
|
|
logger.Error("SetupTestDB: Fehler beim Verbinden mit der Test-Datenbank: %s", err.Error())
|
2025-07-29 10:51:03 +02:00
|
|
|
panic("failed to connect to the test database: " + err.Error())
|
|
|
|
|
}
|
2025-08-11 07:46:53 +02:00
|
|
|
logger.Info("SetupTestDB: Erfolgreich mit SQLite Test-Datenbank verbunden")
|
2025-07-30 08:20:58 +02:00
|
|
|
//defer os.RemoveAll(testdbTempDir)
|
2025-07-29 10:51:03 +02:00
|
|
|
} else {
|
2025-08-11 07:46:53 +02:00
|
|
|
logger.Info("SetupTestDB: Verwende Live-Datenbank (MariaDB)")
|
2025-07-29 10:51:03 +02:00
|
|
|
//* //testing with persistent MariaDB
|
|
|
|
|
db = ConnectDatabase()
|
|
|
|
|
if db == nil {
|
2025-08-11 07:46:53 +02:00
|
|
|
logger.Error("SetupTestDB: Fehler beim Verbinden mit der Live-Datenbank")
|
2025-07-24 07:39:43 +02:00
|
|
|
panic("failed to connect to the live database")
|
|
|
|
|
}
|
2025-08-11 07:46:53 +02:00
|
|
|
logger.Info("SetupTestDB: Erfolgreich mit Live-Datenbank verbunden")
|
2025-07-24 07:39:43 +02:00
|
|
|
}
|
|
|
|
|
DB = db
|
2025-08-11 07:46:53 +02:00
|
|
|
logger.Info("SetupTestDB: Datenbankverbindung erfolgreich eingerichtet")
|
|
|
|
|
} else {
|
|
|
|
|
logger.Debug("SetupTestDB: DB bereits initialisiert, überspringe Setup")
|
2025-07-24 07:39:43 +02:00
|
|
|
}
|
|
|
|
|
}
|
2026-01-28 08:51:35 +01:00
|
|
|
|
2025-07-24 07:39:43 +02:00
|
|
|
func ResetTestDB() {
|
2025-08-11 07:46:53 +02:00
|
|
|
logger.Debug("ResetTestDB aufgerufen")
|
|
|
|
|
|
2025-07-24 07:39:43 +02:00
|
|
|
if isTestDb {
|
2025-08-11 07:46:53 +02:00
|
|
|
logger.Debug("ResetTestDB: Verwende Test-Datenbank, führe Cleanup durch")
|
|
|
|
|
|
2025-08-30 08:59:45 +02:00
|
|
|
// Check if DB is not nil before trying to use it
|
|
|
|
|
if DB != nil {
|
|
|
|
|
sqlDB, err := DB.DB()
|
|
|
|
|
if err == nil {
|
|
|
|
|
logger.Debug("ResetTestDB: Schließe Datenbankverbindung")
|
|
|
|
|
sqlDB.Close()
|
|
|
|
|
} else {
|
|
|
|
|
logger.Error("ResetTestDB: Fehler beim Abrufen der SQL-Datenbank: %s", err.Error())
|
2025-08-11 07:46:53 +02:00
|
|
|
}
|
|
|
|
|
} else {
|
2025-08-30 08:59:45 +02:00
|
|
|
logger.Debug("ResetTestDB: DB ist bereits nil, überspringe Verbindungsschließung")
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Always set DB to nil and clean up temp directory
|
|
|
|
|
DB = nil
|
|
|
|
|
logger.Debug("ResetTestDB: DB auf nil gesetzt")
|
|
|
|
|
|
|
|
|
|
if testdbTempDir != "" {
|
|
|
|
|
logger.Debug("ResetTestDB: Lösche temporäres Verzeichnis: %s", testdbTempDir)
|
2025-12-21 09:51:51 +01:00
|
|
|
removeErr := os.RemoveAll(testdbTempDir)
|
|
|
|
|
if removeErr != nil {
|
|
|
|
|
logger.Error("ResetTestDB: Fehler beim Löschen des temporären Verzeichnisses: %s", removeErr.Error())
|
2025-08-30 08:59:45 +02:00
|
|
|
} else {
|
|
|
|
|
logger.Info("ResetTestDB: Temporäres Verzeichnis erfolgreich gelöscht")
|
|
|
|
|
}
|
|
|
|
|
testdbTempDir = ""
|
2025-07-24 07:39:43 +02:00
|
|
|
}
|
2025-08-11 07:46:53 +02:00
|
|
|
} else {
|
|
|
|
|
logger.Debug("ResetTestDB: Verwende Live-Datenbank, überspringe Cleanup")
|
2025-07-24 07:39:43 +02:00
|
|
|
}
|
2025-08-11 07:46:53 +02:00
|
|
|
|
|
|
|
|
logger.Info("ResetTestDB: Cleanup abgeschlossen")
|
2025-07-24 07:39:43 +02:00
|
|
|
}
|