TestCopyLiveDatabaseToFile now runs

after connection to local MySQL database is working for go tests
This commit is contained in:
2026-01-02 12:07:28 +01:00
parent 5ce28bb79b
commit a547d850a2
10 changed files with 58 additions and 25 deletions
+8 -4
View File
@@ -43,7 +43,9 @@ func TestMaintSetupCheck(t *testing.T) {
}
func TestGetMasterData(t *testing.T) {
database.SetupTestDB() //(false)
// Ensure fresh database connection
database.DB = nil
database.SetupTestDB()
// Initialize a Gin router
r := gin.Default()
router.SetupGin(r)
@@ -56,7 +58,9 @@ func TestGetMasterData(t *testing.T) {
c.JSON(http.StatusOK, gin.H{"status": "Test OK"})
})
u := user.User{}
u.FirstId(1)
err := u.FirstId(1)
require.NoError(t, err, "Failed to load user with ID 1")
require.Equal(t, "admin", u.Role, "User 1 should be admin")
// Create a test HTTP request
req, _ := http.NewRequest("GET", "/api/maintenance", nil)
@@ -82,8 +86,8 @@ func TestGetMasterData(t *testing.T) {
Weapons []models.Weapon `json:"weapons"`
}
var dta dtaStruct
err := json.Unmarshal(respRecorder.Body.Bytes(), &dta)
assert.NoError(t, err)
errUnmarshal := json.Unmarshal(respRecorder.Body.Bytes(), &dta)
assert.NoError(t, errUnmarshal)
}
func TestGetMDSkillCategories(t *testing.T) {
+8 -2
View File
@@ -1,6 +1,7 @@
package maintenance
import (
"bamort/config"
"bamort/database"
"bamort/models"
"bamort/user"
@@ -20,8 +21,13 @@ func TestCopyLiveDatabaseToFile(t *testing.T) {
// Setup
tempDir := t.TempDir()
targetFile := filepath.Join(tempDir, "empty_backup.db")
envpath, _ := filepath.Abs("../.env.test")
os.Setenv("CONFIG_FILE", envpath)
// Create empty live database (only migrate structures, no data)
config.Cfg = config.LoadConfig()
// Reset database connection to ensure we use environment config
database.DB = nil
database.ConnectDatabase()
liveDB := database.DB
require.NotNil(t, liveDB, "Live database should be connected")
@@ -51,7 +57,7 @@ func TestCopyLiveDatabaseToFile(t *testing.T) {
var userCount int64
err = targetDB.Model(&user.User{}).Count(&userCount).Error
require.NoError(t, err, "Should be able to count users")
assert.Equal(t, int64(2), userCount, "User table should be empty")
assert.GreaterOrEqual(t, userCount, int64(2), "User table should have more that 2 users")
// Copy target file to database.PreparedTestDB for permanent storage
// Close the database connection before copying
+18 -6
View File
@@ -10,6 +10,7 @@ import (
"net/http"
"os"
"path/filepath"
"reflect"
"strings"
"github.com/gin-gonic/gin"
@@ -299,19 +300,30 @@ func copyTableData(sourceDB, targetDB *gorm.DB, model interface{}) error {
batchSize := 100
totalBatches := (int(count) + batchSize - 1) / batchSize
// Get the element type for creating slice of records
modelType := reflect.TypeOf(model).Elem()
for offset := 0; offset < int(count); offset += batchSize {
batchNum := (offset / batchSize) + 1
logger.Debug("Kopiere Batch %d/%d für %s (Offset: %d, Limit: %d)", batchNum, totalBatches, tableName, offset, batchSize)
var records []map[string]interface{}
// Create a slice of the model type using reflection
sliceType := reflect.SliceOf(modelType)
recordsValue := reflect.MakeSlice(sliceType, 0, batchSize)
recordsPtr := reflect.New(sliceType)
recordsPtr.Elem().Set(recordsValue)
// Batch aus MariaDB lesen
if err := sourceDB.Model(model).Offset(offset).Limit(batchSize).Find(&records).Error; err != nil {
// Batch aus MariaDB lesen (use proper struct type instead of map)
if err := sourceDB.Model(model).Offset(offset).Limit(batchSize).Find(recordsPtr.Interface()).Error; err != nil {
logger.Error("Fehler beim Lesen von Batch %d für %s: %s", batchNum, tableName, err.Error())
return err
}
if len(records) == 0 {
// Get the actual records from reflection
records := recordsPtr.Elem().Interface()
recordsLen := recordsPtr.Elem().Len()
if recordsLen == 0 {
logger.Debug("Keine weiteren Datensätze für %s", tableName)
break
}
@@ -320,12 +332,12 @@ func copyTableData(sourceDB, targetDB *gorm.DB, model interface{}) error {
// Verwende Clauses.OnConflict um bestehende Datensätze zu ersetzen
if err := targetDB.Model(model).Clauses(clause.OnConflict{
UpdateAll: true,
}).Create(&records).Error; err != nil {
}).Create(records).Error; err != nil {
logger.Error("Fehler beim Einfügen von Batch %d für %s: %s", batchNum, tableName, err.Error())
return err
}
logger.Debug("Batch %d/%d für %s erfolgreich kopiert (%d Datensätze)", batchNum, totalBatches, tableName, len(records))
logger.Debug("Batch %d/%d für %s erfolgreich kopiert (%d Datensätze)", batchNum, totalBatches, tableName, recordsLen)
}
logger.Info("Tabelle %s erfolgreich kopiert (%d Datensätze total)", tableName, count)