Files

103 lines
2.7 KiB
Go

package mailparser_test
import (
"reflect"
"testing"
"archivmail/pkg/mailparser"
)
func parseHeaders(t *testing.T, headers string) *mailparser.ParsedMail {
t.Helper()
raw := headers +
"From: carol@example.org\r\n" +
"To: dave@example.org\r\n" +
"Subject: test\r\n" +
"\r\n" +
"body\r\n"
pm, err := mailparser.Parse([]byte(raw))
if err != nil {
t.Fatalf("Parse: %v", err)
}
return pm
}
func TestDeliveryAddresses(t *testing.T) {
tests := []struct {
name string
headers string
want []string
}{
{
name: "none",
headers: "",
want: nil,
},
{
name: "topmost delivered-to only",
headers: "Delivered-To: alice@example.com\r\nReceived: from x\r\nDelivered-To: mallory@example.net\r\n",
want: []string{"alice@example.com"},
},
{
name: "case normalized",
headers: "Delivered-To: Alice.Smith@Example.COM\r\n",
want: []string{"alice.smith@example.com"},
},
{
name: "header name case insensitive",
headers: "DELIVERED-TO: alice@example.com\r\n",
want: []string{"alice@example.com"},
},
{
name: "all three headers, dedup",
headers: "Delivered-To: alice@example.com\r\nX-Original-To: team-list@example.com\r\nEnvelope-To: alice@example.com\r\n",
want: []string{"alice@example.com", "team-list@example.com"},
},
{
name: "envelope-to list",
headers: "Envelope-To: alice@example.com, bob+news@example.com\r\n",
want: []string{"alice@example.com", "bob+news@example.com"},
},
{
name: "angle brackets",
headers: "X-Original-To: <alice@example.com>\r\n",
want: []string{"alice@example.com"},
},
{
name: "invalid topmost is not replaced by lower one",
headers: "Delivered-To: not an address\r\nDelivered-To: mallory@example.net\r\n",
want: nil,
},
{
name: "invalid value",
headers: "Delivered-To: <<<@@\r\n",
want: nil,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
pm := parseHeaders(t, tt.headers)
if !reflect.DeepEqual(pm.DeliveryAddresses, tt.want) {
t.Errorf("DeliveryAddresses = %#v, want %#v", pm.DeliveryAddresses, tt.want)
}
})
}
}
func TestTrustedDeliveryAddresses(t *testing.T) {
pm := parseHeaders(t, "Delivered-To: alice@example.com\r\n")
for _, src := range []string{"imap", "pop3"} {
if got := mailparser.TrustedDeliveryAddresses(pm, src); !reflect.DeepEqual(got, []string{"alice@example.com"}) {
t.Errorf("source %q: got %#v", src, got)
}
}
for _, src := range []string{"smtp", "import", "", "IMAP"} {
if got := mailparser.TrustedDeliveryAddresses(pm, src); got != nil {
t.Errorf("source %q must be untrusted, got %#v", src, got)
}
}
if got := mailparser.TrustedDeliveryAddresses(nil, "imap"); got != nil {
t.Errorf("nil mail: got %#v", got)
}
}