79 lines
2.5 KiB
Go
79 lines
2.5 KiB
Go
package mailstore
|
|
|
|
import (
|
|
"testing"
|
|
|
|
"mailgoserver/internal/db"
|
|
)
|
|
|
|
func TestResolveRecipientExactMatch(t *testing.T) {
|
|
s, mailboxID := newTestMailbox(t, 1<<30)
|
|
mbox, err := s.ResolveRecipient("user@example.com")
|
|
if err != nil || mbox == nil || mbox.ID != mailboxID {
|
|
t.Fatalf("got %+v, err=%v", mbox, err)
|
|
}
|
|
}
|
|
|
|
func TestResolveRecipientSubaddressTag(t *testing.T) {
|
|
s, mailboxID := newTestMailbox(t, 1<<30)
|
|
mbox, err := s.ResolveRecipient("user+newsletter@example.com")
|
|
if err != nil || mbox == nil || mbox.ID != mailboxID {
|
|
t.Fatalf("got %+v, err=%v, want the base mailbox for a +tag sub-address", mbox, err)
|
|
}
|
|
}
|
|
|
|
func TestResolveRecipientSubaddressDoesNotShadowRealMailbox(t *testing.T) {
|
|
s, _ := newTestMailbox(t, 1<<30)
|
|
dom, err := s.DB.GetDomainByName("example.com")
|
|
if err != nil || dom == nil {
|
|
t.Fatal(err)
|
|
}
|
|
hash, err := db.HashPassword("irrelevant-portal-password")
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
dek := GenerateDEK()
|
|
wrapped, nonce, err := s.WrapDEK(dek)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
// A literal, genuinely-registered "user+newsletter@example.com" mailbox must win
|
|
// over the sub-address-stripping fallback, not get shadowed by "user@example.com".
|
|
taggedMailboxID, err := s.DB.CreateMailbox("user+newsletter@example.com", hash, dom.ID, 1<<30, wrapped, nonce)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
mbox, err := s.ResolveRecipient("user+newsletter@example.com")
|
|
if err != nil || mbox == nil || mbox.ID != taggedMailboxID {
|
|
t.Fatalf("got %+v, err=%v, want the literal registered mailbox, not the stripped-tag fallback", mbox, err)
|
|
}
|
|
}
|
|
|
|
func TestResolveRecipientCatchall(t *testing.T) {
|
|
s, mailboxID := newTestMailbox(t, 1<<30)
|
|
dom, err := s.DB.GetDomainByName("example.com")
|
|
if err != nil || dom == nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
if mbox, err := s.ResolveRecipient("nobody@example.com"); err != nil || mbox != nil {
|
|
t.Fatalf("expected no catch-all configured to leave an unknown recipient unresolved, got %+v, err=%v", mbox, err)
|
|
}
|
|
|
|
if err := s.DB.SetDomainCatchall(dom.ID, &mailboxID); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
mbox, err := s.ResolveRecipient("nobody@example.com")
|
|
if err != nil || mbox == nil || mbox.ID != mailboxID {
|
|
t.Fatalf("got %+v, err=%v, want the catch-all mailbox once configured", mbox, err)
|
|
}
|
|
|
|
if err := s.DB.SetDomainCatchall(dom.ID, nil); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if mbox, err := s.ResolveRecipient("nobody@example.com"); err != nil || mbox != nil {
|
|
t.Fatalf("expected clearing the catch-all to leave an unknown recipient unresolved again, got %+v, err=%v", mbox, err)
|
|
}
|
|
}
|