d360c9a5ba
- Systemauslastungs-Sektion wird immer gerendert (nicht nur bei Erfolg) - Fehlermeldung wenn /api/admin/system/stats nicht erreichbar ist - Feature-Status auf In Review gesetzt Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
101 lines
2.4 KiB
Go
101 lines
2.4 KiB
Go
package mailparser_test
|
|
|
|
import (
|
|
"os"
|
|
"path/filepath"
|
|
"strings"
|
|
"testing"
|
|
|
|
"github.com/archivmail/pkg/mailparser"
|
|
)
|
|
|
|
func readFixture(t *testing.T, name string) []byte {
|
|
t.Helper()
|
|
data, err := os.ReadFile(filepath.Join("testdata", name))
|
|
if err != nil {
|
|
t.Fatalf("readFixture %s: %v", name, err)
|
|
}
|
|
return data
|
|
}
|
|
|
|
func TestParseSimple(t *testing.T) {
|
|
raw := readFixture(t, "simple.eml")
|
|
p, err := mailparser.Parse(raw)
|
|
if err != nil {
|
|
t.Fatalf("Parse: %v", err)
|
|
}
|
|
|
|
if p.From != "alice@example.com" {
|
|
t.Errorf("From = %q, want alice@example.com", p.From)
|
|
}
|
|
if len(p.To) != 2 {
|
|
t.Errorf("To: got %d recipients, want 2", len(p.To))
|
|
}
|
|
if len(p.CC) != 1 {
|
|
t.Errorf("CC: got %d, want 1", len(p.CC))
|
|
}
|
|
if p.Subject != "Test Invoice Q1-2026" {
|
|
t.Errorf("Subject = %q", p.Subject)
|
|
}
|
|
if p.MessageID != "test-001@example.com" {
|
|
t.Errorf("MessageID = %q", p.MessageID)
|
|
}
|
|
if !strings.Contains(p.TextBody, "invoice") {
|
|
t.Errorf("TextBody missing 'invoice': %q", p.TextBody)
|
|
}
|
|
if p.Date.IsZero() {
|
|
t.Error("Date is zero")
|
|
}
|
|
}
|
|
|
|
func TestParseMultipartWithAttachment(t *testing.T) {
|
|
raw := readFixture(t, "multipart.eml")
|
|
p, err := mailparser.Parse(raw)
|
|
if err != nil {
|
|
t.Fatalf("Parse: %v", err)
|
|
}
|
|
|
|
if p.From != "sender@corp.de" {
|
|
t.Errorf("From = %q", p.From)
|
|
}
|
|
if len(p.Attachments) != 1 {
|
|
t.Fatalf("expected 1 attachment, got %d", len(p.Attachments))
|
|
}
|
|
att := p.Attachments[0]
|
|
if att.Filename != "angebot.pdf" {
|
|
t.Errorf("Attachment filename = %q, want angebot.pdf", att.Filename)
|
|
}
|
|
if !strings.Contains(att.ContentType, "pdf") {
|
|
t.Errorf("ContentType = %q, want pdf", att.ContentType)
|
|
}
|
|
if att.Size == 0 {
|
|
t.Error("attachment size is 0")
|
|
}
|
|
}
|
|
|
|
func TestParseRawInline(t *testing.T) {
|
|
raw := []byte("From: test@example.com\r\nTo: dest@example.com\r\nSubject: Hello\r\n\r\nBody text here")
|
|
p, err := mailparser.Parse(raw)
|
|
if err != nil {
|
|
t.Fatalf("Parse: %v", err)
|
|
}
|
|
if p.From != "test@example.com" {
|
|
t.Errorf("From = %q", p.From)
|
|
}
|
|
if len(p.Attachments) != 0 {
|
|
t.Errorf("expected 0 attachments, got %d", len(p.Attachments))
|
|
}
|
|
}
|
|
|
|
func TestParseMissingDate(t *testing.T) {
|
|
raw := []byte("From: test@example.com\r\nSubject: No Date\r\n\r\nNo date header")
|
|
p, err := mailparser.Parse(raw)
|
|
if err != nil {
|
|
t.Fatalf("Parse: %v", err)
|
|
}
|
|
// Should fall back to time.Now(), so should not be zero
|
|
if p.Date.IsZero() {
|
|
t.Error("Date should fall back to now, not zero")
|
|
}
|
|
}
|