Files
bamort/backend/pdfrender/render_with_continuation_test.go
T

184 lines
4.4 KiB
Go
Raw Normal View History

package pdfrender
import (
"bamort/models"
"testing"
)
// TestRenderWithContinuations_SkillsOverflow tests that continuation pages are rendered
// when skills exceed template capacity
func TestRenderWithContinuations_SkillsOverflow(t *testing.T) {
// Arrange - Create character with many skills to force continuation
char := &models.Char{
BamortBase: models.BamortBase{
Name: "Test Character With Many Skills",
},
Typ: "Krieger",
Grad: 5,
Alter: 30,
Eigenschaften: []models.Eigenschaft{
{Name: "St", Value: 90},
{Name: "Gs", Value: 80},
{Name: "Gw", Value: 70},
{Name: "Ko", Value: 85},
{Name: "In", Value: 60},
{Name: "Zt", Value: 55},
{Name: "Au", Value: 75},
{Name: "pA", Value: 65},
{Name: "Wk", Value: 50},
},
Lp: models.Lp{Value: 20, Max: 25},
Ap: models.Ap{Value: 15, Max: 20},
B: models.B{Value: 15},
}
// Add 50 skills to force multiple pages
char.Fertigkeiten = make([]models.SkFertigkeit, 50)
for i := 0; i < 50; i++ {
char.Fertigkeiten[i] = models.SkFertigkeit{
BamortCharTrait: models.BamortCharTrait{
BamortBase: models.BamortBase{Name: "Skill " + string(rune('A'+i%26))},
},
Fertigkeitswert: 10 + i%15,
Pp: i % 8,
}
}
// Map to view model
viewModel, err := MapCharacterToViewModel(char)
if err != nil {
t.Fatalf("Failed to map character: %v", err)
}
// Load templates
loader := NewTemplateLoader("../templates/Default_A4_Quer")
if err = loader.LoadTemplates(); err != nil {
t.Fatalf("Failed to load templates: %v", err)
}
renderer := NewPDFRenderer()
// Act - Render page1 with continuations
pdfs, err := RenderPageWithContinuations(
viewModel,
"page_1.html",
1,
"20.12.2025",
loader,
renderer,
)
// Assert
if err != nil {
t.Fatalf("Failed to render with continuations: %v", err)
}
// Get template capacity to calculate expected pages
templateSet := DefaultA4QuerTemplateSet()
var skillsCapacity int
for _, tmpl := range templateSet.Templates {
if tmpl.Metadata.Name == "page_1.html" {
for _, block := range tmpl.Metadata.Blocks {
if block.ListType == "skills" {
skillsCapacity += block.MaxItems
}
}
break
}
}
expectedPages := (50 + skillsCapacity - 1) / skillsCapacity
if len(pdfs) != expectedPages {
t.Errorf("Expected %d PDFs (pages) for 50 skills with capacity %d, got %d",
expectedPages, skillsCapacity, len(pdfs))
}
// Verify each PDF is valid
for i, pdf := range pdfs {
if len(pdf) == 0 {
t.Errorf("PDF %d is empty", i+1)
}
if string(pdf[0:4]) != "%PDF" {
t.Errorf("PDF %d does not start with PDF marker", i+1)
}
}
t.Logf("✓ Successfully generated %d continuation pages for 50 skills (capacity: %d)",
len(pdfs), skillsCapacity)
}
// TestRenderWithContinuations_NoOverflow tests that single page is rendered
// when items fit within capacity
func TestRenderWithContinuations_NoOverflow(t *testing.T) {
// Arrange - Create character with few skills
char := &models.Char{
BamortBase: models.BamortBase{
Name: "Test Character",
},
Typ: "Krieger",
Grad: 5,
Alter: 30,
Eigenschaften: []models.Eigenschaft{
{Name: "St", Value: 90},
{Name: "Gs", Value: 80},
{Name: "Gw", Value: 70},
{Name: "Ko", Value: 85},
{Name: "In", Value: 60},
{Name: "Zt", Value: 55},
{Name: "Au", Value: 75},
{Name: "pA", Value: 65},
{Name: "Wk", Value: 50},
},
Lp: models.Lp{Value: 20, Max: 25},
Ap: models.Ap{Value: 15, Max: 20},
B: models.B{Value: 15},
}
// Add only 3 skills - should fit on one page
char.Fertigkeiten = make([]models.SkFertigkeit, 3)
for i := 0; i < 3; i++ {
char.Fertigkeiten[i] = models.SkFertigkeit{
BamortCharTrait: models.BamortCharTrait{
BamortBase: models.BamortBase{Name: "Skill " + string(rune('A'+i))},
},
Fertigkeitswert: 10,
Pp: 5,
}
}
// Map to view model
viewModel, err := MapCharacterToViewModel(char)
if err != nil {
t.Fatalf("Failed to map character: %v", err)
}
// Load templates
loader := NewTemplateLoader("../templates/Default_A4_Quer")
if err = loader.LoadTemplates(); err != nil {
t.Fatalf("Failed to load templates: %v", err)
}
renderer := NewPDFRenderer()
// Act
pdfs, err := RenderPageWithContinuations(
viewModel,
"page_1.html",
1,
"20.12.2025",
loader,
renderer,
)
// Assert
if err != nil {
t.Fatalf("Failed to render: %v", err)
}
if len(pdfs) != 1 {
t.Errorf("Expected 1 PDF for 3 skills, got %d", len(pdfs))
}
t.Logf("✓ Correctly generated single page for 3 skills")
}