From dc8316430fede5474db76ff818084af6e5dddf77 Mon Sep 17 00:00:00 2001 From: Frank Date: Sat, 28 Dec 2024 21:07:10 +0100 Subject: [PATCH] added import stammdaten for Ferttigkeit and Zauber --- backend/models/importer.go | 6 +- backend/models/stammdaten.go | 65 ++------- backend/stammdaten/importer.go | 101 +++++++++++++ backend/tests/importJsontoDB_test.go | 185 +++++++++++++++++++----- backend/tests/initTasks.go | 16 ++ backend/tests/saveCharacterToDB_test.go | 14 +- 6 files changed, 283 insertions(+), 104 deletions(-) create mode 100644 backend/stammdaten/importer.go create mode 100644 backend/tests/initTasks.go diff --git a/backend/models/importer.go b/backend/models/importer.go index 0b8981f..452a07f 100644 --- a/backend/models/importer.go +++ b/backend/models/importer.go @@ -14,7 +14,7 @@ type ImAusruestung struct { BeinhaltetIn *string `json:"beinhaltet_in"` Bonus int `json:"bonus,omitempty"` Gewicht float64 `json:"gewicht"` - Magisch ImMagisch `gorm:"foreignKey:ID" json:"magisch"` + Magisch ImMagisch `json:"magisch"` Wert float64 `json:"wert"` } @@ -105,7 +105,7 @@ type ImBehaeltniss struct { Beschreibung string `json:"beschreibung"` BeinhaltetIn any `json:"beinhaltet_in"` Gewicht float64 `json:"gewicht"` - Magisch ImMagisch `gorm:"foreignKey:ID" json:"magisch"` + Magisch ImMagisch `json:"magisch"` Tragkraft float64 `json:"tragkraft"` Volumen float64 `json:"volumen"` Wert float64 `json:"wert"` @@ -129,7 +129,7 @@ type ImTransportation struct { Gewicht int `json:"gewicht"` Tragkraft float64 `json:"tragkraft"` Wert float64 `json:"wert"` - Magisch ImMagisch `gorm:"foreignKey:ID" json:"magisch"` + Magisch ImMagisch `json:"magisch"` //Magisch Magisch `gorm:"polymorphic:Item;polymorphicValue:Transportmittel" json:"magisch"` } diff --git a/backend/models/stammdaten.go b/backend/models/stammdaten.go index e2579e6..63716a3 100644 --- a/backend/models/stammdaten.go +++ b/backend/models/stammdaten.go @@ -1,57 +1,5 @@ package models -import ( - "bamort/database" - "fmt" - "strings" - - "gorm.io/gorm" -) - -func CheckFertigkeit(fertigkeit *ImFertigkeit, autocreate bool) (*ImStammFertigkeit, error) { - stammF := ImStammFertigkeit{} - - if strings.HasPrefix(fertigkeit.ID, "moam") { - err := database.DB.First(&stammF, "system=? AND name = ?", "midgard", fertigkeit.Name).Error - if err == nil { - // Fertigkeit found - return &stammF, nil - } - if !autocreate { - return nil, fmt.Errorf("does not exist in Fertigkeit Stammdaten") - } - stammF.System = "midgard" - stammF.Name = fertigkeit.Name - stammF.Beschreibung = fertigkeit.Beschreibung - if fertigkeit.Fertigkeitswert < 12 { - stammF.Initialkeitswert = 5 - } else { - stammF.Initialkeitswert = 12 - } - stammF.Bonuseigenschaft = "keine" - stammF.Quelle = fertigkeit.Quelle - //fmt.Println(stammF) - err = database.DB.Transaction(func(tx *gorm.DB) error { - // Save the main character record - if err := tx.Create(&stammF).Error; err != nil { - return fmt.Errorf("failed to save Fertigkeit Stammdaten: %w", err) - } - return nil - }) - if err != nil { - // Fertigkeit found - return nil, err - } - - } - err := database.DB.First(&stammF, "system=? AND name = ?", "midgard", fertigkeit.Name).Error - if err != nil { - // Fertigkeit found - return nil, err - } - return &stammF, nil -} - type ImStammFertigkeit struct { ID uint `gorm:"primaryKey" json:"id"` System string `gorm:"index" json:"system"` @@ -61,3 +9,16 @@ type ImStammFertigkeit struct { Bonuseigenschaft string `json:"bonuseigenschaft,omitempty"` Quelle string `json:"quelle"` } + +type ImStammZauber struct { + ID uint `gorm:"primaryKey" json:"id"` + System string `gorm:"index" json:"system"` + Name string `json:"name"` + Beschreibung string `json:"beschreibung"` + Bonus int `json:"bonus"` + Quelle string `json:"quelle"` + Stufe int + AP int + Reichweite int + Wirkungsziel string +} diff --git a/backend/stammdaten/importer.go b/backend/stammdaten/importer.go new file mode 100644 index 0000000..b6fe662 --- /dev/null +++ b/backend/stammdaten/importer.go @@ -0,0 +1,101 @@ +package stammdaten + +import ( + "bamort/database" + "bamort/models" + "fmt" + "strings" + + "gorm.io/gorm" +) + +func CheckFertigkeit(fertigkeit *models.ImFertigkeit, autocreate bool) (*models.ImStammFertigkeit, error) { + stammF := models.ImStammFertigkeit{} + gameSystem := "none" + if strings.HasPrefix(fertigkeit.ID, "moam") { + gameSystem = "midgard" + } + err := database.DB.First(&stammF, "system=? AND name = ?", gameSystem, fertigkeit.Name).Error + if err == nil { + // Fertigkeit found + return &stammF, nil + } + if !autocreate { + return nil, fmt.Errorf("does not exist in Fertigkeit Stammdaten") + } + stammF.System = "midgard" + stammF.Name = fertigkeit.Name + if stammF.Name != "Sprache" { + stammF.Beschreibung = fertigkeit.Beschreibung + } + if fertigkeit.Fertigkeitswert < 12 { + stammF.Initialkeitswert = 5 + } else { + stammF.Initialkeitswert = 12 + } + stammF.Bonuseigenschaft = "keine" + stammF.Quelle = fertigkeit.Quelle + //fmt.Println(stammF) + err = database.DB.Transaction(func(tx *gorm.DB) error { + // Save the main character record + if err := tx.Create(&stammF).Error; err != nil { + return fmt.Errorf("failed to save Fertigkeit Stammdaten: %w", err) + } + return nil + }) + if err != nil { + // Fertigkeit found + return nil, err + } + + err = database.DB.First(&stammF, "system=? AND name = ?", gameSystem, fertigkeit.Name).Error + if err != nil { + // Fertigkeit found + return nil, err + } + return &stammF, nil +} + +func CheckZauber(zauber *models.ImZauber, autocreate bool) (*models.ImStammZauber, error) { + stammF := models.ImStammZauber{} + gameSystem := "none" + if strings.HasPrefix(zauber.ID, "moam") { + gameSystem = "midgard" + } + err := database.DB.First(&stammF, "system=? AND name = ?", gameSystem, zauber.Name).Error + if err == nil { + // zauber found + return &stammF, nil + } + if !autocreate { + return nil, fmt.Errorf("does not exist in zauber Stammdaten") + } + stammF.System = "midgard" + stammF.Name = zauber.Name + stammF.Beschreibung = zauber.Beschreibung + stammF.AP = 1 + stammF.Stufe = 1 + stammF.Wirkungsziel = "Zauberer" + stammF.Reichweite = 15 + + stammF.Quelle = zauber.Quelle + //fmt.Println(stammF) + err = database.DB.Transaction(func(tx *gorm.DB) error { + // Save the main character record + if err := tx.Create(&stammF).Error; err != nil { + return fmt.Errorf("failed to save zauber Stammdaten: %w", err) + } + return nil + }) + if err != nil { + // zauber found + return nil, err + } + + err = database.DB.First(&stammF, "system=? AND name = ?", gameSystem, zauber.Name).Error + if err != nil { + // zauber found + return nil, err + } + return &stammF, nil +} diff --git a/backend/tests/importJsontoDB_test.go b/backend/tests/importJsontoDB_test.go index 7b1504a..b69c58c 100644 --- a/backend/tests/importJsontoDB_test.go +++ b/backend/tests/importJsontoDB_test.go @@ -1,17 +1,49 @@ -package main +package tests import ( "bamort/database" "bamort/models" + "bamort/stammdaten" "encoding/json" "fmt" "os" "testing" "github.com/stretchr/testify/assert" + "gorm.io/gorm" ) -func TestImportVTT(t *testing.T) { +func initTestDB4Import() *gorm.DB { + db := SetupTestDB() + db.AutoMigrate( + /* + &models.ImAp{}, + &models.ImEigenschaft{}, + &models.ImAusruestung{}, + &models.ImFertigkeit{}, + &models.ImZauber{}, + &models.ImWaffenfertigkeit{}, + &models.ImWaffe{}, + &models.ImMerkmale{}, + &models.ImLp{}, + &models.ImGestalt{}, + &models.ImErfahrungsschatz{}, + &models.ImEigenschaften{}, + &models.ImBennies{}, + &models.ImBehaeltniss{}, + &models.ImAp{}, + &models.ImB{}, + &models.ImTransportation{}, + &models.ImMagisch{}, + &models.ImCharacterImport{}, + */ + &models.ImStammFertigkeit{}, //needed for stammdaten.CheckFertigkeit + &models.ImStammZauber{}, //needed for stammdaten.CheckZauber + ) + return db +} + +func TestImportVTTStructure(t *testing.T) { // Setup test database //testDB := SetupTestDB() //DB = testDB // Assign test DB to global DB @@ -42,14 +74,14 @@ func TestImportVTT(t *testing.T) { assert.Equal(t, 3, len(character.Spezialisierung)) assert.Equal(t, "Kriegshammer", character.Spezialisierung[0]) assert.Equal(t, "Armbrust:schwer", character.Spezialisierung[1]) - //fmt.Println(character) } -func TestImportFertigkeitenStammdaten(t *testing.T) { +func TestImportFertigkeitenStammdatenSingle(t *testing.T) { // Setup test database - testDB := SetupTestDB() + testDB := initTestDB4Import() database.DB = testDB // Assign test DB to global DB + // loading file to Modell fileName := fmt.Sprintf("../testdata/%s", "VTT_Import1.json") assert.Equal(t, "../testdata/VTT_Import1.json", fileName) @@ -59,46 +91,121 @@ func TestImportFertigkeitenStammdaten(t *testing.T) { err = json.Unmarshal(fileContent, &character) assert.NoError(t, err, "Expected no error when Unmarshal filecontent") + //checke Fertigkeit auf vorhandensein in den Stammdaten fertigkeit := character.Fertigkeiten[1] - //for _, fertigkeit := range character.Fertigkeiten { - //fmt.Printf("Name: %s, Beschreibung: %s, Wert: %d\n", - // fertigkeit.Name, fertigkeit.Beschreibung, fertigkeit.Fertigkeitswert) - //fmt.Println(fertigkeit) - /* stammF := StammFertigkeit{} - if strings.HasPrefix(fertigkeit.ImportID, "moam") { - err = DB.First(&stammF, "system=? AND name = ?", "midgard", fertigkeit.Name).Error - assert.Error(t, err, "Expected not to find the Fertigkeit Stammdaten in the database") - stammF.System = "midgard" - stammF.Name = fertigkeit.Name - stammF.Beschreibung = fertigkeit.Beschreibung - if fertigkeit.Fertigkeitswert < 12 { - stammF.Initialkeitswert = 5 - } else { - stammF.Initialkeitswert = 12 - } - stammF.Bonuseigenschaft = "keine" - stammF.Quelle = fertigkeit.Quelle - //fmt.Println(stammF) - err = DB.Transaction(func(tx *gorm.DB) error { - // Save the main character record - if err := tx.Create(&stammF).Error; err != nil { - return fmt.Errorf("failed to save Fertigkeit Stammdaten: %w", err) - } - return nil - }) - assert.NoError(t, err, "Expected no error saving Fertigkeit Stammdaten in the database") - } - err = DB.First(&stammF, "system=? AND name = ?", "midgard", fertigkeit.Name).Error - fmt.Println(stammF) */ - stammF, err := models.CheckFertigkeit(&fertigkeit, false) + stammF, err := stammdaten.CheckFertigkeit(&fertigkeit, false) assert.Error(t, err, "expexted Error does not exist in Fertigkeit Stammdaten") if stammF == nil && err != nil { - stammF, err = models.CheckFertigkeit(&fertigkeit, true) + stammF, err = stammdaten.CheckFertigkeit(&fertigkeit, true) } assert.NoError(t, err, "Expected to finds the Fertigkeit Stammdaten in the database") assert.Equal(t, fertigkeit.Name, stammF.Name) assert.Equal(t, fertigkeit.Beschreibung, stammF.Beschreibung) + assert.Equal(t, fertigkeit.Quelle, stammF.Quelle) + assert.Equal(t, 5, stammF.Initialkeitswert) + assert.Equal(t, "keine", stammF.Bonuseigenschaft) + assert.Equal(t, "midgard", stammF.System) + assert.Equal(t, 1, int(stammF.ID)) - //} - + // und noch mal + //checke Fertigkeit auf vorhandensein in den Stammdaten + //fertigkeit := character.Fertigkeiten[1] + stammF, err = stammdaten.CheckFertigkeit(&fertigkeit, false) + assert.NoError(t, err, "expexted no Error exist in Fertigkeit Stammdaten") + if stammF == nil && err != nil { + stammF, err = stammdaten.CheckFertigkeit(&fertigkeit, true) + } + assert.NoError(t, err, "Expected to finds the Fertigkeit Stammdaten in the database") + assert.Equal(t, fertigkeit.Name, stammF.Name) + assert.Equal(t, fertigkeit.Beschreibung, stammF.Beschreibung) + assert.Equal(t, fertigkeit.Quelle, stammF.Quelle) + assert.Equal(t, 5, stammF.Initialkeitswert) + assert.Equal(t, "keine", stammF.Bonuseigenschaft) + assert.Equal(t, "midgard", stammF.System) + assert.Equal(t, 1, int(stammF.ID)) +} + +func TestImportFertigkeitenStammdatenMulti(t *testing.T) { + // Setup test database + testDB := initTestDB4Import() + database.DB = testDB // Assign test DB to global DB + + // loading file to Modell + fileName := fmt.Sprintf("../testdata/%s", "VTT_Import1.json") + assert.Equal(t, "../testdata/VTT_Import1.json", fileName) + fileContent, err := os.ReadFile(fileName) + assert.NoError(t, err, "Expected no error when reading file "+fileName) + character := models.ImCharacterImport{} + err = json.Unmarshal(fileContent, &character) + assert.NoError(t, err, "Expected no error when Unmarshal filecontent") + + //for index, fertigkeit := range character.Fertigkeiten { + for _, fertigkeit := range character.Fertigkeiten { + fmt.Println(fertigkeit.Name) + stammF, err := stammdaten.CheckFertigkeit(&fertigkeit, true) + assert.NoError(t, err, "Expected to finds the Fertigkeit Stammdaten in the database") + assert.Equal(t, fertigkeit.Name, stammF.Name, "Name should be equal") + if fertigkeit.Name != "Sprache" { + assert.Equal(t, fertigkeit.Beschreibung, stammF.Beschreibung, "Beschreibung should be equal") + } else { + assert.Equal(t, "", stammF.Beschreibung, "Beschreibung should be equal") + } + assert.Equal(t, fertigkeit.Quelle, stammF.Quelle, "Quelle should be equal") + //assert.Equal(t, 5, stammF.Initialkeitswert, "Initialkeitswert should be equal") + assert.Equal(t, "keine", stammF.Bonuseigenschaft, "Bonuseigenschaft should be equal") + assert.Equal(t, "midgard", stammF.System, "System should be equal") + //assert.NotEmpty(t, index+1, int(stammF.ID), "ID should be equal") + } +} + +func TestImportZauberStammdatenSingle(t *testing.T) { + // Setup test database + testDB := initTestDB4Import() + database.DB = testDB // Assign test DB to global DB + + // loading file to Modell + fileName := fmt.Sprintf("../testdata/%s", "VTT_Import1.json") + assert.Equal(t, "../testdata/VTT_Import1.json", fileName) + fileContent, err := os.ReadFile(fileName) + assert.NoError(t, err, "Expected no error when reading file "+fileName) + character := models.ImCharacterImport{} + err = json.Unmarshal(fileContent, &character) + assert.NoError(t, err, "Expected no error when Unmarshal filecontent") + + //checke zauber auf vorhandensein in den Stammdaten + zauber := character.Zauber[0] + stammF, err := stammdaten.CheckZauber(&zauber, false) + assert.Error(t, err, "expexted Error does not exist in zauber Stammdaten") + if stammF == nil && err != nil { + stammF, err = stammdaten.CheckZauber(&zauber, true) + } + assert.NoError(t, err, "Expected to finds the zauber Stammdaten in the database") + assert.Equal(t, zauber.Name, stammF.Name) + assert.Equal(t, zauber.Beschreibung, stammF.Beschreibung) + assert.Equal(t, zauber.Quelle, stammF.Quelle) + assert.Equal(t, 1, stammF.AP) + assert.Equal(t, 1, stammF.Stufe) + assert.Equal(t, "Zauberer", stammF.Wirkungsziel) + assert.Equal(t, 15, stammF.Reichweite) + assert.Equal(t, "midgard", stammF.System) + assert.Equal(t, 1, int(stammF.ID)) + + // und noch mal + //checke zauber auf vorhandensein in den Stammdaten + //zauber := character.zauberen[1] + stammF, err = stammdaten.CheckZauber(&zauber, false) + assert.NoError(t, err, "expexted no Error exist in zauber Stammdaten") + if stammF == nil && err != nil { + stammF, err = stammdaten.CheckZauber(&zauber, true) + } + assert.NoError(t, err, "Expected to finds the zauber Stammdaten in the database") + assert.Equal(t, zauber.Name, stammF.Name) + assert.Equal(t, zauber.Beschreibung, stammF.Beschreibung) + assert.Equal(t, zauber.Quelle, stammF.Quelle) + assert.Equal(t, 1, stammF.AP) + assert.Equal(t, 1, stammF.Stufe) + assert.Equal(t, "Zauberer", stammF.Wirkungsziel) + assert.Equal(t, 15, stammF.Reichweite) + assert.Equal(t, "midgard", stammF.System) + assert.Equal(t, 1, int(stammF.ID)) } diff --git a/backend/tests/initTasks.go b/backend/tests/initTasks.go new file mode 100644 index 0000000..d8977d6 --- /dev/null +++ b/backend/tests/initTasks.go @@ -0,0 +1,16 @@ +package tests + +import ( + "gorm.io/driver/sqlite" + "gorm.io/gorm" +) + +// SetupTestDB creates an in-memory SQLite database for testing +func SetupTestDB() *gorm.DB { + db, err := gorm.Open(sqlite.Open(":memory:"), &gorm.Config{}) + if err != nil { + panic("failed to connect to the test database") + } + + return db +} diff --git a/backend/tests/saveCharacterToDB_test.go b/backend/tests/saveCharacterToDB_test.go index dc6bf48..5163904 100644 --- a/backend/tests/saveCharacterToDB_test.go +++ b/backend/tests/saveCharacterToDB_test.go @@ -1,4 +1,4 @@ -package main +package tests import ( "bamort/character" @@ -7,17 +7,11 @@ import ( "testing" "github.com/stretchr/testify/assert" - "gorm.io/driver/sqlite" "gorm.io/gorm" ) -// SetupTestDB creates an in-memory SQLite database for testing -func SetupTestDB() *gorm.DB { - db, err := gorm.Open(sqlite.Open(":memory:"), &gorm.Config{}) - if err != nil { - panic("failed to connect to the test database") - } - +func initTestDB4Char() *gorm.DB { + db := SetupTestDB() // Auto-migrate the schemas for all related models db.AutoMigrate(&models.Char{}, &models.Fertigkeit{}, &models.Zauber{}, &models.Lp{}, @@ -42,7 +36,7 @@ func SetupTestDB() *gorm.DB { func TestSaveCharacterToDB(t *testing.T) { // Setup test database - testDB := SetupTestDB() + testDB := initTestDB4Char() database.DB = testDB // Assign test DB to global DB // Define a sample character for testing