042a1d4773
* introduced central package registry by package init function * dynamic registration of routes, model, migrations and initializers. * setting a docker compose project name to prevent shutdown of other containers with the same (composer)name * ai documentation * app template * Create tests for ALL API entpoints in ALL packages Based on current data. Ensure that all API endpoints used in frontend are tested. These tests are crucial for the next refactoring tasks. * adopting agent instructions for a more consistent coding style * added desired module layout and debugging information * Fix All Failing tests All failing tests are fixed now that makes the refactoring more easy since all tests must pass * restored routes for maintenance * added common translations * added new tests for API Endpoint * Merge branch 'separate_business_logic' * added lern and skill improvement cost editing * Set Docker image tag when building to prevent rebuild when nothing has changed * add and remove PP for Weaponskill fixed * add and remove PP for same named skills fixed * add new task
195 lines
6.0 KiB
Go
195 lines
6.0 KiB
Go
package character
|
|
|
|
/*
|
|
func TestImproveSkillUpdatesLevel(t *testing.T) {
|
|
// Setup test database
|
|
database.SetupTestDB()
|
|
defer database.ResetTestDB()
|
|
|
|
// Migrate the schema
|
|
err := models.MigrateStructure()
|
|
assert.NoError(t, err)
|
|
|
|
// Try to migrate equipment if it exists
|
|
if equipmentDB := database.DB.Exec("CREATE TABLE IF NOT EXISTS equi_equipments (id INTEGER PRIMARY KEY, character_id INTEGER, name TEXT)"); equipmentDB.Error != nil {
|
|
t.Logf("Warning: Could not create equipment table: %v", equipmentDB.Error)
|
|
}
|
|
|
|
// Create audit log table for tests
|
|
database.DB.Exec(`CREATE TABLE IF NOT EXISTS audit_log_entries (
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
character_id INTEGER,
|
|
field_name TEXT,
|
|
old_value INTEGER,
|
|
new_value INTEGER,
|
|
difference INTEGER,
|
|
reason TEXT,
|
|
user_id INTEGER,
|
|
timestamp DATETIME,
|
|
notes TEXT
|
|
)`)
|
|
|
|
// Create container table to avoid preload errors
|
|
database.DB.Exec("CREATE TABLE IF NOT EXISTS equi_containers (id INTEGER PRIMARY KEY, character_id INTEGER)")
|
|
database.DB.Exec("CREATE TABLE IF NOT EXISTS equi_weapons (id INTEGER PRIMARY KEY, character_id INTEGER)")
|
|
database.DB.Exec("CREATE TABLE IF NOT EXISTS equi_transportmittel (id INTEGER PRIMARY KEY, character_id INTEGER)")
|
|
database.DB.Exec("CREATE TABLE IF NOT EXISTS equi_equipments (id INTEGER PRIMARY KEY, character_id INTEGER)")
|
|
|
|
// Create test character with ID 20
|
|
testChar := models.Char{
|
|
BamortBase: models.BamortBase{
|
|
ID: 20,
|
|
Name: "Test Krieger",
|
|
},
|
|
Typ: "Krieger",
|
|
Rasse: "Mensch",
|
|
Grad: 1,
|
|
Erfahrungsschatz: models.Erfahrungsschatz{
|
|
BamortCharTrait: models.BamortCharTrait{
|
|
CharacterID: 20,
|
|
},
|
|
EP: 326, // Starting EP
|
|
},
|
|
Vermoegen: models.Vermoegen{
|
|
BamortCharTrait: models.BamortCharTrait{
|
|
CharacterID: 20,
|
|
},
|
|
Goldstücke: 390, // Starting Gold
|
|
},
|
|
}
|
|
|
|
// Add Athletik skill at level 9
|
|
athletikSkill := models.SkFertigkeit{
|
|
BamortCharTrait: models.BamortCharTrait{
|
|
BamortBase: models.BamortBase{
|
|
Name: "Athletik",
|
|
},
|
|
CharacterID: 20,
|
|
},
|
|
Fertigkeitswert: 9,
|
|
Improvable: true,
|
|
}
|
|
testChar.Fertigkeiten = append(testChar.Fertigkeiten, athletikSkill)
|
|
|
|
err = testChar.Create()
|
|
assert.NoError(t, err)
|
|
|
|
// Verify character was created correctly
|
|
var verifyChar models.Char
|
|
err = database.DB.Preload("Fertigkeiten").Preload("Erfahrungsschatz").Preload("Vermoegen").First(&verifyChar, 20).Error
|
|
assert.NoError(t, err)
|
|
t.Logf("Character created with ID: %d, EP: %d, Skills: %d", verifyChar.ID, verifyChar.Erfahrungsschatz.EP, len(verifyChar.Fertigkeiten))
|
|
|
|
// Setup Gin in test mode
|
|
gin.SetMode(gin.TestMode)
|
|
|
|
t.Run("ImproveSkill updates skill level from 9 to 10", func(t *testing.T) {
|
|
// Create request body
|
|
requestData := map[string]interface{}{
|
|
"char_id": 20,
|
|
"name": "Athletik",
|
|
"current_level": 9,
|
|
"target_level": 10,
|
|
"type": "skill",
|
|
"action": "improve",
|
|
"reward": "default",
|
|
"use_pp": 1,
|
|
"use_gold": 0,
|
|
"notes": "Fertigkeit Athletik von 9 auf 10 verbessert (1 Level)",
|
|
}
|
|
requestBody, _ := json.Marshal(requestData)
|
|
|
|
// Create HTTP request
|
|
req, _ := http.NewRequest("POST", "/api/characters/improve-skill", bytes.NewBuffer(requestBody))
|
|
req.Header.Set("Content-Type", "application/json")
|
|
|
|
// Create response recorder
|
|
w := httptest.NewRecorder()
|
|
|
|
// Create Gin context
|
|
c, _ := gin.CreateTestContext(w)
|
|
c.Request = req
|
|
|
|
// Call the actual handler function
|
|
ImproveSkillOld(c)
|
|
|
|
// Print the actual response to see what we get
|
|
t.Logf("Response Status: %d", w.Code)
|
|
t.Logf("Response Body: %s", w.Body.String())
|
|
|
|
// Check if we got a successful response
|
|
assert.Equal(t, http.StatusOK, w.Code, "Status code should be 200 OK")
|
|
|
|
// Verify that the skill level was actually updated in the database
|
|
var updatedChar models.Char
|
|
err = database.DB.Preload("Fertigkeiten").First(&updatedChar, 20).Error
|
|
assert.NoError(t, err)
|
|
|
|
// Find the Athletik skill and check its level
|
|
skillFound := false
|
|
for _, skill := range updatedChar.Fertigkeiten {
|
|
if skill.Name == "Athletik" {
|
|
assert.Equal(t, 10, skill.Fertigkeitswert, "Athletik skill should be level 10 after improvement")
|
|
skillFound = true
|
|
t.Logf("Found Athletik skill with level: %d", skill.Fertigkeitswert)
|
|
break
|
|
}
|
|
}
|
|
assert.True(t, skillFound, "Athletik skill should be found in character's skills")
|
|
|
|
t.Logf("Test completed successfully!")
|
|
t.Logf("Athletik skill successfully updated from level 9 to level 10")
|
|
})
|
|
|
|
t.Run("LearnSkill creates new skill at level 1", func(t *testing.T) {
|
|
// Create request body for learning a new skill
|
|
requestData := map[string]interface{}{
|
|
"name": "Schwimmen",
|
|
"current_level": 0,
|
|
"target_level": 1,
|
|
"type": "skill",
|
|
"action": "learn",
|
|
"reward": "default",
|
|
"notes": "Neue Fertigkeit Schwimmen gelernt",
|
|
}
|
|
requestBody, _ := json.Marshal(requestData)
|
|
|
|
// Create HTTP request
|
|
req, _ := http.NewRequest("POST", "/api/characters/20/learn-skill", bytes.NewBuffer(requestBody))
|
|
req.Header.Set("Content-Type", "application/json")
|
|
|
|
// Create response recorder
|
|
w := httptest.NewRecorder()
|
|
|
|
// Create Gin context with character ID parameter
|
|
c, _ := gin.CreateTestContext(w)
|
|
c.Request = req
|
|
c.Params = gin.Params{gin.Param{Key: "id", Value: "20"}}
|
|
|
|
// Call the actual handler function
|
|
LearnSkillOld(c)
|
|
|
|
// Check if we got a successful response
|
|
assert.Equal(t, http.StatusOK, w.Code, "Status code should be 200 OK")
|
|
|
|
// Verify that the new skill was created in the database
|
|
var updatedChar models.Char
|
|
err = updatedChar.FirstID("20")
|
|
assert.NoError(t, err)
|
|
|
|
// Find the Schwimmen skill and check its level
|
|
skillFound := false
|
|
for _, skill := range updatedChar.Fertigkeiten {
|
|
if skill.Name == "Schwimmen" {
|
|
assert.Equal(t, 1, skill.Fertigkeitswert, "Schwimmen skill should be level 1 after learning")
|
|
skillFound = true
|
|
break
|
|
}
|
|
}
|
|
assert.True(t, skillFound, "Schwimmen skill should be found in character's skills")
|
|
|
|
t.Logf("New skill 'Schwimmen' successfully created at level 1")
|
|
})
|
|
}
|
|
*/
|