Files
nexarch/dms/internal/pdfconvert/format_test.go
T
patrickandClaude Sonnet 5 3fc02ed697 DOC-06: office-zu-pdf-konverter
Neues Paket internal/pdfconvert nach dem Muster von internal/thumbnail
(DOC-04): Konvertierung von Office-Formaten (docx/xlsx/pptx, odt/ods/odp,
doc/xls/ppt) zu PDF als Vorschau-/Archivderivat der Datei-Revision, ueber
FDN-04 (internal/jobqueue) asynchron mit Wiederholung/Backoff/DLQ verarbeitet.

- format.go: einzige Format-/Endungs-Zuordnungsstelle (MIME -> Endung/Label)
  mit Property-Test, statt paralleler Kopien in Konvertierungsfunktionen
  (siehe "Bekannte Fehler vermeiden" im Ticket).
- convert.go: Generator ruft headless soffice ueber exec.CommandContext mit
  Zeitlimit auf, eigenes Temp-/Profilverzeichnis je Aufruf (Isolation, kein
  geteilter Zustand zwischen gleichzeitigen Konvertierungen).
- pdfconvert.go: State-Machine (pending/processing/ready/failed) in neuer
  Tabelle revision_pdf_derivatives (Migration 0016), ein Zustand je
  Datei-Revision, analog revision_thumbnails.
- VER-07 (digitale Signatur) und QA-03 (Pruefgate) bewusst nicht
  implementiert, keine Schnittstelle dafuer noetig (reines Ablegen eines
  weiteren Revisions-Derivats, keine Bearbeitungs-/Freigabe-Schnittstelle
  betroffen).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-18 13:07:06 +02:00

54 lines
1.5 KiB
Go

package pdfconvert
import (
"strings"
"testing"
"testing/quick"
)
func TestLookupFormat_AllSupportedFormatsFound(t *testing.T) {
for _, f := range supportedFormats {
got, ok := lookupFormat(f.mimeType)
if !ok {
t.Fatalf("mimeType %q nicht gefunden", f.mimeType)
}
if got.extension != f.extension || got.label != f.label {
t.Fatalf("mimeType %q: unerwartete zuordnung %+v", f.mimeType, got)
}
}
}
func TestLookupFormat_UnknownMimeTypeRejected(t *testing.T) {
if _, ok := lookupFormat("application/pdf"); ok {
t.Fatal("application/pdf sollte kein unterstuetztes quellformat sein")
}
if _, ok := lookupFormat("text/plain"); ok {
t.Fatal("text/plain sollte kein unterstuetztes quellformat sein")
}
}
// TestLookupFormat_CaseAndWhitespaceInsensitive ist der Property-Test aus
// dem Ticket ("gut getestete Utility-Funktion mit Property-Tests" statt
// paralleler Format-Zuordnungen): fuer beliebige Gross-/Kleinschreibung und
// umgebenden Whitespace eines bekannten MIME-Typs liefert lookupFormat
// stets dasselbe Ergebnis wie die Normalform.
func TestLookupFormat_CaseAndWhitespaceInsensitive(t *testing.T) {
f := func(upper bool, pad string) bool {
for _, sf := range supportedFormats {
m := sf.mimeType
if upper {
m = strings.ToUpper(m)
}
m = pad + m + pad
got, ok := lookupFormat(m)
if !ok || got.extension != sf.extension {
return false
}
}
return true
}
if err := quick.Check(func(upper bool) bool { return f(upper, " ") && f(upper, "") }, nil); err != nil {
t.Fatal(err)
}
}