feat: mail service
This commit is contained in:
@@ -0,0 +1,110 @@
|
||||
package authsessionmail_test
|
||||
|
||||
import (
|
||||
"net/url"
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
"github.com/stretchr/testify/require"
|
||||
)
|
||||
|
||||
func TestAuthsessionMailBlackBoxSendEmailCodeCreatesSuppressedDelivery(t *testing.T) {
|
||||
h := newAuthsessionMailHarness(t, authsessionMailHarnessOptions{})
|
||||
email := "pilot@example.com"
|
||||
|
||||
response := h.sendChallengeWithAcceptLanguage(t, email, "fr-FR, en;q=0.8")
|
||||
require.NotEmpty(t, response.ChallengeID)
|
||||
|
||||
list := h.eventuallyListDeliveries(t, url.Values{
|
||||
"source": []string{"authsession"},
|
||||
"status": []string{"suppressed"},
|
||||
"recipient": []string{email},
|
||||
"template_id": []string{"auth.login_code"},
|
||||
})
|
||||
require.Len(t, list.Items, 1)
|
||||
require.Equal(t, "authsession", list.Items[0].Source)
|
||||
require.Equal(t, "suppressed", list.Items[0].Status)
|
||||
require.Equal(t, "auth.login_code", list.Items[0].TemplateID)
|
||||
require.Equal(t, "fr-FR", list.Items[0].Locale)
|
||||
require.Equal(t, []string{email}, list.Items[0].To)
|
||||
|
||||
detail := h.getDelivery(t, list.Items[0].DeliveryID)
|
||||
require.Equal(t, "authsession", detail.Source)
|
||||
require.Equal(t, "suppressed", detail.Status)
|
||||
require.Equal(t, "auth.login_code", detail.TemplateID)
|
||||
require.Equal(t, "fr-FR", detail.Locale)
|
||||
require.False(t, detail.LocaleFallbackUsed)
|
||||
require.Equal(t, []string{email}, detail.To)
|
||||
require.NotEmpty(t, detail.IdempotencyKey)
|
||||
|
||||
attempts := h.getDeliveryAttempts(t, detail.DeliveryID)
|
||||
require.Empty(t, attempts.Items)
|
||||
}
|
||||
|
||||
func TestAuthsessionMailBlackBoxSendEmailCodeReturnsServiceUnavailableWhenMailServiceStops(t *testing.T) {
|
||||
h := newAuthsessionMailHarness(t, authsessionMailHarnessOptions{})
|
||||
h.stopMail(t)
|
||||
|
||||
response := postJSONValueWithHeaders(
|
||||
t,
|
||||
h.authsessionPublicURL+authSendEmailCodePath,
|
||||
map[string]string{"email": "pilot@example.com"},
|
||||
nil,
|
||||
)
|
||||
|
||||
require.Equal(t, 503, response.StatusCode)
|
||||
require.JSONEq(t, `{"error":{"code":"service_unavailable","message":"service is unavailable"}}`, response.Body)
|
||||
}
|
||||
|
||||
func TestAuthsessionMailBlackBoxSMTPDeliveryReachesSentStateAndSMTPPayload(t *testing.T) {
|
||||
h := newAuthsessionMailHarness(t, authsessionMailHarnessOptions{mailSMTPMode: "smtp"})
|
||||
email := "pilot@example.com"
|
||||
|
||||
response := h.sendChallengeWithAcceptLanguage(t, email, "fr-FR, en;q=0.8")
|
||||
require.NotEmpty(t, response.ChallengeID)
|
||||
|
||||
list := h.eventuallyListDeliveries(t, url.Values{
|
||||
"source": []string{"authsession"},
|
||||
"recipient": []string{email},
|
||||
"template_id": []string{"auth.login_code"},
|
||||
})
|
||||
require.Len(t, list.Items, 1)
|
||||
require.Equal(t, "authsession", list.Items[0].Source)
|
||||
require.Equal(t, "auth.login_code", list.Items[0].TemplateID)
|
||||
require.Equal(t, "fr-FR", list.Items[0].Locale)
|
||||
require.Equal(t, []string{email}, list.Items[0].To)
|
||||
|
||||
var detail mailDeliveryDetailResponse
|
||||
require.Eventually(t, func() bool {
|
||||
detail = h.getDelivery(t, list.Items[0].DeliveryID)
|
||||
return detail.Status == "sent"
|
||||
}, 10*time.Second, 50*time.Millisecond)
|
||||
require.Equal(t, "authsession", detail.Source)
|
||||
require.Equal(t, "sent", detail.Status)
|
||||
require.Equal(t, "auth.login_code", detail.TemplateID)
|
||||
require.Equal(t, "fr-FR", detail.Locale)
|
||||
require.True(t, detail.LocaleFallbackUsed)
|
||||
require.Equal(t, []string{email}, detail.To)
|
||||
require.NotEmpty(t, detail.IdempotencyKey)
|
||||
|
||||
code, ok := detail.TemplateVariables["code"].(string)
|
||||
require.True(t, ok)
|
||||
require.Len(t, code, 6)
|
||||
|
||||
var attempts mailDeliveryAttemptsResponse
|
||||
require.Eventually(t, func() bool {
|
||||
attempts = h.getDeliveryAttempts(t, detail.DeliveryID)
|
||||
return len(attempts.Items) == 1 && attempts.Items[0].Status == "provider_accepted"
|
||||
}, 10*time.Second, 50*time.Millisecond)
|
||||
require.Len(t, attempts.Items, 1)
|
||||
require.Equal(t, "provider_accepted", attempts.Items[0].Status)
|
||||
|
||||
require.NotNil(t, h.smtp)
|
||||
var payload string
|
||||
require.Eventually(t, func() bool {
|
||||
payload = h.smtp.LatestPayload()
|
||||
return payload != ""
|
||||
}, 10*time.Second, 50*time.Millisecond)
|
||||
require.Contains(t, payload, "Subject:")
|
||||
require.Contains(t, payload, "Your login code is "+code+".")
|
||||
}
|
||||
Reference in New Issue
Block a user