142 lines
4.8 KiB
Go
142 lines
4.8 KiB
Go
package pdfrender
|
|
|
|
import (
|
|
"bamort/config"
|
|
"bamort/database"
|
|
"bamort/models"
|
|
"bytes"
|
|
"os"
|
|
"path/filepath"
|
|
"testing"
|
|
|
|
"github.com/pdfcpu/pdfcpu/pkg/api"
|
|
)
|
|
|
|
// TestAPIvsTestOutput_ShouldBeIdentical verifies that the API handler and test produce identical PDFs
|
|
func TestAPIvsTestOutput_ShouldBeIdentical(t *testing.T) {
|
|
database.SetupTestDB()
|
|
|
|
// Load character with ID 18 (same as visual inspection test)
|
|
char := &models.Char{}
|
|
err := char.FirstID("18")
|
|
if err != nil {
|
|
t.Fatalf("Failed to load character: %v", err)
|
|
}
|
|
|
|
// === PATH 1: Test method (current working) ===
|
|
viewModel1, err := MapCharacterToViewModel(char)
|
|
if err != nil {
|
|
t.Fatalf("Failed to map character (test path): %v", err)
|
|
}
|
|
|
|
loader1 := NewTemplateLoader("../templates/Default_A4_Quer")
|
|
if err := loader1.LoadTemplates(); err != nil {
|
|
t.Fatalf("Failed to load templates (test path): %v", err)
|
|
}
|
|
|
|
renderer1 := NewPDFRenderer()
|
|
testDate := "28.12.2025"
|
|
|
|
var testPDFs [][]byte
|
|
page1PDFs, _ := RenderPageWithContinuations(viewModel1, "page_1.html", 1, testDate, loader1, renderer1)
|
|
testPDFs = append(testPDFs, page1PDFs...)
|
|
page2PDFs, _ := RenderPageWithContinuations(viewModel1, "page_2.html", 2, testDate, loader1, renderer1)
|
|
testPDFs = append(testPDFs, page2PDFs...)
|
|
page3PDFs, _ := RenderPageWithContinuations(viewModel1, "page_3.html", 3, testDate, loader1, renderer1)
|
|
testPDFs = append(testPDFs, page3PDFs...)
|
|
page4PDFs, _ := RenderPageWithContinuations(viewModel1, "page_4.html", 4, testDate, loader1, renderer1)
|
|
testPDFs = append(testPDFs, page4PDFs...)
|
|
|
|
// === PATH 2: API handler method ===
|
|
viewModel2, err := MapCharacterToViewModel(char)
|
|
if err != nil {
|
|
t.Fatalf("Failed to map character (API path): %v", err)
|
|
}
|
|
|
|
// Use same template resolution as API handler
|
|
templateID := "Default_A4_Quer"
|
|
templateDir := filepath.Join(config.Cfg.TemplatesDir, templateID)
|
|
t.Logf("API template dir: %s", templateDir)
|
|
|
|
loader2 := NewTemplateLoader(templateDir)
|
|
if err := loader2.LoadTemplates(); err != nil {
|
|
t.Fatalf("Failed to load templates (API path): %v", err)
|
|
}
|
|
|
|
renderer2 := NewPDFRenderer()
|
|
currentDate := testDate // Use same date as test for exact comparison
|
|
t.Logf("Using date: %s", currentDate)
|
|
|
|
var apiPDFs [][]byte
|
|
page1PDFs, _ = RenderPageWithContinuations(viewModel2, "page_1.html", 1, currentDate, loader2, renderer2)
|
|
apiPDFs = append(apiPDFs, page1PDFs...)
|
|
page2PDFs, _ = RenderPageWithContinuations(viewModel2, "page_2.html", 2, currentDate, loader2, renderer2)
|
|
apiPDFs = append(apiPDFs, page2PDFs...)
|
|
page3PDFs, _ = RenderPageWithContinuations(viewModel2, "page_3.html", 3, currentDate, loader2, renderer2)
|
|
apiPDFs = append(apiPDFs, page3PDFs...)
|
|
page4PDFs, _ = RenderPageWithContinuations(viewModel2, "page_4.html", 4, currentDate, loader2, renderer2)
|
|
apiPDFs = append(apiPDFs, page4PDFs...)
|
|
|
|
// === COMPARISON ===
|
|
if len(testPDFs) != len(apiPDFs) {
|
|
t.Fatalf("Different number of PDFs: test=%d, api=%d", len(testPDFs), len(apiPDFs))
|
|
}
|
|
|
|
t.Logf("Both methods generated %d page PDFs", len(testPDFs))
|
|
|
|
// Merge both for final comparison
|
|
tmpDir1 := "/tmp/bamort_test_compare"
|
|
tmpDir2 := "/tmp/bamort_api_compare"
|
|
os.MkdirAll(tmpDir1, 0755)
|
|
os.MkdirAll(tmpDir2, 0755)
|
|
defer os.RemoveAll(tmpDir1)
|
|
defer os.RemoveAll(tmpDir2)
|
|
|
|
// Save and merge test PDFs
|
|
var testPaths []string
|
|
for i, pdf := range testPDFs {
|
|
path := filepath.Join(tmpDir1, "page_"+string(rune('0'+i))+".pdf")
|
|
os.WriteFile(path, pdf, 0644)
|
|
testPaths = append(testPaths, path)
|
|
}
|
|
testMerged := filepath.Join(tmpDir1, "merged.pdf")
|
|
api.MergeCreateFile(testPaths, testMerged, false, nil)
|
|
|
|
// Save and merge API PDFs
|
|
var apiPaths []string
|
|
for i, pdf := range apiPDFs {
|
|
path := filepath.Join(tmpDir2, "page_"+string(rune('0'+i))+".pdf")
|
|
os.WriteFile(path, pdf, 0644)
|
|
apiPaths = append(apiPaths, path)
|
|
}
|
|
apiMerged := filepath.Join(tmpDir2, "merged.pdf")
|
|
api.MergeCreateFile(apiPaths, apiMerged, false, nil)
|
|
|
|
// Read merged PDFs
|
|
testBytes, _ := os.ReadFile(testMerged)
|
|
apiBytes, _ := os.ReadFile(apiMerged)
|
|
|
|
t.Logf("Test PDF size: %d bytes", len(testBytes))
|
|
t.Logf("API PDF size: %d bytes", len(apiBytes))
|
|
|
|
// Check if identical (excluding date metadata)
|
|
if bytes.Equal(testBytes, apiBytes) {
|
|
t.Log("✓ PDFs are byte-identical")
|
|
} else {
|
|
// Save for manual inspection
|
|
os.WriteFile("/tmp/test_output.pdf", testBytes, 0644)
|
|
os.WriteFile("/tmp/api_output.pdf", apiBytes, 0644)
|
|
t.Logf("PDFs differ - saved to /tmp/test_output.pdf and /tmp/api_output.pdf for comparison")
|
|
t.Log("Note: Difference might be due to date stamps - checking individual pages...")
|
|
|
|
// Compare individual pages
|
|
for i := 0; i < len(testPDFs); i++ {
|
|
if bytes.Equal(testPDFs[i], apiPDFs[i]) {
|
|
t.Logf(" Page %d: identical", i+1)
|
|
} else {
|
|
t.Logf(" Page %d: DIFFERENT (test=%d bytes, api=%d bytes)", i+1, len(testPDFs[i]), len(apiPDFs[i]))
|
|
}
|
|
}
|
|
}
|
|
}
|