103 lines
2.7 KiB
Go
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)
|
|
}
|
|
}
|