Files
bamort/backend/bmrt/gsmaster/gsm_model_test.go
T
Bardioc26 042a1d4773 Learncost frontend (#42)
* 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
2026-05-01 18:15:31 +02:00

404 lines
8.1 KiB
Go

package gsmaster
import (
"bamort/database"
"bamort/bmrt/models"
"testing"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
func defaultGameSystem(t *testing.T) *models.GameSystem {
gs := models.GetGameSystem(0, "midgard")
require.NotNil(t, gs)
require.NotZero(t, gs.ID)
return gs
}
func TestSkill_Create(t *testing.T) {
database.SetupTestDB()
gs := defaultGameSystem(t)
testDefinition := []struct {
name string
skill *models.Skill
wantErr bool
}{
{
name: "valid skill",
skill: &models.Skill{
Name: "Test Skill",
Beschreibung: "Test Description",
Quelle: "Test Source",
Initialwert: 5,
Bonuseigenschaft: "st",
Improvable: true,
InnateSkill: false,
Category: "Test Category",
},
wantErr: false,
},
/*{
name: "nil skill",
skill: nil,
wantErr: true,
},*/
}
for _, tt := range testDefinition {
t.Run(tt.name, func(t *testing.T) {
err := tt.skill.Create()
if tt.wantErr {
assert.Error(t, err)
return
}
assert.NoError(t, err)
assert.Equal(t, gs.ID, tt.skill.GameSystemId)
assert.NotZero(t, tt.skill.GameSystemId)
assert.NotZero(t, tt.skill.ID)
})
}
database.ResetTestDB()
}
func TestWeaponSkill_Create(t *testing.T) {
database.SetupTestDB()
gs := defaultGameSystem(t)
testDefinition := []struct {
name string
weaponSkill *models.WeaponSkill
wantErr bool
}{
{
name: "valid weapon skill",
weaponSkill: &models.WeaponSkill{
Skill: models.Skill{
Name: "Test Weapon Skill",
Beschreibung: "Test Description",
Quelle: "Test Source",
Initialwert: 5,
Bonuseigenschaft: "st",
Improvable: true,
InnateSkill: false,
Category: "Test Category",
},
},
wantErr: false,
},
/*{
name: "nil weapon skill",
weaponSkill: nil,
wantErr: true,
},*/
}
for _, tt := range testDefinition {
t.Run(tt.name, func(t *testing.T) {
err := tt.weaponSkill.Create()
if tt.wantErr {
assert.Error(t, err)
return
}
assert.NoError(t, err)
assert.Equal(t, gs.ID, tt.weaponSkill.GameSystemId)
assert.NotZero(t, tt.weaponSkill.GameSystemId)
assert.NotZero(t, tt.weaponSkill.ID)
})
}
database.ResetTestDB()
}
func TestSkill_TableName(t *testing.T) {
database.SetupTestDB()
skill := &models.Skill{}
expected := "gsm_skills"
assert.Equal(t, expected, skill.TableName())
database.ResetTestDB()
}
func TestSkill_First(t *testing.T) {
database.SetupTestDB()
gs := defaultGameSystem(t)
testDefinition := []struct {
name string
skill *models.Skill
findName string
wantErr bool
}{
{
name: "existing skill",
skill: &models.Skill{
Name: "Test Skill",
GameSystemId: 1,
},
findName: "Test Skill",
wantErr: false,
},
{
name: "non-existing skill",
skill: &models.Skill{},
findName: "NonExistent",
wantErr: true,
},
{
name: "empty name",
skill: &models.Skill{},
findName: "",
wantErr: true,
},
}
for _, tt := range testDefinition {
t.Run(tt.name, func(t *testing.T) {
if !tt.wantErr {
// Create test data first
err := tt.skill.Create()
assert.NoError(t, err)
}
s := &models.Skill{}
err := s.First(tt.findName)
if tt.wantErr {
assert.Error(t, err)
return
}
assert.NoError(t, err)
assert.Equal(t, tt.skill.Name, s.Name)
assert.Equal(t, gs.ID, s.GameSystemId)
assert.NotZero(t, s.GameSystemId)
})
}
database.ResetTestDB()
}
func TestSkill_FirstId(t *testing.T) {
database.SetupTestDB()
gs := defaultGameSystem(t)
testDefinition := []struct {
name string
skill *models.Skill
findId uint
wantErr bool
}{
{
name: "existing skill",
skill: &models.Skill{
Name: "Test Skill",
GameSystemId: 1,
},
findId: 1,
wantErr: false,
},
{
name: "non-existing id",
skill: &models.Skill{},
findId: 9999,
wantErr: true,
},
{
name: "zero id",
skill: &models.Skill{},
findId: 0,
wantErr: true,
},
}
for _, tt := range testDefinition {
t.Run(tt.name, func(t *testing.T) {
if !tt.wantErr {
// Create test data first
err := tt.skill.Create()
assert.NoError(t, err)
tt.findId = tt.skill.ID
}
s := &models.Skill{}
err := s.FirstId(tt.findId)
if tt.wantErr {
assert.Error(t, err)
return
}
assert.NoError(t, err)
assert.Equal(t, tt.skill.Name, s.Name)
assert.Equal(t, gs.ID, s.GameSystemId)
assert.NotZero(t, s.GameSystemId)
assert.Equal(t, tt.findId, s.ID)
})
}
database.ResetTestDB()
}
func TestSkill_Save(t *testing.T) {
database.SetupTestDB()
testDefinition := []struct {
name string
skill *models.Skill
wantErr bool
}{
{
name: "update existing skill",
skill: &models.Skill{
Name: "Test Skill",
Beschreibung: "Original Description",
GameSystemId: 1,
},
wantErr: false,
},
/*{
name: "nil skill",
skill: nil,
wantErr: true,
},*/
}
for _, tt := range testDefinition {
t.Run(tt.name, func(t *testing.T) {
if !tt.wantErr {
// Create initial record
err := tt.skill.Create()
assert.NoError(t, err)
// Modify the skill
tt.skill.Beschreibung = "Updated Description"
}
if tt.skill != nil {
err := tt.skill.Save()
if tt.wantErr {
assert.Error(t, err)
return
}
assert.NoError(t, err)
// Verify the update
saved := &models.Skill{}
err = saved.FirstId(tt.skill.ID)
assert.NoError(t, err)
assert.Equal(t, "Updated Description", saved.Beschreibung)
assert.NotZero(t, saved.GameSystemId)
}
})
}
database.ResetTestDB()
}
func TestSkill_Delete(t *testing.T) {
database.SetupTestDB()
testDefinition := []struct {
name string
skill *models.Skill
wantErr bool
}{
{
name: "delete existing skill",
skill: &models.Skill{
Name: "Test Skill",
GameSystemId: 1,
},
wantErr: false,
},
{
name: "delete non-existing skill",
skill: &models.Skill{
ID: 9999,
},
wantErr: true,
},
/*{
name: "delete nil skill",
skill: nil,
wantErr: true,
},*/
}
for _, tt := range testDefinition {
t.Run(tt.name, func(t *testing.T) {
if !tt.wantErr && tt.skill != nil {
// Create test data first
err := tt.skill.Create()
assert.NoError(t, err)
}
var err error
if tt.skill != nil {
err = tt.skill.Delete()
}
if tt.wantErr {
assert.Error(t, err)
return
}
assert.NoError(t, err)
// Verify deletion
s := &models.Skill{}
err = s.FirstId(tt.skill.ID)
assert.Error(t, err) // Should error since record is deleted
})
}
database.ResetTestDB()
}
func TestSkill_GetSkillCategories(t *testing.T) {
database.SetupTestDB()
// Create test skill categories in the lookup table
// Note: GetSkillCategories() reads from gsm_skill_categories table, not from skills
testCategories := []*models.SkillCategory{
{
Name: "Category1",
GameSystemId: 1,
},
{
Name: "Category2",
GameSystemId: 1,
},
}
// Create test categories in the lookup table
for _, cat := range testCategories {
err := cat.Create()
assert.NoError(t, err)
}
testDefinition := []struct {
name string
expectedMinCount int
expectedMustContain []string
wantErr bool
}{
{
name: "get categories",
expectedMinCount: 2,
expectedMustContain: []string{"Category1", "Category2"},
wantErr: false,
},
}
for _, tt := range testDefinition {
t.Run(tt.name, func(t *testing.T) {
s := &models.Skill{}
categories, err := s.GetSkillCategories()
if tt.wantErr {
assert.Error(t, err)
return
}
assert.NoError(t, err)
assert.GreaterOrEqual(t, len(categories), tt.expectedMinCount, "Should have at least %d categories", tt.expectedMinCount)
// Check that all expected categories are present
for _, expected := range tt.expectedMustContain {
assert.Contains(t, categories, expected, "Categories should contain %q", expected)
}
})
}
database.ResetTestDB()
}