Files
bamort/backend/maintenance/copy_db_test.go
T
2025-08-30 08:59:45 +02:00

119 lines
3.2 KiB
Go

package maintenance
import (
"bamort/database"
"bamort/models"
"bamort/user"
"fmt"
"io"
"os"
"path/filepath"
"testing"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"gorm.io/driver/sqlite"
"gorm.io/gorm"
)
func TestCopyLiveDatabaseToFile(t *testing.T) {
// Setup
tempDir := t.TempDir()
targetFile := filepath.Join(tempDir, "empty_backup.db")
// Create empty live database (only migrate structures, no data)
database.ConnectDatabase()
liveDB := database.DB
require.NotNil(t, liveDB, "Live database should be connected")
defer func() {
if sqlDB, err := liveDB.DB(); err == nil {
sqlDB.Close()
}
}()
// 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(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
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)
}
}