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+".") }