ultisuite-backend/internal/mail/imap/body_repair_test.go
R3D347HR4Y cd0a80f5e8 huhu
2026-05-25 13:52:27 +02:00

101 lines
3.2 KiB
Go

package imap
import (
"strings"
"testing"
)
func TestDecodeBareBase64IfNeeded_samsungMessage(t *testing.T) {
const encoded = "U0FNU1VORwpSw6lzZXJ2w6kgYXV4IHByb2Zlc3Npb25uZWxzCgrigIoKVm9zIMOpcXVpcGVzIG9u\r\n" +
"dCBiZXNvaW4KZGUgc29sdXRpb25zIG1vYmlsZXMKZXQgcm9idXN0ZXMuCgpTYW1zdW5nIFBybyBy\r\n" +
"w6lwb25kIGF1eCBtw6l0aWVycyBkZSBsYSBjb25zdHJ1"
decoded := decodeBareBase64IfNeeded(encoded)
if decoded == encoded {
t.Fatal("expected base64 decode")
}
if !strings.HasPrefix(decoded, "SAMSUNG") {
t.Fatalf("decoded = %q", decoded)
}
if !strings.Contains(decoded, "professionnels") {
t.Fatalf("decoded = %q, want utf-8 text", decoded)
}
}
func TestDecodeBareQuotedPrintableIfNeeded_frenchMarketing(t *testing.T) {
const qp = "Hello = Eliott,\n\nNous pouvons faire appara=C3=AEtre votre marque en premi=C3=A8re =\n" +
" position dans les Google Suggests"
decoded := decodeBareQuotedPrintableIfNeeded(qp)
if decoded == qp {
t.Fatal("expected quoted-printable decode")
}
if !strings.Contains(decoded, "apparaître") {
t.Fatalf("decoded = %q, want apparaître", decoded)
}
if strings.Contains(decoded, "=C3=") {
t.Fatalf("still contains qp escapes: %q", decoded)
}
}
func TestRepairStoredBodies_quotedPrintableHTML(t *testing.T) {
const qpHTML = `<html><body><div style=3D"color: rgb(65, 65, 65);">appara=C3=AEtre</div></body></html>`
_, html := RepairStoredBodies("", qpHTML)
if !strings.Contains(html, "apparaître") {
t.Fatalf("html = %q", html)
}
if strings.Contains(html, "=3D") {
t.Fatal("html still quoted-printable encoded")
}
}
func TestRepairSnippet_truncatedBase64Preview(t *testing.T) {
snippet := truncate(
"U0FNU1VORwpSw6lzZXJ2w6kgYXV4IHByb2Zlc3Npb25uZWxzCgrigIoKVm9zIMOpcXVpcGVzIG9u"+
"dCBiZXNvaW4KZGUgc29sdXRpb25zIG1vYmlsZXMKZXQgcm9idXN0ZXMuCgpTYW1zdW5nIFBybyBy"+
"w6lwb25kIGF1eCBtw6l0aWVycyBkZSBsYSBjb25zdHJ1Y3Rpb24uCgrigIoKPiBEw6ljb3V2cmly",
200,
)
repaired := RepairSnippet(snippet)
if !strings.HasPrefix(repaired, "SAMSUNG") {
t.Fatalf("snippet = %q, want decoded preview", repaired)
}
}
func TestRepairStoredBodies_base64HTML(t *testing.T) {
const encodedHTML = "PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFs"
_, html := RepairStoredBodies("", encodedHTML)
if !strings.HasPrefix(html, "<!DOCTYPE") && !strings.HasPrefix(html, "<!doctype") {
t.Fatalf("html = %q, want decoded doctype", html)
}
}
func TestRepairStoredBodies_rawMIMEInDB(t *testing.T) {
raw := string(buildMultipartMessage(t, "alternative", []mimePart{
{
contentType: "text/plain; charset=utf-8",
body: []byte("Stored fix"),
transferEnc: "base64",
},
}))
repairedText, repairedHTML := RepairStoredBodies(raw, "")
if repairedText != "Stored fix" {
t.Fatalf("repaired text = %q, want Stored fix", repairedText)
}
if repairedHTML != "" {
t.Fatalf("repaired html = %q, want empty", repairedHTML)
}
}
func TestRepairSubject_brokenSymbolUsesBodyFallback(t *testing.T) {
qpHTML := `<html><body><p>Hello Eliott, Nous pouvons faire apparaître votre marque.</p></body></html>`
subject := RepairSubject("▱", "", qpHTML, nil)
if subjectLooksBroken(subject) {
t.Fatalf("subject = %q, want readable fallback", subject)
}
if !strings.Contains(subject, "Hello") {
t.Fatalf("subject = %q", subject)
}
}