8d2cd97e17
New adminalert worker polls for feedback + word complaints arriving since the last check and coalesces a burst into one digest email per interval (5 min), inert unless a distinct admin sender (BACKEND_SMTP_ADMIN_FROM) and recipient (BACKEND_ADMIN_EMAIL, comma-separated allowed) are configured. The mailer gains a per-message From override and splits a comma-separated To into separate recipients (go-mail needs them as a list). Feedback/game stores gain CountSince/CountComplaintsSince. Unit tests cover the digest, the skip-when- empty, and the recipient split.
52 lines
1.6 KiB
Go
52 lines
1.6 KiB
Go
package account
|
|
|
|
import (
|
|
"slices"
|
|
"testing"
|
|
)
|
|
|
|
// TestSplitAddrs covers the comma-separated recipient parsing used for the admin alert
|
|
// To (several operator mailboxes in one message), including trimming and empty entries.
|
|
func TestSplitAddrs(t *testing.T) {
|
|
cases := []struct {
|
|
in string
|
|
want []string
|
|
}{
|
|
{"a@x.ru", []string{"a@x.ru"}},
|
|
{"a@x.ru, b@y.ru", []string{"a@x.ru", "b@y.ru"}},
|
|
{" a@x.ru ,, b@y.ru ,", []string{"a@x.ru", "b@y.ru"}},
|
|
{"", nil},
|
|
}
|
|
for _, c := range cases {
|
|
if got := splitAddrs(c.in); !slices.Equal(got, c.want) {
|
|
t.Errorf("splitAddrs(%q) = %v, want %v", c.in, got, c.want)
|
|
}
|
|
}
|
|
}
|
|
|
|
// TestSMTPTLSMode covers the explicit TLS mode and the port-based fallback, including
|
|
// the non-standard Selectel ports (1127 = SSL, 1126 = STARTTLS) that the 465 heuristic
|
|
// alone cannot classify.
|
|
func TestSMTPTLSMode(t *testing.T) {
|
|
cases := []struct {
|
|
name string
|
|
tls string
|
|
port int
|
|
want string
|
|
}{
|
|
{"explicit ssl on a custom port (Selectel 1127)", "ssl", 1127, smtpTLSImplicit},
|
|
{"explicit starttls on a custom port (Selectel 1126)", "starttls", 1126, smtpTLSSTARTTLS},
|
|
{"tls is an alias for ssl", "TLS", 2525, smtpTLSImplicit},
|
|
{"empty derives implicit TLS on 465", "", 465, smtpTLSImplicit},
|
|
{"empty derives STARTTLS on 587", "", 587, smtpTLSSTARTTLS},
|
|
{"an unknown value falls back to the port heuristic", "bogus", 465, smtpTLSImplicit},
|
|
}
|
|
for _, c := range cases {
|
|
t.Run(c.name, func(t *testing.T) {
|
|
if got := (SMTPConfig{TLS: c.tls}).tlsMode(c.port); got != c.want {
|
|
t.Errorf("tlsMode(TLS=%q, port=%d) = %q, want %q", c.tls, c.port, got, c.want)
|
|
}
|
|
})
|
|
}
|
|
}
|