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
This commit is contained in:
@@ -0,0 +1,403 @@
|
||||
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()
|
||||
}
|
||||
Reference in New Issue
Block a user