kopiere Datenbank aus TestCopyLiveDatabaseToFile nach database.PreparedTestDB
This commit is contained in:
@@ -2,9 +2,8 @@ package maintenance
|
||||
|
||||
import (
|
||||
"bamort/database"
|
||||
"bamort/models"
|
||||
"bamort/user"
|
||||
"fmt"
|
||||
"io"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"testing"
|
||||
@@ -15,176 +14,6 @@ import (
|
||||
"gorm.io/gorm"
|
||||
)
|
||||
|
||||
// TestCopyLiveDatabaseToFile_Success tests the main functionality of copyLiveDatabaseToFile
|
||||
func TestCopyDatabaseToFile_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 TestCopyDatabaseToFile_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 TestCopyDatabaseToFile_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")
|
||||
}
|
||||
|
||||
func TestCopyLiveDatabaseToFile(t *testing.T) {
|
||||
// Setup
|
||||
tempDir := t.TempDir()
|
||||
@@ -221,8 +50,35 @@ func TestCopyLiveDatabaseToFile(t *testing.T) {
|
||||
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")
|
||||
|
||||
// Copy target file to database.PreparedTestDB for permanent storage
|
||||
// Close the database connection before copying
|
||||
if sqlDB, err := targetDB.DB(); err == nil {
|
||||
sqlDB.Close()
|
||||
}
|
||||
|
||||
// Ensure the directory for PreparedTestDB exists
|
||||
preparedDir := filepath.Dir(database.PreparedTestDB)
|
||||
err = os.MkdirAll(preparedDir, 0755)
|
||||
require.NoError(t, err, "Failed to create directory for PreparedTestDB")
|
||||
|
||||
// Copy the target file to PreparedTestDB using direct file copy
|
||||
sourceFile, err := os.Open(targetFile)
|
||||
require.NoError(t, err, "Failed to open source file")
|
||||
defer sourceFile.Close()
|
||||
|
||||
destFile, err := os.Create(database.PreparedTestDB)
|
||||
require.NoError(t, err, "Failed to create destination file")
|
||||
defer destFile.Close()
|
||||
|
||||
_, err = io.Copy(destFile, sourceFile)
|
||||
require.NoError(t, err, "Failed to copy file")
|
||||
|
||||
t.Logf("Test database successfully copied to: %s", database.PreparedTestDB)
|
||||
|
||||
}
|
||||
|
||||
/*
|
||||
// BenchmarkCopyLiveDatabaseToFile benchmarks the copy function performance
|
||||
func BenchmarkCopyLiveDatabaseToFile(b *testing.B) {
|
||||
// Setup test database once
|
||||
@@ -259,3 +115,4 @@ func BenchmarkCopyLiveDatabaseToFile(b *testing.B) {
|
||||
os.Remove(targetFile)
|
||||
}
|
||||
}
|
||||
*/
|
||||
|
||||
Reference in New Issue
Block a user