Files
patrick 483ce28422
CI / Web-Barrierefreiheitspruefung (axe, Tastatur, Reflow, Textabstaende) (push) Canceled after 0s
CI / Core-Modul (Build/Vet/Test) (push) Canceled after 0s
CI / DMS Security-Test-Gate (AC5, Merge-Gate) (push) Canceled after 0s
CI / DMS-Modul (Lint/Build/Test/Coverage/Artefakt) (push) Canceled after 0s
CI / DMS-Modul Supply-Chain-Scan (govulncheck) (push) Canceled after 0s
CI / Web (dms-browser) (push) Canceled after 0s
CI / Web (pdf-viewer) (push) Canceled after 0s
CI / Web (shl) (push) Canceled after 0s
Supply-Chain-Scan (Go) / govulncheck (push) Canceled after 0s
QA-15 F-13: Testskript vereinfacht
2026-09-22 01:22:39 +02:00

66 lines
2.1 KiB
Go

package thumbnail
import (
"context"
"os"
"path/filepath"
"strings"
"testing"
"time"
)
func fakePdftoppm(t *testing.T, script string) string {
t.Helper()
path := filepath.Join(t.TempDir(), "pdftoppm")
if err := os.WriteFile(path, []byte("#!/bin/sh\n"+script+"\n"), 0o700); err != nil {
t.Fatal(err)
}
return path
}
// QA-15 F-13: ein haengender pdftoppm-Lauf wird nach dem Zeitlimit beendet.
func TestRenderPDFFirstPage_KillsHangingProcessAfterTimeout(t *testing.T) {
g := &Generator{PdftoppmPath: fakePdftoppm(t, "sleep 60"), RenderTimeout: 300 * time.Millisecond}
start := time.Now()
_, err := g.renderPDFFirstPage(context.Background(), []byte("%PDF-1.4"))
if err == nil || !strings.Contains(err.Error(), "zeitlimit") {
t.Fatalf("err = %v, erwartet zeitlimit-fehler", err)
}
if elapsed := time.Since(start); elapsed > 10*time.Second {
t.Fatalf("lauf dauerte %s, das zeitlimit greift nicht", elapsed)
}
}
func TestRenderPDFFirstPage_ParentCancellationStopsProcess(t *testing.T) {
g := &Generator{PdftoppmPath: fakePdftoppm(t, "sleep 60"), RenderTimeout: time.Minute}
ctx, cancel := context.WithTimeout(context.Background(), 300*time.Millisecond)
defer cancel()
start := time.Now()
if _, err := g.renderPDFFirstPage(ctx, []byte("%PDF-1.4")); err == nil {
t.Fatal("kein fehler bei abgebrochenem kontext")
}
if elapsed := time.Since(start); elapsed > 10*time.Second {
t.Fatalf("lauf dauerte %s nach abbruch", elapsed)
}
}
func TestRenderPDFFirstPage_LongToolOutputIsTruncatedInError(t *testing.T) {
g := &Generator{PdftoppmPath: fakePdftoppm(t, "yes x | head -c 100000; exit 1")}
_, err := g.renderPDFFirstPage(context.Background(), []byte("%PDF-1.4"))
if err == nil {
t.Fatal("kein fehler")
}
if len(err.Error()) > 1000 {
t.Fatalf("fehlermeldung nicht gekuerzt: %d bytes", len(err.Error()))
}
}
func TestRenderTimeoutDefault(t *testing.T) {
if got := (&Generator{}).renderTimeout(); got != defaultRenderTimeout {
t.Fatalf("standard = %s", got)
}
if got := (&Generator{RenderTimeout: 5 * time.Second}).renderTimeout(); got != 5*time.Second {
t.Fatalf("konfiguriert = %s", got)
}
}