Files
claw-email/internal/mail/resolve_thread_test.go
T
2026-04-28 05:01:17 +07:00

86 lines
2.3 KiB
Go

package mail
import (
"errors"
"testing"
"thuanle.me/claw-email-bridge/internal/database"
)
func TestResolveThreadID_NoHeaders_ReturnsMessageID(t *testing.T) {
got := resolveThreadID("msg-1", "", "", nilLookup)
if got != "msg-1" {
t.Fatalf("expected msg-1, got %s", got)
}
}
func TestResolveThreadID_InReplyToMatches_ReturnsParentThreadID(t *testing.T) {
lookup := func(messageID string) (*database.Task, error) {
if messageID == "<parent>" {
return &database.Task{ThreadID: "thread-abc"}, nil
}
return nil, nil
}
got := resolveThreadID("msg-2", "<parent>", "", lookup)
if got != "thread-abc" {
t.Fatalf("expected thread-abc, got %s", got)
}
}
func TestResolveThreadID_ReferencesOnly_LastIDMatches(t *testing.T) {
lookup := func(messageID string) (*database.Task, error) {
if messageID == "<C>" {
return &database.Task{ThreadID: "thread-c"}, nil
}
return nil, nil
}
got := resolveThreadID("msg-3", "", "<A> <B> <C>", lookup)
if got != "thread-c" {
t.Fatalf("expected thread-c, got %s", got)
}
}
func TestResolveThreadID_ReferencesOnly_MiddleIDMatches(t *testing.T) {
lookup := func(messageID string) (*database.Task, error) {
if messageID == "<B>" {
return &database.Task{ThreadID: "thread-b"}, nil
}
return nil, nil
}
got := resolveThreadID("msg-4", "", "<A> <B> <C>", lookup)
if got != "thread-b" {
t.Fatalf("expected thread-b, got %s", got)
}
}
func TestResolveThreadID_ReferencesOnly_NoMatch_ReturnsMessageID(t *testing.T) {
got := resolveThreadID("msg-5", "", "<X> <Y>", nilLookup)
if got != "msg-5" {
t.Fatalf("expected msg-5, got %s", got)
}
}
func TestResolveThreadID_InReplyToMiss_ReferencesMatches(t *testing.T) {
lookup := func(messageID string) (*database.Task, error) {
if messageID == "<ref>" {
return &database.Task{ThreadID: "thread-ref"}, nil
}
return nil, nil
}
got := resolveThreadID("msg-6", "<unknown>", "<ref>", lookup)
if got != "thread-ref" {
t.Fatalf("expected thread-ref, got %s", got)
}
}
func TestResolveThreadID_LookupError_ReturnsMessageID(t *testing.T) {
lookup := func(messageID string) (*database.Task, error) {
return nil, errors.New("db error")
}
got := resolveThreadID("msg-7", "<parent>", "", lookup)
if got != "msg-7" {
t.Fatalf("expected msg-7, got %s", got)
}
}
var nilLookup = func(string) (*database.Task, error) { return nil, nil }