export whole DB as json
This commit is contained in:
@@ -0,0 +1,154 @@
|
||||
package transfer
|
||||
|
||||
import (
|
||||
"bamort/config"
|
||||
"bamort/database"
|
||||
"bamort/models"
|
||||
"encoding/json"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"testing"
|
||||
|
||||
"github.com/stretchr/testify/assert"
|
||||
"github.com/stretchr/testify/require"
|
||||
"gorm.io/gorm"
|
||||
)
|
||||
|
||||
func setupTestDB(t *testing.T) *gorm.DB {
|
||||
database.SetupTestDB(true, true)
|
||||
models.MigrateStructure()
|
||||
/*
|
||||
t.Cleanup(func() {
|
||||
database.ResetTestDB()
|
||||
})
|
||||
*/
|
||||
return database.DB
|
||||
}
|
||||
|
||||
func TestExportDatabase_Success(t *testing.T) {
|
||||
//setupTestEnvironment(t)
|
||||
db := setupTestDB(t)
|
||||
if db.Error != nil {
|
||||
t.Fatalf("Failed to setup test DB: %v", db.Error)
|
||||
}
|
||||
|
||||
// Create temporary export directory
|
||||
exportDir := t.TempDir()
|
||||
config.LoadConfig()
|
||||
exportDir = config.Cfg.ExportTempDir
|
||||
|
||||
// Export database
|
||||
result, err := ExportDatabase(exportDir)
|
||||
|
||||
// Assertions
|
||||
require.NoError(t, err, "ExportDatabase should succeed")
|
||||
assert.NotNil(t, result, "Result should not be nil")
|
||||
assert.NotEmpty(t, result.Filename, "Filename should be set")
|
||||
assert.NotEmpty(t, result.FilePath, "FilePath should be set")
|
||||
assert.True(t, result.RecordCount > 0, "Should export some records")
|
||||
|
||||
// Verify file exists
|
||||
assert.FileExists(t, result.FilePath, "Export file should exist")
|
||||
|
||||
// Verify file is valid JSON
|
||||
data, err := os.ReadFile(result.FilePath)
|
||||
require.NoError(t, err, "Should be able to read export file")
|
||||
|
||||
var export DatabaseExport
|
||||
err = json.Unmarshal(data, &export)
|
||||
require.NoError(t, err, "Export file should be valid JSON")
|
||||
}
|
||||
|
||||
func TestExportDatabase_InvalidDirectory(t *testing.T) {
|
||||
//setupTestEnvironment(t)
|
||||
db := setupTestDB(t)
|
||||
if db.Error != nil {
|
||||
t.Fatalf("Failed to setup test DB: %v", db.Error)
|
||||
}
|
||||
|
||||
// Try to export to non-existent directory
|
||||
result, err := ExportDatabase("/invalid/path/that/does/not/exist")
|
||||
|
||||
assert.Error(t, err, "Should fail with invalid directory")
|
||||
assert.Nil(t, result, "Result should be nil on error")
|
||||
}
|
||||
|
||||
func TestImportDatabase_Success(t *testing.T) {
|
||||
//setupTestEnvironment(t)
|
||||
db := setupTestDB(t)
|
||||
if db.Error != nil {
|
||||
t.Fatalf("Failed to setup test DB: %v", db.Error)
|
||||
}
|
||||
|
||||
// First export database
|
||||
exportDir := t.TempDir()
|
||||
exportResult, err := ExportDatabase(exportDir)
|
||||
require.NoError(t, err, "Export should succeed")
|
||||
|
||||
// Clear database
|
||||
db.Exec("DELETE FROM characters")
|
||||
db.Exec("DELETE FROM users")
|
||||
|
||||
// Import database
|
||||
result, err := ImportDatabase(exportResult.FilePath)
|
||||
|
||||
// Assertions
|
||||
require.NoError(t, err, "ImportDatabase should succeed")
|
||||
assert.NotNil(t, result, "Result should not be nil")
|
||||
assert.True(t, result.RecordCount > 0, "Should import some records")
|
||||
}
|
||||
|
||||
func TestImportDatabase_FileNotFound(t *testing.T) {
|
||||
//setupTestEnvironment(t)
|
||||
db := setupTestDB(t)
|
||||
if db.Error != nil {
|
||||
t.Fatalf("Failed to setup test DB: %v", db.Error)
|
||||
}
|
||||
|
||||
result, err := ImportDatabase("/nonexistent/file.json")
|
||||
|
||||
assert.Error(t, err, "Should fail with non-existent file")
|
||||
assert.Nil(t, result, "Result should be nil on error")
|
||||
}
|
||||
|
||||
func TestImportDatabase_InvalidJSON(t *testing.T) {
|
||||
//setupTestEnvironment(t)
|
||||
db := setupTestDB(t)
|
||||
if db.Error != nil {
|
||||
t.Fatalf("Failed to setup test DB: %v", db.Error)
|
||||
}
|
||||
|
||||
// Create invalid JSON file
|
||||
tmpFile := filepath.Join(t.TempDir(), "invalid.json")
|
||||
err := os.WriteFile(tmpFile, []byte("invalid json content"), 0644)
|
||||
require.NoError(t, err)
|
||||
|
||||
result, err := ImportDatabase(tmpFile)
|
||||
|
||||
assert.Error(t, err, "Should fail with invalid JSON")
|
||||
assert.Nil(t, result, "Result should be nil on error")
|
||||
}
|
||||
|
||||
func TestExportImportRoundtrip(t *testing.T) {
|
||||
//setupTestEnvironment(t)
|
||||
db := setupTestDB(t)
|
||||
if db.Error != nil {
|
||||
t.Fatalf("Failed to setup test DB: %v", db.Error)
|
||||
}
|
||||
|
||||
exportDir := t.TempDir()
|
||||
|
||||
// Export
|
||||
exportResult, err := ExportDatabase(exportDir)
|
||||
require.NoError(t, err, "Export should succeed")
|
||||
|
||||
originalCount := exportResult.RecordCount
|
||||
|
||||
// Import
|
||||
importResult, err := ImportDatabase(exportResult.FilePath)
|
||||
require.NoError(t, err, "Import should succeed")
|
||||
|
||||
// Record counts should match
|
||||
assert.Equal(t, originalCount, importResult.RecordCount,
|
||||
"Import should restore same number of records")
|
||||
}
|
||||
Reference in New Issue
Block a user