Files
bamort/backend/gsmaster/gsm_model_test.go

404 lines
8.1 KiB
Go

package gsmaster
import (
"bamort/database"
"bamort/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()
}