Update maintenance Component for Skills
This commit is contained in:
@@ -0,0 +1,321 @@
|
||||
package gsmaster
|
||||
|
||||
import (
|
||||
"bamort/database"
|
||||
"bamort/models"
|
||||
"os"
|
||||
"testing"
|
||||
)
|
||||
|
||||
func setupTestEnvironment(t *testing.T) {
|
||||
original := os.Getenv("ENVIRONMENT")
|
||||
os.Setenv("ENVIRONMENT", "test")
|
||||
t.Cleanup(func() {
|
||||
if original != "" {
|
||||
os.Setenv("ENVIRONMENT", original)
|
||||
} else {
|
||||
os.Unsetenv("ENVIRONMENT")
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
// Helper function to get or create a source
|
||||
func getOrCreateSource(code, name string) models.Source {
|
||||
var source models.Source
|
||||
if err := database.DB.Where("code = ?", code).First(&source).Error; err != nil {
|
||||
source = models.Source{
|
||||
Code: code,
|
||||
Name: name,
|
||||
GameSystem: "midgard",
|
||||
IsActive: true,
|
||||
}
|
||||
database.DB.Create(&source)
|
||||
}
|
||||
return source
|
||||
}
|
||||
|
||||
// Helper function to get or create a category
|
||||
func getOrCreateCategory(name string, sourceID uint) models.SkillCategory {
|
||||
var category models.SkillCategory
|
||||
if err := database.DB.Where("name = ? AND game_system = ?", name, "midgard").First(&category).Error; err != nil {
|
||||
category = models.SkillCategory{
|
||||
Name: name,
|
||||
GameSystem: "midgard",
|
||||
SourceID: sourceID,
|
||||
}
|
||||
database.DB.Create(&category)
|
||||
}
|
||||
return category
|
||||
}
|
||||
|
||||
// Helper function to get or create a difficulty
|
||||
func getOrCreateDifficulty(name string) models.SkillDifficulty {
|
||||
var difficulty models.SkillDifficulty
|
||||
if err := database.DB.Where("name = ? AND game_system = ?", name, "midgard").First(&difficulty).Error; err != nil {
|
||||
difficulty = models.SkillDifficulty{
|
||||
Name: name,
|
||||
GameSystem: "midgard",
|
||||
}
|
||||
database.DB.Create(&difficulty)
|
||||
}
|
||||
return difficulty
|
||||
}
|
||||
|
||||
func TestGetSkillWithCategories(t *testing.T) {
|
||||
setupTestEnvironment(t)
|
||||
database.SetupTestDB()
|
||||
|
||||
// Create test data
|
||||
source := getOrCreateSource("TSTSKL", "TestSkill")
|
||||
|
||||
skill := models.Skill{
|
||||
Name: "TestSchwimmen",
|
||||
GameSystem: "midgard",
|
||||
Initialwert: 12,
|
||||
Improvable: true,
|
||||
Bonuseigenschaft: "Gw",
|
||||
SourceID: source.ID,
|
||||
}
|
||||
database.DB.Create(&skill)
|
||||
|
||||
category := getOrCreateCategory("Körper", source.ID)
|
||||
difficulty := getOrCreateDifficulty("leicht")
|
||||
|
||||
scd := models.SkillCategoryDifficulty{
|
||||
SkillID: skill.ID,
|
||||
SkillCategoryID: category.ID,
|
||||
SkillDifficultyID: difficulty.ID,
|
||||
LearnCost: 5,
|
||||
SCategory: category.Name,
|
||||
SDifficulty: difficulty.Name,
|
||||
}
|
||||
database.DB.Create(&scd)
|
||||
|
||||
// Test GetSkillWithCategories
|
||||
result, err := GetSkillWithCategories(skill.ID)
|
||||
if err != nil {
|
||||
t.Fatalf("GetSkillWithCategories failed: %v", err)
|
||||
}
|
||||
|
||||
if result.Name != "TestSchwimmen" {
|
||||
t.Errorf("Expected skill name 'TestSchwimmen', got '%s'", result.Name)
|
||||
}
|
||||
|
||||
if len(result.Categories) != 1 {
|
||||
t.Fatalf("Expected 1 category, got %d", len(result.Categories))
|
||||
}
|
||||
|
||||
if result.Categories[0].CategoryName != "Körper" {
|
||||
t.Errorf("Expected category 'Körper', got '%s'", result.Categories[0].CategoryName)
|
||||
}
|
||||
|
||||
if result.Categories[0].DifficultyName != "leicht" {
|
||||
t.Errorf("Expected difficulty 'leicht', got '%s'", result.Categories[0].DifficultyName)
|
||||
}
|
||||
|
||||
if len(result.Difficulties) != 1 || result.Difficulties[0] != "leicht" {
|
||||
t.Errorf("Expected difficulties ['leicht'], got %v", result.Difficulties)
|
||||
}
|
||||
}
|
||||
|
||||
func TestGetSkillWithCategories_MultipleCategories(t *testing.T) {
|
||||
setupTestEnvironment(t)
|
||||
database.SetupTestDB()
|
||||
|
||||
// Create test data
|
||||
source := getOrCreateSource("TSTMC", "TestMultiCat")
|
||||
|
||||
skill := models.Skill{
|
||||
Name: "TestReiten",
|
||||
GameSystem: "midgard",
|
||||
Initialwert: 5,
|
||||
Improvable: true,
|
||||
Bonuseigenschaft: "Gw",
|
||||
SourceID: source.ID,
|
||||
}
|
||||
database.DB.Create(&skill)
|
||||
|
||||
// Create multiple categories
|
||||
category1 := getOrCreateCategory("Bewegung", source.ID)
|
||||
category2 := getOrCreateCategory("Reiten", source.ID)
|
||||
difficultyNormal := getOrCreateDifficulty("normal")
|
||||
difficultySchwer := getOrCreateDifficulty("schwer")
|
||||
|
||||
// Create relationships
|
||||
scd1 := models.SkillCategoryDifficulty{
|
||||
SkillID: skill.ID,
|
||||
SkillCategoryID: category1.ID,
|
||||
SkillDifficultyID: difficultyNormal.ID,
|
||||
LearnCost: 10,
|
||||
SCategory: category1.Name,
|
||||
SDifficulty: difficultyNormal.Name,
|
||||
}
|
||||
database.DB.Create(&scd1)
|
||||
|
||||
scd2 := models.SkillCategoryDifficulty{
|
||||
SkillID: skill.ID,
|
||||
SkillCategoryID: category2.ID,
|
||||
SkillDifficultyID: difficultySchwer.ID,
|
||||
LearnCost: 20,
|
||||
SCategory: category2.Name,
|
||||
SDifficulty: difficultySchwer.Name,
|
||||
}
|
||||
database.DB.Create(&scd2)
|
||||
|
||||
// Test
|
||||
result, err := GetSkillWithCategories(skill.ID)
|
||||
if err != nil {
|
||||
t.Fatalf("GetSkillWithCategories failed: %v", err)
|
||||
}
|
||||
|
||||
if len(result.Categories) != 2 {
|
||||
t.Fatalf("Expected 2 categories, got %d", len(result.Categories))
|
||||
}
|
||||
|
||||
// Check that both categories exist (order may vary)
|
||||
foundMovement := false
|
||||
foundRiding := false
|
||||
for _, cat := range result.Categories {
|
||||
if cat.CategoryName == "Bewegung" && cat.DifficultyName == "normal" {
|
||||
foundMovement = true
|
||||
}
|
||||
if cat.CategoryName == "Reiten" && cat.DifficultyName == "schwer" {
|
||||
foundRiding = true
|
||||
}
|
||||
}
|
||||
|
||||
if !foundMovement {
|
||||
t.Error("Expected to find 'Bewegung/normal' category")
|
||||
}
|
||||
if !foundRiding {
|
||||
t.Error("Expected to find 'Reiten/schwer' category")
|
||||
}
|
||||
}
|
||||
|
||||
func TestUpdateSkillWithCategories(t *testing.T) {
|
||||
setupTestEnvironment(t)
|
||||
database.SetupTestDB()
|
||||
|
||||
// Create test data
|
||||
source := getOrCreateSource("TSTUPD", "TestUpdate")
|
||||
|
||||
skill := models.Skill{
|
||||
Name: "TestKlettern",
|
||||
GameSystem: "midgard",
|
||||
Initialwert: 10,
|
||||
Improvable: true,
|
||||
Bonuseigenschaft: "Gw",
|
||||
SourceID: source.ID,
|
||||
}
|
||||
database.DB.Create(&skill)
|
||||
|
||||
category1 := getOrCreateCategory("Körper", source.ID)
|
||||
category2 := getOrCreateCategory("Alltag", source.ID)
|
||||
difficultyNormal := getOrCreateDifficulty("normal")
|
||||
difficultyLeicht := getOrCreateDifficulty("leicht")
|
||||
|
||||
// Create initial relationship
|
||||
scd := models.SkillCategoryDifficulty{
|
||||
SkillID: skill.ID,
|
||||
SkillCategoryID: category1.ID,
|
||||
SkillDifficultyID: difficultyNormal.ID,
|
||||
LearnCost: 10,
|
||||
SCategory: category1.Name,
|
||||
SDifficulty: difficultyNormal.Name,
|
||||
}
|
||||
database.DB.Create(&scd)
|
||||
|
||||
// Update with new categories
|
||||
updateReq := SkillUpdateRequest{
|
||||
Skill: models.Skill{
|
||||
ID: skill.ID,
|
||||
Name: "TestKlettern",
|
||||
GameSystem: "midgard",
|
||||
Initialwert: 12, // Changed
|
||||
Improvable: true,
|
||||
Bonuseigenschaft: "St", // Changed
|
||||
SourceID: source.ID,
|
||||
},
|
||||
CategoryDifficulties: []CategoryDifficultyPair{
|
||||
{
|
||||
CategoryID: category1.ID,
|
||||
DifficultyID: difficultyLeicht.ID, // Changed difficulty
|
||||
LearnCost: 5,
|
||||
},
|
||||
{
|
||||
CategoryID: category2.ID, // Added category
|
||||
DifficultyID: difficultyNormal.ID,
|
||||
LearnCost: 10,
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
err := UpdateSkillWithCategories(skill.ID, updateReq)
|
||||
if err != nil {
|
||||
t.Fatalf("UpdateSkillWithCategories failed: %v", err)
|
||||
}
|
||||
|
||||
// Verify update
|
||||
result, err := GetSkillWithCategories(skill.ID)
|
||||
if err != nil {
|
||||
t.Fatalf("GetSkillWithCategories failed: %v", err)
|
||||
}
|
||||
|
||||
if result.Initialwert != 12 {
|
||||
t.Errorf("Expected initialwert 12, got %d", result.Initialwert)
|
||||
}
|
||||
|
||||
if result.Bonuseigenschaft != "St" {
|
||||
t.Errorf("Expected bonuseigenschaft 'St', got '%s'", result.Bonuseigenschaft)
|
||||
}
|
||||
|
||||
if len(result.Categories) != 2 {
|
||||
t.Fatalf("Expected 2 categories after update, got %d", len(result.Categories))
|
||||
}
|
||||
|
||||
// Verify old category has new difficulty and new category exists
|
||||
foundKoerperLeicht := false
|
||||
foundAlltagNormal := false
|
||||
for _, cat := range result.Categories {
|
||||
if cat.CategoryName == "Körper" && cat.DifficultyName == "leicht" {
|
||||
foundKoerperLeicht = true
|
||||
}
|
||||
if cat.CategoryName == "Alltag" && cat.DifficultyName == "normal" {
|
||||
foundAlltagNormal = true
|
||||
}
|
||||
}
|
||||
|
||||
if !foundKoerperLeicht {
|
||||
t.Error("Expected to find 'Körper/leicht' category after update")
|
||||
}
|
||||
if !foundAlltagNormal {
|
||||
t.Error("Expected to find 'Alltag/normal' category after update")
|
||||
}
|
||||
}
|
||||
|
||||
func TestGetDefaultLearnCost(t *testing.T) {
|
||||
tests := []struct {
|
||||
difficulty string
|
||||
expected int
|
||||
}{
|
||||
{"leicht", 5},
|
||||
{"easy", 5},
|
||||
{"normal", 10},
|
||||
{"standard", 10},
|
||||
{"schwer", 20},
|
||||
{"hard", 20},
|
||||
{"sehr schwer", 30},
|
||||
{"very hard", 30},
|
||||
{"unknown", 10},
|
||||
}
|
||||
|
||||
for _, tt := range tests {
|
||||
t.Run(tt.difficulty, func(t *testing.T) {
|
||||
result := getDefaultLearnCost(tt.difficulty)
|
||||
if result != tt.expected {
|
||||
t.Errorf("getDefaultLearnCost(%s) = %d, expected %d",
|
||||
tt.difficulty, result, tt.expected)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user