package notify import "strings" import "testing" import "time" func TestParseRecipients(t *testing.T) { var got []string var cases = []struct { in string want []string }{ {"a@x.com", []string{"a@x.com"}}, {"a@x.com, b@y.com", []string{"a@x.com", "b@y.com"}}, {" a@x.com ;b@y.com , ", []string{"a@x.com", "b@y.com"}}, {"", nil}, {" , ; ", nil}, } var c struct { in string want []string } for _, c = range cases { got = parseRecipients(c.in) if len(got) != len(c.want) { t.Fatalf("parseRecipients(%q) = %v, want %v", c.in, got, c.want) } var i int for i = 0; i < len(got); i++ { if got[i] != c.want[i] { t.Fatalf("parseRecipients(%q)[%d] = %q, want %q", c.in, i, got[i], c.want[i]) } } } } func TestBuildEmailMessage(t *testing.T) { var msg string msg = string(buildEmailMessage("alerts@example.com", []string{"a@x.com", "b@y.com"}, "api.example.com is down", "connection refused", time.Unix(1700000000, 0).UTC())) if !strings.Contains(msg, "From: alerts@example.com\r\n") { t.Fatalf("missing From header: %q", msg) } if !strings.Contains(msg, "To: a@x.com, b@y.com\r\n") { t.Fatalf("recipients not joined into To header: %q", msg) } if !strings.Contains(msg, "Subject: api.example.com is down\r\n") { t.Fatalf("missing Subject: %q", msg) } if !strings.Contains(msg, "\r\n\r\nconnection refused") { t.Fatalf("body not separated from headers: %q", msg) } } func TestBuildEmailMessageSubjectNewlinesFlattened(t *testing.T) { var msg string // A newline in the subject would otherwise inject a header (SMTP smuggling). msg = string(buildEmailMessage("f@x.com", []string{"a@x.com"}, "line1\nline2", "body", time.Unix(1700000000, 0).UTC())) if strings.Contains(msg, "Subject: line1\nline2") { t.Fatalf("subject newline not flattened: %q", msg) } if !strings.Contains(msg, "Subject: line1 line2\r\n") { t.Fatalf("expected flattened subject: %q", msg) } }