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>
54 lines
1.5 KiB
Go
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)
|
|
}
|
|
}
|