Export and Import of Game system master data
This commit is contained in:
@@ -0,0 +1,914 @@
|
||||
package gsmaster
|
||||
|
||||
import (
|
||||
"bamort/database"
|
||||
"bamort/models"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"testing"
|
||||
|
||||
"github.com/stretchr/testify/assert"
|
||||
"gorm.io/gorm"
|
||||
)
|
||||
|
||||
func TestExportSkills(t *testing.T) {
|
||||
setupTestEnvironment(t)
|
||||
database.SetupTestDB()
|
||||
|
||||
// Create test data
|
||||
source := getOrCreateSource("KOD", "Kodex")
|
||||
skill := models.Skill{
|
||||
Name: "Schwimmen",
|
||||
GameSystem: "midgard",
|
||||
Beschreibung: "Schwimmen im Wasser",
|
||||
Initialwert: 12,
|
||||
BasisWert: 0,
|
||||
Bonuseigenschaft: "Gw",
|
||||
Improvable: true,
|
||||
InnateSkill: false,
|
||||
SourceID: source.ID,
|
||||
PageNumber: 42,
|
||||
}
|
||||
database.DB.Create(&skill)
|
||||
|
||||
// Export skills
|
||||
tmpDir := t.TempDir()
|
||||
err := ExportSkills(tmpDir)
|
||||
if err != nil {
|
||||
t.Fatalf("ExportSkills failed: %v", err)
|
||||
}
|
||||
|
||||
// Verify file exists
|
||||
exportFile := filepath.Join(tmpDir, "skills.json")
|
||||
if _, err := os.Stat(exportFile); os.IsNotExist(err) {
|
||||
t.Fatalf("Export file not created: %s", exportFile)
|
||||
}
|
||||
}
|
||||
|
||||
func TestImportSkills(t *testing.T) {
|
||||
setupTestEnvironment(t)
|
||||
database.SetupTestDB()
|
||||
|
||||
// Create source that will be referenced
|
||||
source := getOrCreateSource("KOD", "Kodex")
|
||||
|
||||
// Export first
|
||||
tmpDir := t.TempDir()
|
||||
skill := models.Skill{
|
||||
Name: "Klettern",
|
||||
GameSystem: "midgard",
|
||||
Beschreibung: "Klettern an Wänden",
|
||||
Initialwert: 10,
|
||||
BasisWert: 0,
|
||||
Bonuseigenschaft: "Gw",
|
||||
Improvable: true,
|
||||
InnateSkill: false,
|
||||
SourceID: source.ID,
|
||||
PageNumber: 50,
|
||||
}
|
||||
database.DB.Create(&skill)
|
||||
|
||||
err := ExportSkills(tmpDir)
|
||||
if err != nil {
|
||||
t.Fatalf("ExportSkills failed: %v", err)
|
||||
}
|
||||
|
||||
// Delete the skill
|
||||
database.DB.Delete(&skill)
|
||||
|
||||
// Import back
|
||||
err = ImportSkills(tmpDir)
|
||||
if err != nil {
|
||||
t.Fatalf("ImportSkills failed: %v", err)
|
||||
}
|
||||
|
||||
// Verify skill was imported
|
||||
var importedSkill models.Skill
|
||||
err = database.DB.Where("name = ? AND game_system = ?", "Klettern", "midgard").First(&importedSkill).Error
|
||||
if err != nil {
|
||||
t.Fatalf("Imported skill not found: %v", err)
|
||||
}
|
||||
|
||||
if importedSkill.Beschreibung != "Klettern an Wänden" {
|
||||
t.Errorf("Expected beschreibung 'Klettern an Wänden', got '%s'", importedSkill.Beschreibung)
|
||||
}
|
||||
|
||||
if importedSkill.Initialwert != 10 {
|
||||
t.Errorf("Expected initialwert 10, got %d", importedSkill.Initialwert)
|
||||
}
|
||||
}
|
||||
|
||||
func TestImportSkillsUpdate(t *testing.T) {
|
||||
setupTestEnvironment(t)
|
||||
database.SetupTestDB()
|
||||
|
||||
source := getOrCreateSource("KOD", "Kodex")
|
||||
|
||||
// Create existing skill
|
||||
skill := models.Skill{
|
||||
Name: "Reiten",
|
||||
GameSystem: "midgard",
|
||||
Beschreibung: "Alte Beschreibung",
|
||||
Initialwert: 8,
|
||||
SourceID: source.ID,
|
||||
PageNumber: 30,
|
||||
}
|
||||
database.DB.Create(&skill)
|
||||
|
||||
// Export, modify, and re-import
|
||||
tmpDir := t.TempDir()
|
||||
err := ExportSkills(tmpDir)
|
||||
if err != nil {
|
||||
t.Fatalf("ExportSkills failed: %v", err)
|
||||
}
|
||||
|
||||
// Update skill manually
|
||||
skill.Beschreibung = "Neue Beschreibung"
|
||||
skill.Initialwert = 12
|
||||
database.DB.Save(&skill)
|
||||
|
||||
// Export again with updated values
|
||||
err = ExportSkills(tmpDir)
|
||||
if err != nil {
|
||||
t.Fatalf("ExportSkills failed: %v", err)
|
||||
}
|
||||
|
||||
// Reset to old values
|
||||
skill.Beschreibung = "Alte Beschreibung"
|
||||
skill.Initialwert = 8
|
||||
database.DB.Save(&skill)
|
||||
|
||||
// Import should update to exported values
|
||||
err = ImportSkills(tmpDir)
|
||||
if err != nil {
|
||||
t.Fatalf("ImportSkills failed: %v", err)
|
||||
}
|
||||
|
||||
// Verify update
|
||||
var updatedSkill models.Skill
|
||||
err = database.DB.Where("name = ? AND game_system = ?", "Reiten", "midgard").First(&updatedSkill).Error
|
||||
if err != nil {
|
||||
t.Fatalf("Updated skill not found: %v", err)
|
||||
}
|
||||
|
||||
if updatedSkill.Beschreibung != "Neue Beschreibung" {
|
||||
t.Errorf("Expected updated beschreibung 'Neue Beschreibung', got '%s'", updatedSkill.Beschreibung)
|
||||
}
|
||||
|
||||
if updatedSkill.Initialwert != 12 {
|
||||
t.Errorf("Expected updated initialwert 12, got %d", updatedSkill.Initialwert)
|
||||
}
|
||||
}
|
||||
|
||||
func TestExportImportSources(t *testing.T) {
|
||||
setupTestEnvironment(t)
|
||||
database.SetupTestDB()
|
||||
|
||||
// Create test source
|
||||
source := models.Source{
|
||||
Code: "ARK",
|
||||
Name: "Arkanum",
|
||||
GameSystem: "midgard",
|
||||
IsActive: true,
|
||||
}
|
||||
database.DB.Create(&source)
|
||||
|
||||
// Export
|
||||
tmpDir := t.TempDir()
|
||||
err := ExportSources(tmpDir)
|
||||
if err != nil {
|
||||
t.Fatalf("ExportSources failed: %v", err)
|
||||
}
|
||||
|
||||
// Delete
|
||||
database.DB.Delete(&source)
|
||||
|
||||
// Import
|
||||
err = ImportSources(tmpDir)
|
||||
if err != nil {
|
||||
t.Fatalf("ImportSources failed: %v", err)
|
||||
}
|
||||
|
||||
// Verify
|
||||
var imported models.Source
|
||||
err = database.DB.Where("code = ?", "ARK").First(&imported).Error
|
||||
if err != nil {
|
||||
t.Fatalf("Imported source not found: %v", err)
|
||||
}
|
||||
|
||||
if imported.Name != "Arkanum" {
|
||||
t.Errorf("Expected name 'Arkanum', got '%s'", imported.Name)
|
||||
}
|
||||
}
|
||||
|
||||
func TestExportImportSkillCategoryDifficulty(t *testing.T) {
|
||||
setupTestEnvironment(t)
|
||||
database.SetupTestDB()
|
||||
|
||||
// Create dependencies
|
||||
source := getOrCreateSource("KOD", "Kodex")
|
||||
skill := models.Skill{
|
||||
Name: "Tanzen",
|
||||
GameSystem: "midgard",
|
||||
SourceID: source.ID,
|
||||
}
|
||||
database.DB.Create(&skill)
|
||||
|
||||
category := getOrCreateCategory("Alltag", source.ID)
|
||||
difficulty := getOrCreateDifficulty("leicht")
|
||||
|
||||
// Create relationship
|
||||
scd := models.SkillCategoryDifficulty{
|
||||
SkillID: skill.ID,
|
||||
SkillCategoryID: category.ID,
|
||||
SkillDifficultyID: difficulty.ID,
|
||||
LearnCost: 5,
|
||||
SCategory: category.Name,
|
||||
SDifficulty: difficulty.Name,
|
||||
}
|
||||
database.DB.Create(&scd)
|
||||
|
||||
// Export
|
||||
tmpDir := t.TempDir()
|
||||
err := ExportSkillCategoryDifficulties(tmpDir)
|
||||
if err != nil {
|
||||
t.Fatalf("ExportSkillCategoryDifficulties failed: %v", err)
|
||||
}
|
||||
|
||||
// Delete relationship
|
||||
database.DB.Delete(&scd)
|
||||
|
||||
// Import
|
||||
err = ImportSkillCategoryDifficulties(tmpDir)
|
||||
if err != nil {
|
||||
t.Fatalf("ImportSkillCategoryDifficulties failed: %v", err)
|
||||
}
|
||||
|
||||
// Verify relationship was recreated
|
||||
var imported models.SkillCategoryDifficulty
|
||||
err = database.DB.Where("skill_id = ? AND skill_category_id = ?", skill.ID, category.ID).First(&imported).Error
|
||||
if err != nil {
|
||||
t.Fatalf("Imported relationship not found: %v", err)
|
||||
}
|
||||
|
||||
if imported.LearnCost != 5 {
|
||||
t.Errorf("Expected learn_cost 5, got %d", imported.LearnCost)
|
||||
}
|
||||
}
|
||||
|
||||
func TestExportImportSkillCategories(t *testing.T) {
|
||||
setupTestEnvironment(t)
|
||||
database.SetupTestDB()
|
||||
|
||||
// Create test data
|
||||
source := getOrCreateSource("TEST_SC", "Test Source")
|
||||
category := models.SkillCategory{
|
||||
Name: "TestCategory",
|
||||
GameSystem: "midgard",
|
||||
SourceID: source.ID,
|
||||
}
|
||||
database.DB.Create(&category)
|
||||
|
||||
// Export
|
||||
tempDir := t.TempDir()
|
||||
err := ExportSkillCategories(tempDir)
|
||||
if err != nil {
|
||||
t.Fatalf("ExportSkillCategories failed: %v", err)
|
||||
}
|
||||
|
||||
// Verify file was created
|
||||
filename := filepath.Join(tempDir, "skill_categories.json")
|
||||
if _, err := os.Stat(filename); os.IsNotExist(err) {
|
||||
t.Fatalf("Export file not created: %s", filename)
|
||||
}
|
||||
|
||||
// Delete the category
|
||||
database.DB.Unscoped().Delete(&category)
|
||||
|
||||
// Import
|
||||
err = ImportSkillCategories(tempDir)
|
||||
if err != nil {
|
||||
t.Fatalf("ImportSkillCategories failed: %v", err)
|
||||
}
|
||||
|
||||
// Verify the category was recreated
|
||||
var imported models.SkillCategory
|
||||
result := database.DB.Where("name = ? AND game_system = ?", "TestCategory", "midgard").First(&imported)
|
||||
if result.Error != nil {
|
||||
t.Fatalf("Category not found after import: %v", result.Error)
|
||||
}
|
||||
|
||||
if imported.SourceID != source.ID {
|
||||
t.Errorf("Expected SourceID %d, got %d", source.ID, imported.SourceID)
|
||||
}
|
||||
}
|
||||
|
||||
func TestExportImportSkillDifficulties(t *testing.T) {
|
||||
setupTestEnvironment(t)
|
||||
database.SetupTestDB()
|
||||
|
||||
// Create test data
|
||||
difficulty := models.SkillDifficulty{
|
||||
Name: "TestDifficulty",
|
||||
GameSystem: "midgard",
|
||||
}
|
||||
database.DB.Create(&difficulty)
|
||||
|
||||
// Export
|
||||
tempDir := t.TempDir()
|
||||
err := ExportSkillDifficulties(tempDir)
|
||||
if err != nil {
|
||||
t.Fatalf("ExportSkillDifficulties failed: %v", err)
|
||||
}
|
||||
|
||||
// Verify file was created
|
||||
filename := filepath.Join(tempDir, "skill_difficulties.json")
|
||||
if _, err := os.Stat(filename); os.IsNotExist(err) {
|
||||
t.Fatalf("Export file not created: %s", filename)
|
||||
}
|
||||
|
||||
// Delete the difficulty
|
||||
database.DB.Unscoped().Delete(&difficulty)
|
||||
|
||||
// Import
|
||||
err = ImportSkillDifficulties(tempDir)
|
||||
if err != nil {
|
||||
t.Fatalf("ImportSkillDifficulties failed: %v", err)
|
||||
}
|
||||
|
||||
// Verify the difficulty was recreated
|
||||
var imported models.SkillDifficulty
|
||||
result := database.DB.Where("name = ? AND game_system = ?", "TestDifficulty", "midgard").First(&imported)
|
||||
if result.Error != nil {
|
||||
t.Fatalf("Difficulty not found after import: %v", result.Error)
|
||||
}
|
||||
}
|
||||
|
||||
func TestExportImportSpells(t *testing.T) {
|
||||
setupTestEnvironment(t)
|
||||
database.SetupTestDB()
|
||||
|
||||
// Create test data
|
||||
source := getOrCreateSource("TEST_SP", "Test Spell Source")
|
||||
spell := models.Spell{
|
||||
Name: "TestSpell",
|
||||
GameSystem: "midgard",
|
||||
Beschreibung: "Test description",
|
||||
SourceID: source.ID,
|
||||
PageNumber: 42,
|
||||
Bonus: 5,
|
||||
Stufe: 3,
|
||||
AP: "2",
|
||||
Art: "Gestenzauber",
|
||||
Zauberdauer: "10 sec",
|
||||
Reichweite: "10m",
|
||||
Wirkungsziel: "Person",
|
||||
Wirkungsbereich: "1 Person",
|
||||
Wirkungsdauer: "1h",
|
||||
Ursprung: "Elben",
|
||||
Category: "normal",
|
||||
LearningCategory: "default",
|
||||
}
|
||||
database.DB.Create(&spell)
|
||||
|
||||
// Export
|
||||
tempDir := t.TempDir()
|
||||
err := ExportSpells(tempDir)
|
||||
if err != nil {
|
||||
t.Fatalf("ExportSpells failed: %v", err)
|
||||
}
|
||||
|
||||
// Verify file was created
|
||||
filename := filepath.Join(tempDir, "spells.json")
|
||||
if _, err := os.Stat(filename); os.IsNotExist(err) {
|
||||
t.Fatalf("Export file not created: %s", filename)
|
||||
}
|
||||
|
||||
// Modify the spell
|
||||
spell.Beschreibung = "Old description"
|
||||
spell.Bonus = 3
|
||||
database.DB.Save(&spell)
|
||||
|
||||
// Import (should update)
|
||||
err = ImportSpells(tempDir)
|
||||
if err != nil {
|
||||
t.Fatalf("ImportSpells failed: %v", err)
|
||||
}
|
||||
|
||||
// Verify the spell was updated
|
||||
var imported models.Spell
|
||||
result := database.DB.Where("name = ? AND game_system = ?", "TestSpell", "midgard").First(&imported)
|
||||
if result.Error != nil {
|
||||
t.Fatalf("Spell not found after import: %v", result.Error)
|
||||
}
|
||||
|
||||
if imported.Beschreibung != "Test description" {
|
||||
t.Errorf("Expected description 'Test description', got '%s'", imported.Beschreibung)
|
||||
}
|
||||
if imported.Bonus != 5 {
|
||||
t.Errorf("Expected bonus 5, got %d", imported.Bonus)
|
||||
}
|
||||
if imported.Stufe != 3 {
|
||||
t.Errorf("Expected level 3, got %d", imported.Stufe)
|
||||
}
|
||||
}
|
||||
|
||||
func TestExportImportAll(t *testing.T) {
|
||||
setupTestEnvironment(t)
|
||||
database.SetupTestDB()
|
||||
|
||||
// Create test data
|
||||
source := getOrCreateSource("TEST_ALL", "Test All Source")
|
||||
|
||||
category := models.SkillCategory{Name: "AllCategory", GameSystem: "midgard", SourceID: source.ID}
|
||||
database.DB.Create(&category)
|
||||
|
||||
difficulty := models.SkillDifficulty{Name: "AllDifficulty", GameSystem: "midgard"}
|
||||
database.DB.Create(&difficulty)
|
||||
|
||||
skill := models.Skill{
|
||||
Name: "AllSkill",
|
||||
GameSystem: "midgard",
|
||||
SourceID: source.ID,
|
||||
Initialwert: 10,
|
||||
}
|
||||
database.DB.Create(&skill)
|
||||
|
||||
spell := models.Spell{
|
||||
Name: "AllSpell",
|
||||
GameSystem: "midgard",
|
||||
SourceID: source.ID,
|
||||
Stufe: 2,
|
||||
}
|
||||
database.DB.Create(&spell)
|
||||
|
||||
// Export all
|
||||
tempDir := t.TempDir()
|
||||
err := ExportAll(tempDir)
|
||||
if err != nil {
|
||||
t.Fatalf("ExportAll failed: %v", err)
|
||||
}
|
||||
|
||||
// Verify all files were created
|
||||
files := []string{
|
||||
"sources.json",
|
||||
"character_classes.json",
|
||||
"skill_categories.json",
|
||||
"skill_difficulties.json",
|
||||
"spell_schools.json",
|
||||
"skills.json",
|
||||
"skill_category_difficulties.json",
|
||||
"spells.json",
|
||||
"class_category_ep_costs.json",
|
||||
"class_spell_school_ep_costs.json",
|
||||
"spell_level_le_costs.json",
|
||||
"skill_improvement_costs.json",
|
||||
"weapon_skills.json",
|
||||
"equipment.json",
|
||||
"weapons.json",
|
||||
"containers.json",
|
||||
"transportation.json",
|
||||
"believes.json",
|
||||
}
|
||||
for _, file := range files {
|
||||
filename := filepath.Join(tempDir, file)
|
||||
if _, err := os.Stat(filename); os.IsNotExist(err) {
|
||||
t.Errorf("Export file not created: %s", filename)
|
||||
}
|
||||
}
|
||||
|
||||
// Delete all test data
|
||||
database.DB.Unscoped().Delete(&spell)
|
||||
database.DB.Unscoped().Delete(&skill)
|
||||
database.DB.Unscoped().Delete(&difficulty)
|
||||
database.DB.Unscoped().Delete(&category)
|
||||
// Don't delete source to avoid FK constraints
|
||||
|
||||
// Import all
|
||||
err = ImportAll(tempDir)
|
||||
if err != nil {
|
||||
t.Fatalf("ImportAll failed: %v", err)
|
||||
}
|
||||
|
||||
// Verify all data was recreated
|
||||
var importedCategory models.SkillCategory
|
||||
if err := database.DB.Where("name = ? AND game_system = ?", "AllCategory", "midgard").First(&importedCategory).Error; err != nil {
|
||||
t.Errorf("Category not found after import: %v", err)
|
||||
}
|
||||
|
||||
var importedDifficulty models.SkillDifficulty
|
||||
if err := database.DB.Where("name = ? AND game_system = ?", "AllDifficulty", "midgard").First(&importedDifficulty).Error; err != nil {
|
||||
t.Errorf("Difficulty not found after import: %v", err)
|
||||
}
|
||||
|
||||
var importedSkill models.Skill
|
||||
if err := database.DB.Where("name = ? AND game_system = ?", "AllSkill", "midgard").First(&importedSkill).Error; err != nil {
|
||||
t.Errorf("Skill not found after import: %v", err)
|
||||
}
|
||||
|
||||
var importedSpell models.Spell
|
||||
if err := database.DB.Where("name = ? AND game_system = ?", "AllSpell", "midgard").First(&importedSpell).Error; err != nil {
|
||||
t.Errorf("Spell not found after import: %v", err)
|
||||
}
|
||||
}
|
||||
|
||||
func TestExportAll_live(t *testing.T) {
|
||||
setupTestEnvironment(t)
|
||||
database.SetupTestDB(false)
|
||||
|
||||
// Export all
|
||||
tempDir := t.TempDir()
|
||||
err := ExportAll(tempDir)
|
||||
if err != nil {
|
||||
t.Fatalf("ExportAll failed: %v", err)
|
||||
}
|
||||
|
||||
// Verify all files were created
|
||||
files := []string{"sources.json", "skill_categories.json", "skill_difficulties.json", "skills.json", "spells.json", "skill_category_difficulties.json"}
|
||||
for _, file := range files {
|
||||
filename := filepath.Join(tempDir, file)
|
||||
if _, err := os.Stat(filename); os.IsNotExist(err) {
|
||||
t.Errorf("Export file not created: %s", filename)
|
||||
}
|
||||
}
|
||||
|
||||
assert.Equal(t, len(files), 6)
|
||||
|
||||
}
|
||||
|
||||
func TestExportImportWeaponSkills(t *testing.T) {
|
||||
setupTestEnvironment(t)
|
||||
database.SetupTestDB()
|
||||
|
||||
source := getOrCreateSource("TEST_WS", "Test Weapon Source")
|
||||
weaponSkill := models.WeaponSkill{
|
||||
Skill: models.Skill{
|
||||
Name: "Langschwert",
|
||||
GameSystem: "midgard",
|
||||
Beschreibung: "Langschwert Waffenfertigkeiten",
|
||||
SourceID: source.ID,
|
||||
PageNumber: 50,
|
||||
Initialwert: 10,
|
||||
BasisWert: 5,
|
||||
Bonuseigenschaft: "St",
|
||||
Improvable: true,
|
||||
InnateSkill: false,
|
||||
Category: "Waffen",
|
||||
Difficulty: "normal",
|
||||
},
|
||||
}
|
||||
database.DB.Create(&weaponSkill)
|
||||
|
||||
tempDir := t.TempDir()
|
||||
err := ExportWeaponSkills(tempDir)
|
||||
if err != nil {
|
||||
t.Fatalf("ExportWeaponSkills failed: %v", err)
|
||||
}
|
||||
|
||||
filename := filepath.Join(tempDir, "weapon_skills.json")
|
||||
if _, err := os.Stat(filename); os.IsNotExist(err) {
|
||||
t.Fatalf("Export file not created: %s", filename)
|
||||
}
|
||||
|
||||
database.DB.Unscoped().Delete(&weaponSkill)
|
||||
|
||||
err = ImportWeaponSkills(tempDir)
|
||||
if err != nil {
|
||||
t.Fatalf("ImportWeaponSkills failed: %v", err)
|
||||
}
|
||||
|
||||
var imported models.WeaponSkill
|
||||
result := database.DB.Where("name = ? AND game_system = ?", "Langschwert", "midgard").First(&imported)
|
||||
if result.Error != nil {
|
||||
t.Fatalf("Weapon skill not found after import: %v", result.Error)
|
||||
}
|
||||
|
||||
assert.Equal(t, "Langschwert Waffenfertigkeiten", imported.Beschreibung)
|
||||
assert.Equal(t, 10, imported.Initialwert)
|
||||
assert.Equal(t, 5, imported.BasisWert)
|
||||
}
|
||||
|
||||
func TestExportImportEquipment(t *testing.T) {
|
||||
setupTestEnvironment(t)
|
||||
database.SetupTestDB()
|
||||
|
||||
source := getOrCreateSource("TEST_EQ", "Test Equipment Source")
|
||||
equipment := models.Equipment{
|
||||
Name: "Seil",
|
||||
GameSystem: "midgard",
|
||||
Beschreibung: "10m langes Hanfseil",
|
||||
SourceID: source.ID,
|
||||
PageNumber: 75,
|
||||
Gewicht: 2.5,
|
||||
Wert: 15.0,
|
||||
PersonalItem: false,
|
||||
}
|
||||
database.DB.Create(&equipment)
|
||||
|
||||
tempDir := t.TempDir()
|
||||
err := ExportEquipment(tempDir)
|
||||
if err != nil {
|
||||
t.Fatalf("ExportEquipment failed: %v", err)
|
||||
}
|
||||
|
||||
filename := filepath.Join(tempDir, "equipment.json")
|
||||
if _, err := os.Stat(filename); os.IsNotExist(err) {
|
||||
t.Fatalf("Export file not created: %s", filename)
|
||||
}
|
||||
|
||||
equipment.Wert = 10.0
|
||||
database.DB.Save(&equipment)
|
||||
|
||||
err = ImportEquipment(tempDir)
|
||||
if err != nil {
|
||||
t.Fatalf("ImportEquipment failed: %v", err)
|
||||
}
|
||||
|
||||
var imported models.Equipment
|
||||
result := database.DB.Where("name = ? AND game_system = ?", "Seil", "midgard").First(&imported)
|
||||
if result.Error != nil {
|
||||
t.Fatalf("Equipment not found after import: %v", result.Error)
|
||||
}
|
||||
|
||||
assert.Equal(t, 15.0, imported.Wert)
|
||||
assert.Equal(t, 2.5, imported.Gewicht)
|
||||
}
|
||||
|
||||
func TestExportImportWeapons(t *testing.T) {
|
||||
setupTestEnvironment(t)
|
||||
database.SetupTestDB()
|
||||
|
||||
source := getOrCreateSource("TEST_WP", "Test Weapon Source")
|
||||
weapon := models.Weapon{
|
||||
Equipment: models.Equipment{
|
||||
Name: "Kurzschwert",
|
||||
GameSystem: "midgard",
|
||||
Beschreibung: "Einhändiges Kurzschwert",
|
||||
SourceID: source.ID,
|
||||
PageNumber: 80,
|
||||
Gewicht: 1.5,
|
||||
Wert: 50.0,
|
||||
PersonalItem: false,
|
||||
},
|
||||
SkillRequired: "Langschwert",
|
||||
Damage: "1W6+1",
|
||||
RangeNear: 0,
|
||||
RangeMiddle: 0,
|
||||
RangeFar: 0,
|
||||
}
|
||||
database.DB.Create(&weapon)
|
||||
|
||||
tempDir := t.TempDir()
|
||||
err := ExportWeapons(tempDir)
|
||||
if err != nil {
|
||||
t.Fatalf("ExportWeapons failed: %v", err)
|
||||
}
|
||||
|
||||
filename := filepath.Join(tempDir, "weapons.json")
|
||||
if _, err := os.Stat(filename); os.IsNotExist(err) {
|
||||
t.Fatalf("Export file not created: %s", filename)
|
||||
}
|
||||
|
||||
weapon.Damage = "1W6"
|
||||
database.DB.Save(&weapon)
|
||||
|
||||
err = ImportWeapons(tempDir)
|
||||
if err != nil {
|
||||
t.Fatalf("ImportWeapons failed: %v", err)
|
||||
}
|
||||
|
||||
var imported models.Weapon
|
||||
result := database.DB.Where("name = ? AND game_system = ?", "Kurzschwert", "midgard").First(&imported)
|
||||
if result.Error != nil {
|
||||
t.Fatalf("Weapon not found after import: %v", result.Error)
|
||||
}
|
||||
|
||||
assert.Equal(t, "1W6+1", imported.Damage)
|
||||
assert.Equal(t, "Langschwert", imported.SkillRequired)
|
||||
}
|
||||
|
||||
func TestExportImportContainers(t *testing.T) {
|
||||
setupTestEnvironment(t)
|
||||
database.SetupTestDB()
|
||||
|
||||
source := getOrCreateSource("TEST_CT", "Test Container Source")
|
||||
container := models.Container{
|
||||
Equipment: models.Equipment{
|
||||
Name: "Rucksack",
|
||||
GameSystem: "midgard",
|
||||
Beschreibung: "Großer Lederrucksack",
|
||||
SourceID: source.ID,
|
||||
PageNumber: 85,
|
||||
Gewicht: 1.0,
|
||||
Wert: 20.0,
|
||||
PersonalItem: false,
|
||||
},
|
||||
Tragkraft: 30.0,
|
||||
Volumen: 50.0,
|
||||
}
|
||||
database.DB.Create(&container)
|
||||
|
||||
tempDir := t.TempDir()
|
||||
err := ExportContainers(tempDir)
|
||||
if err != nil {
|
||||
t.Fatalf("ExportContainers failed: %v", err)
|
||||
}
|
||||
|
||||
filename := filepath.Join(tempDir, "containers.json")
|
||||
if _, err := os.Stat(filename); os.IsNotExist(err) {
|
||||
t.Fatalf("Export file not created: %s", filename)
|
||||
}
|
||||
|
||||
container.Tragkraft = 25.0
|
||||
database.DB.Save(&container)
|
||||
|
||||
err = ImportContainers(tempDir)
|
||||
if err != nil {
|
||||
t.Fatalf("ImportContainers failed: %v", err)
|
||||
}
|
||||
|
||||
var imported models.Container
|
||||
result := database.DB.Where("name = ? AND game_system = ?", "Rucksack", "midgard").First(&imported)
|
||||
if result.Error != nil {
|
||||
t.Fatalf("Container not found after import: %v", result.Error)
|
||||
}
|
||||
|
||||
assert.Equal(t, 30.0, imported.Tragkraft)
|
||||
assert.Equal(t, 50.0, imported.Volumen)
|
||||
}
|
||||
|
||||
func TestExportImportTransportation(t *testing.T) {
|
||||
setupTestEnvironment(t)
|
||||
database.SetupTestDB()
|
||||
|
||||
source := getOrCreateSource("TEST_TR", "Test Transport Source")
|
||||
transportation := models.Transportation{
|
||||
Container: models.Container{
|
||||
Equipment: models.Equipment{
|
||||
Name: "Pferdewagen",
|
||||
GameSystem: "midgard",
|
||||
Beschreibung: "Zweirädriger Wagen",
|
||||
SourceID: source.ID,
|
||||
PageNumber: 90,
|
||||
Gewicht: 100.0,
|
||||
Wert: 200.0,
|
||||
PersonalItem: false,
|
||||
},
|
||||
Tragkraft: 500.0,
|
||||
Volumen: 1000.0,
|
||||
},
|
||||
}
|
||||
database.DB.Create(&transportation)
|
||||
|
||||
tempDir := t.TempDir()
|
||||
err := ExportTransportation(tempDir)
|
||||
if err != nil {
|
||||
t.Fatalf("ExportTransportation failed: %v", err)
|
||||
}
|
||||
|
||||
filename := filepath.Join(tempDir, "transportation.json")
|
||||
if _, err := os.Stat(filename); os.IsNotExist(err) {
|
||||
t.Fatalf("Export file not created: %s", filename)
|
||||
}
|
||||
|
||||
transportation.Tragkraft = 450.0
|
||||
database.DB.Save(&transportation)
|
||||
|
||||
err = ImportTransportation(tempDir)
|
||||
if err != nil {
|
||||
t.Fatalf("ImportTransportation failed: %v", err)
|
||||
}
|
||||
|
||||
var imported models.Transportation
|
||||
result := database.DB.Where("name = ? AND game_system = ?", "Pferdewagen", "midgard").First(&imported)
|
||||
if result.Error != nil {
|
||||
t.Fatalf("Transportation not found after import: %v", result.Error)
|
||||
}
|
||||
|
||||
assert.Equal(t, 500.0, imported.Tragkraft)
|
||||
assert.Equal(t, 1000.0, imported.Volumen)
|
||||
}
|
||||
|
||||
func TestExportImportBelieves(t *testing.T) {
|
||||
setupTestEnvironment(t)
|
||||
database.SetupTestDB()
|
||||
|
||||
source := getOrCreateSource("TEST_BL", "Test Believe Source")
|
||||
believe := models.Believe{
|
||||
Name: "Kirche des Lichts",
|
||||
GameSystem: "midgard",
|
||||
Beschreibung: "Hauptreligion in Valian",
|
||||
SourceID: source.ID,
|
||||
PageNumber: 95,
|
||||
}
|
||||
database.DB.Create(&believe)
|
||||
|
||||
tempDir := t.TempDir()
|
||||
err := ExportBelieves(tempDir)
|
||||
if err != nil {
|
||||
t.Fatalf("ExportBelieves failed: %v", err)
|
||||
}
|
||||
|
||||
filename := filepath.Join(tempDir, "believes.json")
|
||||
if _, err := os.Stat(filename); os.IsNotExist(err) {
|
||||
t.Fatalf("Export file not created: %s", filename)
|
||||
}
|
||||
|
||||
believe.Beschreibung = "Alte Beschreibung"
|
||||
database.DB.Save(&believe)
|
||||
|
||||
err = ImportBelieves(tempDir)
|
||||
if err != nil {
|
||||
t.Fatalf("ImportBelieves failed: %v", err)
|
||||
}
|
||||
|
||||
var imported models.Believe
|
||||
result := database.DB.Where("name = ? AND game_system = ?", "Kirche des Lichts", "midgard").First(&imported)
|
||||
if result.Error != nil {
|
||||
t.Fatalf("Believe not found after import: %v", result.Error)
|
||||
}
|
||||
|
||||
assert.Equal(t, "Hauptreligion in Valian", imported.Beschreibung)
|
||||
assert.Equal(t, 95, imported.PageNumber)
|
||||
}
|
||||
|
||||
func TestExportImportSkillImprovementCosts(t *testing.T) {
|
||||
setupTestEnvironment(t)
|
||||
database.SetupTestDB()
|
||||
|
||||
// Create dependencies that already exist in test DB
|
||||
// Use existing skill, category, difficulty from test database
|
||||
var skill models.Skill
|
||||
if err := database.DB.Where("name = ?", "Abrichten").First(&skill).Error; err != nil {
|
||||
t.Skip("Test skill not found in database, skipping test")
|
||||
}
|
||||
|
||||
var category models.SkillCategory
|
||||
if err := database.DB.First(&category).Error; err != nil {
|
||||
t.Skip("No skill category found in database, skipping test")
|
||||
}
|
||||
|
||||
var difficulty models.SkillDifficulty
|
||||
if err := database.DB.First(&difficulty).Error; err != nil {
|
||||
t.Skip("No skill difficulty found in database, skipping test")
|
||||
}
|
||||
|
||||
// Find or create SkillCategoryDifficulty
|
||||
var scd models.SkillCategoryDifficulty
|
||||
err := database.DB.Where("skill_id = ? AND skill_category_id = ? AND skill_difficulty_id = ?",
|
||||
skill.ID, category.ID, difficulty.ID).First(&scd).Error
|
||||
|
||||
if err == gorm.ErrRecordNotFound {
|
||||
scd = models.SkillCategoryDifficulty{
|
||||
SkillID: skill.ID,
|
||||
SkillCategoryID: category.ID,
|
||||
SkillDifficultyID: difficulty.ID,
|
||||
LearnCost: 10,
|
||||
SCategory: category.Name,
|
||||
SDifficulty: difficulty.Name,
|
||||
}
|
||||
database.DB.Create(&scd)
|
||||
} else if err != nil {
|
||||
t.Fatalf("Failed to query SkillCategoryDifficulty: %v", err)
|
||||
}
|
||||
|
||||
// Create SkillImprovementCost
|
||||
improvementCost := models.SkillImprovementCost{
|
||||
SkillCategoryDifficultyID: scd.ID,
|
||||
CurrentLevel: 15, // Use unique level to avoid conflicts
|
||||
TERequired: 5,
|
||||
}
|
||||
database.DB.Create(&improvementCost)
|
||||
|
||||
// Export
|
||||
tempDir := t.TempDir()
|
||||
err = ExportSkillImprovementCosts(tempDir)
|
||||
if err != nil {
|
||||
t.Fatalf("ExportSkillImprovementCosts failed: %v", err)
|
||||
}
|
||||
|
||||
filename := filepath.Join(tempDir, "skill_improvement_costs.json")
|
||||
if _, err := os.Stat(filename); os.IsNotExist(err) {
|
||||
t.Fatalf("Export file not created: %s", filename)
|
||||
}
|
||||
|
||||
// Modify the record
|
||||
improvementCost.TERequired = 7
|
||||
database.DB.Save(&improvementCost)
|
||||
|
||||
// Import should restore original value
|
||||
err = ImportSkillImprovementCosts(tempDir)
|
||||
if err != nil {
|
||||
t.Fatalf("ImportSkillImprovementCosts failed: %v", err)
|
||||
}
|
||||
|
||||
var imported models.SkillImprovementCost
|
||||
result := database.DB.Where("skill_category_difficulty_id = ? AND current_level = ?", scd.ID, 15).First(&imported)
|
||||
if result.Error != nil {
|
||||
t.Fatalf("SkillImprovementCost not found after import: %v", result.Error)
|
||||
}
|
||||
|
||||
// Should be restored to original value from export
|
||||
assert.Equal(t, 5, imported.TERequired)
|
||||
assert.Equal(t, 15, imported.CurrentLevel)
|
||||
}
|
||||
Reference in New Issue
Block a user