TestCopyLiveDatabaseToFile now runs
after connection to local MySQL database is working for go tests
This commit is contained in:
@@ -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) {
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user