MakeTestdataFromLive umgeschrieben vereinfacht
This commit is contained in:
@@ -0,0 +1,222 @@
|
||||
package maintenance
|
||||
|
||||
import (
|
||||
"bamort/models"
|
||||
"bamort/user"
|
||||
"fmt"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"testing"
|
||||
|
||||
"github.com/stretchr/testify/assert"
|
||||
"github.com/stretchr/testify/require"
|
||||
"gorm.io/driver/sqlite"
|
||||
"gorm.io/gorm"
|
||||
)
|
||||
|
||||
// TestCopyLiveDatabaseToFile_Success tests the main functionality of copyLiveDatabaseToFile
|
||||
func TestCopyLiveDatabaseToFile_Success(t *testing.T) {
|
||||
// Setup
|
||||
tempDir := t.TempDir()
|
||||
targetFile := filepath.Join(tempDir, "test_backup.db")
|
||||
|
||||
// Create test live database with data using GORM AutoMigrate for simplicity
|
||||
liveDB, err := gorm.Open(sqlite.Open(":memory:"), &gorm.Config{})
|
||||
require.NoError(t, err, "Failed to create test live database")
|
||||
defer func() {
|
||||
if sqlDB, err := liveDB.DB(); err == nil {
|
||||
sqlDB.Close()
|
||||
}
|
||||
}()
|
||||
|
||||
// Migrate only basic structures we can test with
|
||||
err = liveDB.AutoMigrate(&user.User{}, &models.Char{})
|
||||
require.NoError(t, err, "Failed to migrate test structures")
|
||||
|
||||
// Create simple test data
|
||||
testUser := &user.User{
|
||||
Username: "testuser",
|
||||
Email: "test@example.com",
|
||||
PasswordHash: "hashedpassword",
|
||||
}
|
||||
err = liveDB.Create(testUser).Error
|
||||
require.NoError(t, err, "Failed to create test user")
|
||||
|
||||
testChar := &models.Char{
|
||||
BamortBase: models.BamortBase{Name: "Test Hero"},
|
||||
Rasse: "Human",
|
||||
Typ: "Warrior",
|
||||
Alter: 25,
|
||||
Grad: 1,
|
||||
}
|
||||
err = liveDB.Create(testChar).Error
|
||||
require.NoError(t, err, "Failed to create test character")
|
||||
|
||||
// Execute - test the exported function
|
||||
err = CopyLiveDatabaseToFile(liveDB, targetFile)
|
||||
|
||||
// Verify
|
||||
require.NoError(t, err, "CopyLiveDatabaseToFile should succeed")
|
||||
|
||||
// Check that target file exists
|
||||
assert.FileExists(t, targetFile, "Target SQLite file should be created")
|
||||
|
||||
// Verify target database contains expected data
|
||||
targetDB, err := gorm.Open(sqlite.Open(targetFile), &gorm.Config{})
|
||||
require.NoError(t, err, "Should be able to open target database")
|
||||
defer func() {
|
||||
if sqlDB, err := targetDB.DB(); err == nil {
|
||||
sqlDB.Close()
|
||||
}
|
||||
}()
|
||||
|
||||
// Verify data was copied correctly
|
||||
var sourceUserCount, targetUserCount int64
|
||||
err = liveDB.Model(&user.User{}).Count(&sourceUserCount).Error
|
||||
require.NoError(t, err, "Failed to count users in source database")
|
||||
|
||||
err = targetDB.Model(&user.User{}).Count(&targetUserCount).Error
|
||||
require.NoError(t, err, "Failed to count users in target database")
|
||||
|
||||
assert.Equal(t, sourceUserCount, targetUserCount, "User count should match")
|
||||
assert.Greater(t, targetUserCount, int64(0), "Should have copied user data")
|
||||
|
||||
// Verify specific user data
|
||||
var sourceUser, targetUser user.User
|
||||
err = liveDB.Where("username = ?", "testuser").First(&sourceUser).Error
|
||||
require.NoError(t, err, "Failed to find test user in source")
|
||||
|
||||
err = targetDB.Where("username = ?", "testuser").First(&targetUser).Error
|
||||
require.NoError(t, err, "Failed to find test user in target")
|
||||
|
||||
assert.Equal(t, sourceUser.Username, targetUser.Username, "Username should match")
|
||||
assert.Equal(t, sourceUser.Email, targetUser.Email, "Email should match")
|
||||
}
|
||||
|
||||
// TestCopyLiveDatabaseToFile_BackupExisting tests file backup functionality
|
||||
func TestCopyLiveDatabaseToFile_BackupExisting(t *testing.T) {
|
||||
// Setup
|
||||
tempDir := t.TempDir()
|
||||
targetFile := filepath.Join(tempDir, "test_backup.db")
|
||||
backupFile := targetFile + ".backup"
|
||||
|
||||
// Create existing file
|
||||
existingContent := "existing database content"
|
||||
err := os.WriteFile(targetFile, []byte(existingContent), 0644)
|
||||
require.NoError(t, err, "Failed to create existing file")
|
||||
|
||||
// Create minimal test live database
|
||||
liveDB, err := gorm.Open(sqlite.Open(":memory:"), &gorm.Config{})
|
||||
require.NoError(t, err, "Failed to create test live database")
|
||||
defer func() {
|
||||
if sqlDB, err := liveDB.DB(); err == nil {
|
||||
sqlDB.Close()
|
||||
}
|
||||
}()
|
||||
|
||||
// Just migrate user table for simple test
|
||||
err = liveDB.AutoMigrate(&user.User{})
|
||||
require.NoError(t, err, "Failed to migrate user structure")
|
||||
|
||||
// Execute
|
||||
err = CopyLiveDatabaseToFile(liveDB, targetFile)
|
||||
|
||||
// Verify
|
||||
require.NoError(t, err, "CopyLiveDatabaseToFile should succeed")
|
||||
|
||||
// Check that backup file was created
|
||||
assert.FileExists(t, backupFile, "Backup file should be created")
|
||||
|
||||
// Verify backup contains original content
|
||||
backupContent, err := os.ReadFile(backupFile)
|
||||
require.NoError(t, err, "Should be able to read backup file")
|
||||
assert.Equal(t, existingContent, string(backupContent), "Backup should contain original content")
|
||||
|
||||
// Verify new target file is a valid SQLite database
|
||||
targetDB, err := gorm.Open(sqlite.Open(targetFile), &gorm.Config{})
|
||||
require.NoError(t, err, "New target file should be valid SQLite database")
|
||||
defer func() {
|
||||
if sqlDB, err := targetDB.DB(); err == nil {
|
||||
sqlDB.Close()
|
||||
}
|
||||
}()
|
||||
}
|
||||
|
||||
// TestCopyLiveDatabaseToFile_EmptyDatabase tests with empty database
|
||||
func TestCopyLiveDatabaseToFile_EmptyDatabase(t *testing.T) {
|
||||
// Setup
|
||||
tempDir := t.TempDir()
|
||||
targetFile := filepath.Join(tempDir, "empty_backup.db")
|
||||
|
||||
// Create empty live database (only migrate structures, no data)
|
||||
liveDB, err := gorm.Open(sqlite.Open(":memory:"), &gorm.Config{})
|
||||
require.NoError(t, err, "Failed to create empty live database")
|
||||
defer func() {
|
||||
if sqlDB, err := liveDB.DB(); err == nil {
|
||||
sqlDB.Close()
|
||||
}
|
||||
}()
|
||||
|
||||
// Migrate only user table for simple test
|
||||
err = liveDB.AutoMigrate(&user.User{})
|
||||
require.NoError(t, err, "Failed to migrate user structure")
|
||||
|
||||
// Execute
|
||||
err = CopyLiveDatabaseToFile(liveDB, targetFile)
|
||||
|
||||
// Verify
|
||||
require.NoError(t, err, "CopyLiveDatabaseToFile should succeed with empty database")
|
||||
assert.FileExists(t, targetFile, "Target file should be created")
|
||||
|
||||
// Verify target database has structures but no data
|
||||
targetDB, err := gorm.Open(sqlite.Open(targetFile), &gorm.Config{})
|
||||
require.NoError(t, err, "Should be able to open target database")
|
||||
defer func() {
|
||||
if sqlDB, err := targetDB.DB(); err == nil {
|
||||
sqlDB.Close()
|
||||
}
|
||||
}()
|
||||
|
||||
// Check that tables exist but are empty
|
||||
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(0), userCount, "User table should be empty")
|
||||
}
|
||||
|
||||
// BenchmarkCopyLiveDatabaseToFile benchmarks the copy function performance
|
||||
func BenchmarkCopyLiveDatabaseToFile(b *testing.B) {
|
||||
// Setup test database once
|
||||
liveDB, err := gorm.Open(sqlite.Open(":memory:"), &gorm.Config{})
|
||||
if err != nil {
|
||||
b.Fatalf("Failed to create test database: %v", err)
|
||||
}
|
||||
defer func() {
|
||||
if sqlDB, err := liveDB.DB(); err == nil {
|
||||
sqlDB.Close()
|
||||
}
|
||||
}()
|
||||
|
||||
// Migrate minimal structures
|
||||
liveDB.AutoMigrate(&user.User{}, &models.Char{})
|
||||
|
||||
// Add some test data
|
||||
testUser := &user.User{Username: "benchuser", Email: "bench@test.com", PasswordHash: "hash"}
|
||||
liveDB.Create(testUser)
|
||||
|
||||
tempDir := b.TempDir()
|
||||
|
||||
b.ResetTimer()
|
||||
|
||||
for i := 0; i < b.N; i++ {
|
||||
targetFile := filepath.Join(tempDir, fmt.Sprintf("benchmark_%d.db", i))
|
||||
|
||||
err := CopyLiveDatabaseToFile(liveDB, targetFile)
|
||||
if err != nil {
|
||||
b.Fatalf("Benchmark failed: %v", err)
|
||||
}
|
||||
|
||||
// Clean up for next iteration
|
||||
os.Remove(targetFile)
|
||||
}
|
||||
}
|
||||
@@ -2,13 +2,13 @@ package maintenance
|
||||
|
||||
import (
|
||||
"bamort/database"
|
||||
"bamort/importer"
|
||||
"bamort/models"
|
||||
"bamort/user"
|
||||
"fmt"
|
||||
"net/http"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"strings"
|
||||
|
||||
"github.com/gin-gonic/gin"
|
||||
"gorm.io/driver/sqlite"
|
||||
@@ -47,9 +47,9 @@ func migrateAllStructures(db *gorm.DB) error {
|
||||
return fmt.Errorf("failed to migrate gsmaster structures: %w", err)
|
||||
}
|
||||
|
||||
if err := importer.MigrateStructure(db); err != nil {
|
||||
/*if err := importer.MigrateStructure(db); err != nil {
|
||||
return fmt.Errorf("failed to migrate importer structures: %w", err)
|
||||
}
|
||||
}*/
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -74,6 +74,11 @@ func MakeTestdataFromLive(c *gin.Context) {
|
||||
})
|
||||
}
|
||||
|
||||
// CopyLiveDatabaseToFile kopiert die MariaDB-Datenbank in eine SQLite-Datei (exported for testing)
|
||||
func CopyLiveDatabaseToFile(liveDB *gorm.DB, targetFile string) error {
|
||||
return copyLiveDatabaseToFile(liveDB, targetFile)
|
||||
}
|
||||
|
||||
// copyLiveDatabaseToFile kopiert die MariaDB-Datenbank in eine SQLite-Datei
|
||||
func copyLiveDatabaseToFile(liveDB *gorm.DB, targetFile string) error {
|
||||
// Verzeichnis erstellen falls es nicht existiert
|
||||
@@ -189,7 +194,12 @@ func copyMariaDBToSQLite(mariaDB, sqliteDB *gorm.DB) error {
|
||||
func copyTableData(sourceDB, targetDB *gorm.DB, model interface{}) error {
|
||||
// Anzahl der Datensätze prüfen
|
||||
var count int64
|
||||
if err := sourceDB.Model(model).Count(&count).Error; err != nil {
|
||||
err := sourceDB.Model(model).Count(&count).Error
|
||||
if err != nil {
|
||||
// If table doesn't exist, skip silently (useful for testing with partial schemas)
|
||||
if isTableNotExistError(err) {
|
||||
return nil
|
||||
}
|
||||
return err
|
||||
}
|
||||
|
||||
@@ -220,6 +230,14 @@ func copyTableData(sourceDB, targetDB *gorm.DB, model interface{}) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
// isTableNotExistError checks if the error indicates a table doesn't exist
|
||||
func isTableNotExistError(err error) bool {
|
||||
errorMsg := err.Error()
|
||||
return strings.Contains(errorMsg, "no such table") ||
|
||||
strings.Contains(errorMsg, "doesn't exist") ||
|
||||
strings.Contains(errorMsg, "Table") && strings.Contains(errorMsg, "doesn't exist")
|
||||
}
|
||||
|
||||
// LoadPredefinedTestDataFromFile loads predefined test data from a specific file into the provided database
|
||||
func LoadPredefinedTestDataFromFile(targetDB *gorm.DB, dataFile string) error {
|
||||
// Check if file exists
|
||||
|
||||
@@ -1,398 +0,0 @@
|
||||
package maintenance
|
||||
|
||||
import (
|
||||
"bamort/database"
|
||||
"bamort/models"
|
||||
"bamort/user"
|
||||
"fmt"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"testing"
|
||||
|
||||
"github.com/gin-gonic/gin"
|
||||
"github.com/stretchr/testify/assert"
|
||||
"github.com/stretchr/testify/require"
|
||||
"gorm.io/driver/sqlite"
|
||||
"gorm.io/gorm"
|
||||
)
|
||||
|
||||
// cleanupTestEnvironment creates a clean test environment
|
||||
func cleanupTestEnvironment(t *testing.T) {
|
||||
// Clean up any existing test files
|
||||
localTestDataFile := filepath.Join(database.TestDataDir, "predefined_test_data.db")
|
||||
if err := os.RemoveAll(filepath.Dir(localTestDataFile)); err != nil {
|
||||
t.Logf("Warning: Could not clean test directory: %v", err)
|
||||
}
|
||||
|
||||
// Reset any existing database connections
|
||||
database.ResetTestDB()
|
||||
}
|
||||
|
||||
// createTestDataInLiveDB creates some test data in a live database for testing
|
||||
func createTestDataInLiveDB(t *testing.T, liveDB *gorm.DB) {
|
||||
// Create test user
|
||||
testUser := &user.User{
|
||||
Username: "testuser",
|
||||
Email: "test@example.com",
|
||||
PasswordHash: "hashedpassword",
|
||||
}
|
||||
err := liveDB.Create(testUser).Error
|
||||
require.NoError(t, err)
|
||||
|
||||
// Create test character
|
||||
testChar := &models.Char{
|
||||
BamortBase: models.BamortBase{
|
||||
Name: "Test Character",
|
||||
},
|
||||
Rasse: "Human",
|
||||
Typ: "Warrior",
|
||||
}
|
||||
err = liveDB.Create(testChar).Error
|
||||
require.NoError(t, err)
|
||||
|
||||
// Create test skill
|
||||
testSkill := &models.Skill{
|
||||
LookupList: models.LookupList{
|
||||
Name: "Test Skill",
|
||||
Beschreibung: "A test skill",
|
||||
},
|
||||
Category: "Combat",
|
||||
Difficulty: "1",
|
||||
}
|
||||
err = liveDB.Create(testSkill).Error
|
||||
require.NoError(t, err)
|
||||
|
||||
// Create character skill
|
||||
testCharSkill := &models.SkFertigkeit{
|
||||
BamortCharTrait: models.BamortCharTrait{
|
||||
BamortBase: models.BamortBase{
|
||||
Name: "Test Skill",
|
||||
},
|
||||
CharacterID: testChar.ID,
|
||||
},
|
||||
Fertigkeitswert: 5,
|
||||
}
|
||||
err = liveDB.Create(testCharSkill).Error
|
||||
require.NoError(t, err)
|
||||
}
|
||||
|
||||
// checks if copiing data from one DB to another works
|
||||
// it uses 2 in Memory SQLITE databases
|
||||
func TestMakeTestdataFromLiveRewrite(t *testing.T) {
|
||||
cleanupTestEnvironment(t)
|
||||
|
||||
// Create a temporary live database with test data
|
||||
liveDB, err := gorm.Open(sqlite.Open(":memory:"), &gorm.Config{})
|
||||
require.NoError(t, err)
|
||||
|
||||
// Migrate structures to live DB
|
||||
err = database.MigrateStructure(liveDB)
|
||||
require.NoError(t, err)
|
||||
err = user.MigrateStructure(liveDB)
|
||||
require.NoError(t, err)
|
||||
/*
|
||||
err = character.MigrateStructure(liveDB)
|
||||
require.NoError(t, err)
|
||||
*/
|
||||
err = models.MigrateStructure(liveDB)
|
||||
require.NoError(t, err)
|
||||
err = models.MigrateStructure(liveDB)
|
||||
require.NoError(t, err)
|
||||
/*err = equipment.MigrateStructure(liveDB)
|
||||
require.NoError(t, err)*/
|
||||
|
||||
// Create test data in live DB
|
||||
createTestDataInLiveDB(t, liveDB)
|
||||
|
||||
// We'll test the copyAllDataToTestDB function directly since we can't easily mock database.ConnectDatabase
|
||||
// Create a test database to copy to
|
||||
testDb, err := gorm.Open(sqlite.Open(":memory:"), &gorm.Config{})
|
||||
require.NoError(t, err)
|
||||
|
||||
// Migrate structures to test database
|
||||
err = database.MigrateStructure(testDb)
|
||||
require.NoError(t, err)
|
||||
err = user.MigrateStructure(testDb)
|
||||
require.NoError(t, err)
|
||||
/*err = character.MigrateStructure(testDb)
|
||||
require.NoError(t, err)*/
|
||||
err = models.MigrateStructure(testDb)
|
||||
require.NoError(t, err)
|
||||
err = models.MigrateStructure(testDb)
|
||||
require.NoError(t, err)
|
||||
/*err = equipment.MigrateStructure(testDb)
|
||||
require.NoError(t, err)*/
|
||||
|
||||
// Test the copyAllDataToTestDB function
|
||||
copyStats, err := copyAllDataToTestDB(liveDB, testDb)
|
||||
require.NoError(t, err)
|
||||
|
||||
// Verify statistics
|
||||
assert.Greater(t, copyStats["users"], 0, "Should have copied users")
|
||||
assert.Greater(t, copyStats["characters"], 0, "Should have copied characters")
|
||||
assert.Greater(t, copyStats["gsmaster_skills"], 0, "Should have copied skills")
|
||||
|
||||
// Test saving to file
|
||||
localTestDataFile := filepath.Join(database.TestDataDir, "predefined_test_data.db")
|
||||
err = saveTestDatabaseToFile(testDb, localTestDataFile)
|
||||
require.NoError(t, err)
|
||||
|
||||
// Check that the test data file was created
|
||||
_, err = os.Stat(localTestDataFile)
|
||||
assert.NoError(t, err, "Test data file should exist")
|
||||
|
||||
// Verify the file contains data by loading it back
|
||||
fileDB, err := gorm.Open(sqlite.Open(localTestDataFile), &gorm.Config{})
|
||||
require.NoError(t, err)
|
||||
|
||||
var userCount int64
|
||||
err = fileDB.Model(&user.User{}).Count(&userCount).Error
|
||||
require.NoError(t, err)
|
||||
assert.Greater(t, userCount, int64(0), "File should contain users")
|
||||
|
||||
sqlDB, _ := fileDB.DB()
|
||||
sqlDB.Close()
|
||||
}
|
||||
|
||||
func TestLoadPredefinedTestDataFromFile(t *testing.T) {
|
||||
cleanupTestEnvironment(t)
|
||||
|
||||
// Create the directory if it doesn't exist
|
||||
tmpDBFile := filepath.Join(database.TestDataDir, "test_source.db")
|
||||
|
||||
dir := filepath.Dir(tmpDBFile)
|
||||
var mErr error
|
||||
if err := os.MkdirAll(dir, 0755); err != nil {
|
||||
mErr = fmt.Errorf("failed to create directory %s: %w", dir, err)
|
||||
}
|
||||
require.NoError(t, mErr)
|
||||
|
||||
// First, we need to create a test data file
|
||||
// Create a temporary source database with test data
|
||||
sourceDB, err := gorm.Open(sqlite.Open(tmpDBFile), &gorm.Config{})
|
||||
require.NoError(t, err)
|
||||
|
||||
// Migrate structures to source DB
|
||||
err = database.MigrateStructure(sourceDB)
|
||||
require.NoError(t, err)
|
||||
err = user.MigrateStructure(sourceDB)
|
||||
require.NoError(t, err)
|
||||
/*err = character.MigrateStructure(sourceDB)
|
||||
require.NoError(t, err)*/
|
||||
err = models.MigrateStructure(sourceDB)
|
||||
require.NoError(t, err)
|
||||
err = models.MigrateStructure(sourceDB)
|
||||
require.NoError(t, err)
|
||||
/*err = equipment.MigrateStructure(sourceDB)
|
||||
require.NoError(t, err)*/
|
||||
|
||||
// Create test data in source DB
|
||||
createTestDataInLiveDB(t, sourceDB)
|
||||
|
||||
// Save source DB as predefined test data file
|
||||
backupSQL := "VACUUM INTO '" + filepath.Join(database.TestDataDir, "predefined_test_data.db") + "'"
|
||||
|
||||
err = sourceDB.Exec(backupSQL).Error
|
||||
require.NoError(t, err)
|
||||
|
||||
// Close source DB
|
||||
sqlDB, _ := sourceDB.DB()
|
||||
sqlDB.Close()
|
||||
|
||||
// Remove temporary source file
|
||||
defer os.Remove("testdata/test_source.db")
|
||||
|
||||
// Now test LoadPredefinedTestDataFromFile
|
||||
// Create a new target database
|
||||
targetDB, err := gorm.Open(sqlite.Open(":memory:"), &gorm.Config{})
|
||||
require.NoError(t, err)
|
||||
|
||||
// Migrate structures to target DB
|
||||
err = database.MigrateStructure(targetDB)
|
||||
require.NoError(t, err)
|
||||
err = user.MigrateStructure(targetDB)
|
||||
require.NoError(t, err)
|
||||
/*err = character.MigrateStructure(targetDB)
|
||||
require.NoError(t, err)*/
|
||||
err = models.MigrateStructure(targetDB)
|
||||
require.NoError(t, err)
|
||||
err = models.MigrateStructure(targetDB)
|
||||
require.NoError(t, err)
|
||||
/*err = equipment.MigrateStructure(targetDB)
|
||||
require.NoError(t, err)*/
|
||||
|
||||
// Load test data from the source file
|
||||
err = LoadPredefinedTestDataFromFile(targetDB, "testdata/test_source.db")
|
||||
require.NoError(t, err)
|
||||
|
||||
// Verify data was loaded
|
||||
var userCount int64
|
||||
err = targetDB.Model(&user.User{}).Count(&userCount).Error
|
||||
require.NoError(t, err)
|
||||
assert.Greater(t, userCount, int64(0), "Should have loaded users")
|
||||
|
||||
var charCount int64
|
||||
err = targetDB.Model(&models.Char{}).Count(&charCount).Error
|
||||
require.NoError(t, err)
|
||||
assert.Greater(t, charCount, int64(0), "Should have loaded characters")
|
||||
|
||||
var skillCount int64
|
||||
err = targetDB.Model(&models.Skill{}).Count(&skillCount).Error
|
||||
require.NoError(t, err)
|
||||
assert.Greater(t, skillCount, int64(0), "Should have loaded skills")
|
||||
|
||||
// Verify specific data
|
||||
var loadedUser user.User
|
||||
err = targetDB.Where("username = ?", "testuser").First(&loadedUser).Error
|
||||
require.NoError(t, err)
|
||||
assert.Equal(t, "testuser", loadedUser.Username)
|
||||
assert.Equal(t, "test@example.com", loadedUser.Email)
|
||||
|
||||
var loadedChar models.Char
|
||||
err = targetDB.Where("name = ?", "Test Character").First(&loadedChar).Error
|
||||
require.NoError(t, err)
|
||||
assert.Equal(t, "Test Character", loadedChar.Name)
|
||||
assert.Equal(t, "Human", loadedChar.Rasse)
|
||||
}
|
||||
|
||||
func TestLoadPredefinedTestDataFromFile_FileNotFound(t *testing.T) {
|
||||
cleanupTestEnvironment(t)
|
||||
|
||||
// Create target database
|
||||
targetDB, err := gorm.Open(sqlite.Open(":memory:"), &gorm.Config{})
|
||||
require.NoError(t, err)
|
||||
|
||||
// Try to load non-existent test data
|
||||
err = LoadPredefinedTestDataFromFile(targetDB, "nonexistent_file.db")
|
||||
assert.Error(t, err)
|
||||
assert.Contains(t, err.Error(), "predefined test data file not found")
|
||||
}
|
||||
|
||||
func TestSetupTestDBWithTestData(t *testing.T) {
|
||||
cleanupTestEnvironment(t)
|
||||
|
||||
// Create directory if it doesn't exist
|
||||
tmpDBFile := filepath.Join(database.TestDataDir, "test_source.db")
|
||||
|
||||
dir := filepath.Dir(tmpDBFile)
|
||||
var mErr error
|
||||
if err := os.MkdirAll(dir, 0755); err != nil {
|
||||
mErr = fmt.Errorf("failed to create directory %s: %w", dir, err)
|
||||
}
|
||||
require.NoError(t, mErr)
|
||||
|
||||
// First create a predefined test data file
|
||||
sourceDB, err := gorm.Open(sqlite.Open("testdata/test_source.db"), &gorm.Config{})
|
||||
require.NoError(t, err)
|
||||
|
||||
// Migrate structures to live DB
|
||||
err = database.MigrateStructure(sourceDB)
|
||||
require.NoError(t, err)
|
||||
err = user.MigrateStructure(sourceDB)
|
||||
require.NoError(t, err)
|
||||
/*err = character.MigrateStructure(sourceDB)
|
||||
require.NoError(t, err)*/
|
||||
err = models.MigrateStructure(sourceDB)
|
||||
require.NoError(t, err)
|
||||
err = models.MigrateStructure(sourceDB)
|
||||
require.NoError(t, err)
|
||||
/*err = equipment.MigrateStructure(sourceDB)
|
||||
require.NoError(t, err)*/
|
||||
|
||||
createTestDataInLiveDB(t, sourceDB)
|
||||
|
||||
// Save as predefined test data
|
||||
backupSQL := "VACUUM INTO '" + filepath.Join(database.TestDataDir, "predefined_test_data.db") + "'"
|
||||
err = sourceDB.Exec(backupSQL).Error
|
||||
require.NoError(t, err)
|
||||
|
||||
sqlDB, _ := sourceDB.DB()
|
||||
sqlDB.Close()
|
||||
defer os.Remove("testdata/test_source.db")
|
||||
|
||||
// Reset database state
|
||||
database.ResetTestDB()
|
||||
|
||||
// Test SetupTestDB with test data loading
|
||||
database.SetupTestDB(true, true)
|
||||
|
||||
// Verify that database.DB is available and has data
|
||||
require.NotNil(t, database.DB)
|
||||
|
||||
// Check that data was loaded
|
||||
var userCount int64
|
||||
err = database.DB.Model(&user.User{}).Count(&userCount).Error
|
||||
require.NoError(t, err)
|
||||
assert.Greater(t, userCount, int64(0), "Should have loaded test users")
|
||||
|
||||
// Clean up
|
||||
database.ResetTestDB()
|
||||
}
|
||||
|
||||
func TestCopyDataFromFileToMemory(t *testing.T) {
|
||||
cleanupTestEnvironment(t)
|
||||
// Create the directory if it doesn't exist
|
||||
dir := filepath.Dir("testdata/test_source.db")
|
||||
if err := os.MkdirAll(dir, 0755); err != nil {
|
||||
require.NoError(t, err)
|
||||
}
|
||||
|
||||
// Create source file database
|
||||
sourceDB, err := gorm.Open(sqlite.Open("testdata/test_source.db"), &gorm.Config{})
|
||||
require.NoError(t, err)
|
||||
|
||||
//err = os.MkdirAll("testdata", 0755)
|
||||
//require.NoError(t, err)
|
||||
|
||||
// Setup source database
|
||||
err = user.MigrateStructure(sourceDB)
|
||||
require.NoError(t, err)
|
||||
|
||||
testUser := &user.User{
|
||||
Username: "copytest",
|
||||
Email: "copy@test.com",
|
||||
PasswordHash: "password",
|
||||
}
|
||||
err = sourceDB.Create(testUser).Error
|
||||
require.NoError(t, err)
|
||||
|
||||
// Close source DB
|
||||
sqlDB, _ := sourceDB.DB()
|
||||
sqlDB.Close()
|
||||
|
||||
// Create target in-memory database
|
||||
targetDB, err := gorm.Open(sqlite.Open(":memory:"), &gorm.Config{})
|
||||
require.NoError(t, err)
|
||||
|
||||
// Migrate target database
|
||||
err = user.MigrateStructure(targetDB)
|
||||
require.NoError(t, err)
|
||||
|
||||
// Copy data
|
||||
err = copyDataFromFileToMemory("testdata/test_source.db", targetDB)
|
||||
require.NoError(t, err)
|
||||
|
||||
// Verify data was copied
|
||||
var copiedUser user.User
|
||||
err = targetDB.Where("username = ?", "copytest").First(&copiedUser).Error
|
||||
require.NoError(t, err)
|
||||
assert.Equal(t, "copytest", copiedUser.Username)
|
||||
assert.Equal(t, "copy@test.com", copiedUser.Email)
|
||||
|
||||
// Clean up
|
||||
defer os.Remove("testdata/test_source.db")
|
||||
}
|
||||
|
||||
// Cleanup function to run after tests
|
||||
func TestMain(m *testing.M) {
|
||||
// Setup
|
||||
gin.SetMode(gin.TestMode)
|
||||
|
||||
// Run tests
|
||||
code := m.Run()
|
||||
|
||||
// Cleanup
|
||||
os.RemoveAll("testdata")
|
||||
|
||||
os.Exit(code)
|
||||
}
|
||||
@@ -31,6 +31,10 @@ func MigrateStructure(db ...*gorm.DB) error {
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
err = importerMigrateStructure(targetDB)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -0,0 +1,21 @@
|
||||
package models
|
||||
|
||||
import "gorm.io/gorm"
|
||||
|
||||
func importerMigrateStructure(db ...*gorm.DB) error {
|
||||
// Use provided DB or default to database.DB
|
||||
// var targetDB *gorm.DB
|
||||
// if len(db) > 0 && db[0] != nil {
|
||||
// targetDB = db[0]
|
||||
// } else {
|
||||
// targetDB = database.DB
|
||||
// }
|
||||
|
||||
/*
|
||||
err := targetDB.AutoMigrate()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
*/
|
||||
return nil
|
||||
}
|
||||
Reference in New Issue
Block a user