package backend import ( "strings" "testing" "github.com/emersion/go-imap/v2" ) func TestSanitizeIMAPFlagsDropsRecentAndWildcard(t *testing.T) { got := sanitizeIMAPFlags([]imap.Flag{imap.FlagSeen, imap.Flag(`\Recent`), imap.FlagWildcard, imap.FlagAnswered}) if len(got) != 2 || got[0] != imap.FlagSeen || got[1] != imap.FlagAnswered { t.Fatalf("sanitizeIMAPFlags returned %#v", got) } } func TestMessageIDFallsBackToBodyHash(t *testing.T) { body := []byte("From: a@example.com\r\nSubject: Test\r\n\r\nBody") id := messageID(body) if !strings.HasPrefix(id, "sha256:") { t.Fatalf("expected sha256 fallback, got %q", id) } if id != messageID(body) { t.Fatal("messageID hash fallback is not stable") } } func TestBodySHA256IsStableAcrossMboxNormalization(t *testing.T) { raw := []byte("From: a@example.com\r\nSubject: Test\r\n\r\nFirst\r\nFrom escaped\r\n\r\n") record := mboxRecord(RawMessage{Body: raw}) parts := splitMboxRecordsWithOffsets(record) if len(parts) != 1 { t.Fatalf("mbox parts=%d, want 1", len(parts)) } if got, want := bodySHA256(parts[0].Message), bodySHA256(raw); got != want { t.Fatalf("mbox hash=%s, raw hash=%s", got, want) } } func TestIdentityUsesMessageIDAndBodyHash(t *testing.T) { first := identityForRawMessage(RawMessage{MessageID: "", Body: []byte("Message-ID: \r\n\r\nfirst")}) second := identityForRawMessage(RawMessage{MessageID: "", Body: []byte("Message-ID: \r\n\r\nsecond")}) if first.MessageID != second.MessageID { t.Fatalf("message IDs differ: %#v %#v", first, second) } if first.BodySHA256 == second.BodySHA256 { t.Fatalf("different bodies have same identity hash: %#v %#v", first, second) } } func TestIdentityWithoutMessageIDKeepsLegacyRawHash(t *testing.T) { body := []byte("From: a@example.com\r\n\r\nbody") identity := identityForRawMessage(RawMessage{MessageID: messageID(body), Body: body}) if identity.MessageID != "" || identity.BodySHA256 == "" || !strings.HasPrefix(identity.LegacyMessageID, "sha256:") { t.Fatalf("unexpected identity: %#v", identity) } }