Files
bamort/backend/character/spell_category_test.go
T

113 lines
3.1 KiB
Go

package character
import (
"bamort/database"
"bamort/models"
"bytes"
"encoding/json"
"net/http"
"net/http/httptest"
"strconv"
"testing"
"github.com/gin-gonic/gin"
"github.com/stretchr/testify/assert"
)
func TestSpellCategoryMapping(t *testing.T) {
// Setup test database
database.SetupTestDB()
defer database.ResetTestDB()
// Migrate the schema
err := models.MigrateStructure()
assert.NoError(t, err)
// Create test skill data
err = createTestSkillData()
assert.NoError(t, err)
defer cleanupTestSkillData()
// Create a test character
character := &models.Char{
BamortBase: models.BamortBase{
Name: "Test Character",
},
Rasse: "Human",
Typ: "Hx",
}
err = character.Create()
assert.NoError(t, err)
// Add the "Beherrschen" magic school as a skill
beherrschenSkill := &models.SkFertigkeit{
BamortCharTrait: models.BamortCharTrait{
BamortBase: models.BamortBase{
Name: "Beherrschen",
},
CharacterID: character.ID,
},
Pp: 0,
}
result := database.GetDB().Create(beherrschenSkill)
assert.NoError(t, result.Error)
// Setup Gin router
gin.SetMode(gin.TestMode)
router := gin.New()
api := router.Group("/api")
RegisterRoutes(api)
t.Run("Spell PP goes to magic school", func(t *testing.T) {
// Add PP for spell "Macht über das Selbst" - should go to "Beherrschen"
request := map[string]interface{}{
"skill_name": "Macht über das Selbst",
"amount": 3,
}
jsonData, _ := json.Marshal(request)
req := httptest.NewRequest(http.MethodPost, "/api/characters/"+strconv.Itoa(int(character.ID))+"/practice-points/add", bytes.NewBuffer(jsonData))
req.Header.Set("Content-Type", "application/json")
w := httptest.NewRecorder()
router.ServeHTTP(w, req)
assert.Equal(t, http.StatusOK, w.Code)
// Verify response contains PP for "Beherrschen", not "Macht über das Selbst"
var ppResponse []PracticePointResponse
err := json.Unmarshal(w.Body.Bytes(), &ppResponse)
assert.NoError(t, err)
// Should have exactly one entry for "Beherrschen"
assert.Len(t, ppResponse, 1)
assert.Equal(t, "Beherrschen", ppResponse[0].SkillName)
assert.Equal(t, 3, ppResponse[0].Amount)
})
t.Run("Use PP from magic school for spell", func(t *testing.T) {
// Use PP for spell "Macht über das Selbst" - should use from "Beherrschen"
request := map[string]interface{}{
"skill_name": "Macht über das Selbst",
"amount": 1,
}
jsonData, _ := json.Marshal(request)
req := httptest.NewRequest(http.MethodPost, "/api/characters/"+strconv.Itoa(int(character.ID))+"/practice-points/use", bytes.NewBuffer(jsonData))
req.Header.Set("Content-Type", "application/json")
w := httptest.NewRecorder()
router.ServeHTTP(w, req)
assert.Equal(t, http.StatusOK, w.Code)
// Verify response contains reduced PP for "Beherrschen"
var ppResponse []PracticePointResponse
err := json.Unmarshal(w.Body.Bytes(), &ppResponse)
assert.NoError(t, err)
// Should have exactly one entry for "Beherrschen" with 2 PP remaining
assert.Len(t, ppResponse, 1)
assert.Equal(t, "Beherrschen", ppResponse[0].SkillName)
assert.Equal(t, 2, ppResponse[0].Amount)
})
}