2025-12-19 10:47:05 +01:00
|
|
|
package pdfrender
|
|
|
|
|
|
|
|
|
|
import (
|
2025-12-20 00:19:20 +01:00
|
|
|
"bamort/database"
|
2025-12-19 10:47:05 +01:00
|
|
|
"bamort/models"
|
2025-12-19 22:32:43 +01:00
|
|
|
"os"
|
2025-12-19 10:47:05 +01:00
|
|
|
"testing"
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
// TestPaginationUsesTemplateMetadata verifies tests use actual template MAX values
|
|
|
|
|
func TestPaginationUsesTemplateMetadata(t *testing.T) {
|
2025-12-19 22:32:43 +01:00
|
|
|
// Read expected values directly from template file
|
2025-12-21 22:07:46 +01:00
|
|
|
templateContent, err := os.ReadFile("../templates/Default_A4_Quer/page_2.html")
|
2025-12-19 22:32:43 +01:00
|
|
|
if err != nil {
|
|
|
|
|
t.Fatalf("Failed to read template file: %v", err)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
expectedBlocks := ParseTemplateMetadata(string(templateContent))
|
|
|
|
|
expectedSkillsLearned := GetBlockByName(expectedBlocks, "skills_learned")
|
|
|
|
|
expectedSkillsLanguages := GetBlockByName(expectedBlocks, "skills_languages")
|
|
|
|
|
expectedWeaponsMain := GetBlockByName(expectedBlocks, "weapons_main")
|
|
|
|
|
|
2025-12-19 10:47:05 +01:00
|
|
|
// Load template set from actual files
|
|
|
|
|
templateSet := DefaultA4QuerTemplateSet()
|
|
|
|
|
|
|
|
|
|
// Find page2
|
|
|
|
|
var page2 *TemplateWithMeta
|
|
|
|
|
for i := range templateSet.Templates {
|
2025-12-21 22:07:46 +01:00
|
|
|
if templateSet.Templates[i].Metadata.Name == "page_2.html" {
|
2025-12-19 10:47:05 +01:00
|
|
|
page2 = &templateSet.Templates[i]
|
|
|
|
|
break
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if page2 == nil {
|
2025-12-21 22:07:46 +01:00
|
|
|
t.Fatal("page_2.html not found")
|
2025-12-19 10:47:05 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Verify blocks exist and have correct MAX from template
|
|
|
|
|
skillsLearned := GetBlockByName(page2.Metadata.Blocks, "skills_learned")
|
|
|
|
|
if skillsLearned == nil {
|
|
|
|
|
t.Fatal("skills_learned block not found")
|
|
|
|
|
}
|
2025-12-19 22:32:43 +01:00
|
|
|
if expectedSkillsLearned != nil && skillsLearned.MaxItems != expectedSkillsLearned.MaxItems {
|
|
|
|
|
t.Errorf("skills_learned: expected MAX %d from template, got %d", expectedSkillsLearned.MaxItems, skillsLearned.MaxItems)
|
2025-12-19 10:47:05 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
skillsLanguages := GetBlockByName(page2.Metadata.Blocks, "skills_languages")
|
|
|
|
|
if skillsLanguages == nil {
|
|
|
|
|
t.Fatal("skills_languages block not found")
|
|
|
|
|
}
|
2025-12-19 22:32:43 +01:00
|
|
|
if expectedSkillsLanguages != nil && skillsLanguages.MaxItems != expectedSkillsLanguages.MaxItems {
|
|
|
|
|
t.Errorf("skills_languages: expected MAX %d from template, got %d", expectedSkillsLanguages.MaxItems, skillsLanguages.MaxItems)
|
2025-12-19 10:47:05 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
weaponsMain := GetBlockByName(page2.Metadata.Blocks, "weapons_main")
|
|
|
|
|
if weaponsMain == nil {
|
|
|
|
|
t.Fatal("weapons_main block not found")
|
|
|
|
|
}
|
2025-12-19 22:32:43 +01:00
|
|
|
if expectedWeaponsMain != nil && weaponsMain.MaxItems != expectedWeaponsMain.MaxItems {
|
|
|
|
|
t.Errorf("weapons_main: expected MAX %d from template, got %d", expectedWeaponsMain.MaxItems, weaponsMain.MaxItems)
|
2025-12-19 10:47:05 +01:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func TestPage2PaginationWithCorrectCapacities(t *testing.T) {
|
2025-12-19 22:32:43 +01:00
|
|
|
// Read expected values directly from template file
|
2025-12-21 22:07:46 +01:00
|
|
|
templateContent, err := os.ReadFile("../templates/Default_A4_Quer/page_2.html")
|
2025-12-19 22:32:43 +01:00
|
|
|
if err != nil {
|
|
|
|
|
t.Fatalf("Failed to read template file: %v", err)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
expectedBlocks := ParseTemplateMetadata(string(templateContent))
|
|
|
|
|
expectedSkillsLearned := GetBlockByName(expectedBlocks, "skills_learned")
|
|
|
|
|
expectedSkillsLanguages := GetBlockByName(expectedBlocks, "skills_languages")
|
|
|
|
|
expectedWeaponsMain := GetBlockByName(expectedBlocks, "weapons_main")
|
|
|
|
|
|
2025-12-19 10:47:05 +01:00
|
|
|
// Create test data
|
|
|
|
|
viewModel := &CharacterSheetViewModel{
|
|
|
|
|
Skills: []SkillViewModel{
|
|
|
|
|
{Name: "Learned 1", IsLearned: true, Category: "Combat"},
|
|
|
|
|
{Name: "Learned 2", IsLearned: true, Category: "Combat"},
|
|
|
|
|
{Name: "Sprache 1", Category: "Sprache"},
|
|
|
|
|
{Name: "Sprache 2", Category: "Sprache"},
|
|
|
|
|
},
|
|
|
|
|
Weapons: []WeaponViewModel{
|
|
|
|
|
{Name: "Sword", Value: 10},
|
|
|
|
|
{Name: "Bow", Value: 12},
|
|
|
|
|
},
|
|
|
|
|
}
|
|
|
|
|
|
2025-12-21 22:07:46 +01:00
|
|
|
pageData, err := PreparePaginatedPageData(viewModel, "page_2.html", 2, "2024-01-01")
|
2025-12-19 10:47:05 +01:00
|
|
|
if err != nil {
|
|
|
|
|
t.Fatalf("Failed to prepare page data: %v", err)
|
|
|
|
|
}
|
|
|
|
|
|
2025-12-19 22:32:43 +01:00
|
|
|
// Verify capacities match template values
|
|
|
|
|
if expectedSkillsLearned != nil && len(pageData.SkillsLearned) != expectedSkillsLearned.MaxItems {
|
|
|
|
|
t.Errorf("SkillsLearned should be filled to %d (from template), got %d", expectedSkillsLearned.MaxItems, len(pageData.SkillsLearned))
|
2025-12-19 10:47:05 +01:00
|
|
|
}
|
|
|
|
|
|
2025-12-19 22:32:43 +01:00
|
|
|
if expectedSkillsLanguages != nil && len(pageData.SkillsLanguage) != expectedSkillsLanguages.MaxItems {
|
|
|
|
|
t.Errorf("SkillsLanguage should be filled to %d (from template), got %d", expectedSkillsLanguages.MaxItems, len(pageData.SkillsLanguage))
|
2025-12-19 10:47:05 +01:00
|
|
|
}
|
|
|
|
|
|
2025-12-19 22:32:43 +01:00
|
|
|
if expectedWeaponsMain != nil && len(pageData.Weapons) != expectedWeaponsMain.MaxItems {
|
|
|
|
|
t.Errorf("Weapons should be filled to %d (from template), got %d", expectedWeaponsMain.MaxItems, len(pageData.Weapons))
|
2025-12-19 10:47:05 +01:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func TestPage3MagicItemsCapacity(t *testing.T) {
|
2025-12-19 22:32:43 +01:00
|
|
|
// Read expected values directly from template file
|
2025-12-21 22:07:46 +01:00
|
|
|
templateContent, err := os.ReadFile("../templates/Default_A4_Quer/page_3.html")
|
2025-12-19 22:32:43 +01:00
|
|
|
if err != nil {
|
|
|
|
|
t.Fatalf("Failed to read template file: %v", err)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
expectedBlocks := ParseTemplateMetadata(string(templateContent))
|
|
|
|
|
expectedMagicItems := GetBlockByName(expectedBlocks, "magic_items")
|
|
|
|
|
|
2025-12-19 10:47:05 +01:00
|
|
|
// Create test data with magic items
|
|
|
|
|
viewModel := &CharacterSheetViewModel{
|
|
|
|
|
MagicItems: []MagicItemViewModel{
|
|
|
|
|
{Name: "Wand"},
|
|
|
|
|
{Name: "Ring"},
|
|
|
|
|
},
|
|
|
|
|
Spells: []SpellViewModel{
|
|
|
|
|
{Name: "Fireball"},
|
|
|
|
|
},
|
|
|
|
|
}
|
|
|
|
|
|
2025-12-21 22:07:46 +01:00
|
|
|
pageData, err := PreparePaginatedPageData(viewModel, "page_3.html", 3, "2024-01-01")
|
2025-12-19 10:47:05 +01:00
|
|
|
if err != nil {
|
|
|
|
|
t.Fatalf("Failed to prepare page data: %v", err)
|
|
|
|
|
}
|
|
|
|
|
|
2025-12-19 22:32:43 +01:00
|
|
|
// Verify capacity matches template
|
|
|
|
|
if expectedMagicItems != nil && len(pageData.MagicItems) != expectedMagicItems.MaxItems {
|
|
|
|
|
t.Errorf("MagicItems should be filled to %d (from template), got %d", expectedMagicItems.MaxItems, len(pageData.MagicItems))
|
2025-12-19 10:47:05 +01:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func TestWeaponsWithEW(t *testing.T) {
|
2025-12-20 00:19:20 +01:00
|
|
|
// Setup test database for weapon lookup
|
|
|
|
|
database.SetupTestDB()
|
|
|
|
|
|
|
|
|
|
// Create test weapon in gsm_weapons
|
|
|
|
|
database.DB.Where("name = ?", "Schwert").Delete(&models.Weapon{})
|
|
|
|
|
testWeapon := &models.Weapon{
|
|
|
|
|
Equipment: models.Equipment{
|
|
|
|
|
GameSystem: "midgard",
|
|
|
|
|
Name: "Schwert",
|
|
|
|
|
},
|
|
|
|
|
SkillRequired: "Schwerter",
|
|
|
|
|
Damage: "1W6",
|
|
|
|
|
}
|
|
|
|
|
_ = testWeapon.Create()
|
|
|
|
|
|
|
|
|
|
// Test that equipped weapons use Waffenfertigkeiten with correct EW
|
2025-12-19 10:47:05 +01:00
|
|
|
char := &models.Char{
|
|
|
|
|
BamortBase: models.BamortBase{
|
|
|
|
|
ID: 1,
|
|
|
|
|
Name: "Test Fighter",
|
|
|
|
|
},
|
|
|
|
|
Waffenfertigkeiten: []models.SkWaffenfertigkeit{
|
|
|
|
|
{
|
|
|
|
|
SkFertigkeit: models.SkFertigkeit{
|
|
|
|
|
BamortCharTrait: models.BamortCharTrait{
|
|
|
|
|
BamortBase: models.BamortBase{
|
2025-12-20 00:19:20 +01:00
|
|
|
Name: "Schwerter",
|
2025-12-19 10:47:05 +01:00
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
Fertigkeitswert: 15,
|
|
|
|
|
Category: "Kampf",
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
2025-12-20 00:19:20 +01:00
|
|
|
Waffen: []models.EqWaffe{
|
|
|
|
|
{
|
|
|
|
|
BamortCharTrait: models.BamortCharTrait{
|
|
|
|
|
BamortBase: models.BamortBase{
|
|
|
|
|
Name: "Schwert",
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
Anb: 0,
|
|
|
|
|
Schb: 0,
|
|
|
|
|
},
|
|
|
|
|
},
|
2025-12-19 10:47:05 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
viewModel, err := MapCharacterToViewModel(char)
|
|
|
|
|
if err != nil {
|
|
|
|
|
t.Fatalf("Failed to map character: %v", err)
|
|
|
|
|
}
|
|
|
|
|
|
2025-12-20 00:19:20 +01:00
|
|
|
// Weapons should contain equipped weapons with EW from skill
|
2025-12-19 10:47:05 +01:00
|
|
|
if len(viewModel.Weapons) == 0 {
|
2025-12-20 00:19:20 +01:00
|
|
|
t.Fatal("Expected weapons from equipped Waffen, got none")
|
2025-12-19 10:47:05 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
weapon := viewModel.Weapons[0]
|
|
|
|
|
if weapon.Name != "Schwert" {
|
|
|
|
|
t.Errorf("Expected weapon name 'Schwert', got '%s'", weapon.Name)
|
|
|
|
|
}
|
|
|
|
|
if weapon.Value != 15 {
|
2025-12-20 00:19:20 +01:00
|
|
|
t.Errorf("Expected weapon EW 15 (from skill), got %d", weapon.Value)
|
2025-12-19 10:47:05 +01:00
|
|
|
}
|
|
|
|
|
}
|