blob: 76f03195085a0f89ead38b79aa9f083eb9ca691d [file] [log] [blame]
package emailclient
import (
"io/ioutil"
"net/http"
"net/http/httptest"
"testing"
"github.com/stretchr/testify/require"
"go.skia.org/infra/go/httputils"
"go.skia.org/infra/go/testutils/unittest"
)
func TestClientSendWithMarkup_HappyPath(t *testing.T) {
unittest.SmallTest(t)
const expectedMessageID = "<the-actual-message-id>"
const expected = `From: Alert Manager <alerts@skia.org>
To: someone@example.org
Subject: Alert!
Content-Type: text/html; charset=UTF-8
References: some-thread-reference
In-Reply-To: some-thread-reference
<html>
<body>
<h2>Hi!</h2>
</body>
</html>
`
s := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
b, err := ioutil.ReadAll(r.Body)
require.NoError(t, err)
bodyAsString := string(b)
require.Equal(t, expected, bodyAsString)
w.Header().Add("x-message-id", expectedMessageID)
w.WriteHeader(http.StatusOK)
}))
c := NewAt(s.URL)
c.client = httputils.NewFastTimeoutClient()
msgID, err := c.SendWithMarkup("Alert Manager", "alerts@skia.org", []string{"someone@example.org"}, "Alert!", "", "<h2>Hi!</h2>", "some-thread-reference")
require.NoError(t, err)
require.Equal(t, expectedMessageID, msgID)
}
func TestClientSendWithMarkup_HTTPRequestFails_ReturnsError(t *testing.T) {
unittest.SmallTest(t)
s := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
http.Error(w, "Not Found", http.StatusNotFound)
}))
c := NewAt(s.URL)
_, err := c.SendWithMarkup("Alert Manager", "alerts@skia.org", []string{"someone@example.org"}, "Alert!", "", "<h2>Hi!</h2>", "some-thread-reference")
require.Contains(t, err.Error(), "Failed to send")
}
func TestClientSendWithMarkup_DedupRecipients(t *testing.T) {
unittest.SmallTest(t)
const expectedMessageID = "<the-actual-message-id>"
const expected = `From: Alert Manager <alerts@skia.org>
To: someone@example.org,Someone Else <someone-else@example.org>
Subject: Alert!
Content-Type: text/html; charset=UTF-8
References: some-thread-reference
In-Reply-To: some-thread-reference
<html>
<body>
<h2>Hi!</h2>
</body>
</html>
`
s := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
b, err := ioutil.ReadAll(r.Body)
require.NoError(t, err)
bodyAsString := string(b)
require.Equal(t, expected, bodyAsString)
w.Header().Add("x-message-id", expectedMessageID)
w.WriteHeader(http.StatusOK)
}))
c := NewAt(s.URL)
c.client = httputils.NewFastTimeoutClient()
msgID, err := c.SendWithMarkup("Alert Manager", "alerts@skia.org", []string{"someone@example.org", "Someone <someone@example.org>", "<someone@example.org>", "Someone Else <someone-else@example.org>"}, "Alert!", "", "<h2>Hi!</h2>", "some-thread-reference")
require.NoError(t, err)
require.Equal(t, expectedMessageID, msgID)
}
func TestClientValid(t *testing.T) {
unittest.SmallTest(t)
require.True(t, NewAt(DefaultEmailServiceURL).Valid())
require.True(t, NewAt(NamespacedEmailServiceURL).Valid())
require.False(t, NewAt("").Valid())
}