111 lines
3.9 KiB
Go
111 lines
3.9 KiB
Go
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+".")
|
|
}
|