feat: notification service
This commit is contained in:
@@ -62,7 +62,7 @@ func TestServiceExecuteAcceptsTemplateDelivery(t *testing.T) {
|
||||
require.Equal(t, Result{Outcome: OutcomeAccepted}, result)
|
||||
require.Len(t, store.createInputs, 1)
|
||||
require.Nil(t, store.createInputs[0].DeliveryPayload)
|
||||
require.Equal(t, common.TemplateID("game.turn_ready"), store.createInputs[0].Delivery.TemplateID)
|
||||
require.Equal(t, common.TemplateID("game.turn.ready"), store.createInputs[0].Delivery.TemplateID)
|
||||
require.Equal(t, map[string]any{
|
||||
"turn_number": float64(54),
|
||||
"player": map[string]any{
|
||||
@@ -201,7 +201,7 @@ func TestServiceExecuteLogsAcceptedDeliveryAndCreatesSpan(t *testing.T) {
|
||||
require.NoError(t, err)
|
||||
require.Contains(t, loggerBuffer.String(), "\"delivery_id\":\"mail-124\"")
|
||||
require.Contains(t, loggerBuffer.String(), "\"source\":\"notification\"")
|
||||
require.Contains(t, loggerBuffer.String(), "\"template_id\":\"game.turn_ready\"")
|
||||
require.Contains(t, loggerBuffer.String(), "\"template_id\":\"game.turn.ready\"")
|
||||
require.Contains(t, loggerBuffer.String(), "\"trace_id\":\"trace-123\"")
|
||||
require.Contains(t, loggerBuffer.String(), "\"otel_trace_id\":")
|
||||
require.True(t, hasSpanNamed(recorder.Ended(), "mail.accept_generic_delivery"))
|
||||
@@ -295,7 +295,7 @@ func validTemplateCommand(t *testing.T) streamcommand.Command {
|
||||
"payload_mode": "template",
|
||||
"idempotency_key": "notification:mail-124",
|
||||
"requested_at_ms": "1775121700001",
|
||||
"payload_json": `{"to":["pilot@example.com"],"cc":[],"bcc":[],"reply_to":[],"template_id":"game.turn_ready","locale":"fr-FR","variables":{"turn_number":54,"player":{"name":"Pilot"}},"attachments":[]}`,
|
||||
"payload_json": `{"to":["pilot@example.com"],"cc":[],"bcc":[],"reply_to":[],"template_id":"game.turn.ready","locale":"fr-FR","variables":{"turn_number":54,"player":{"name":"Pilot"}},"attachments":[]}`,
|
||||
})
|
||||
require.NoError(t, err)
|
||||
|
||||
|
||||
@@ -308,7 +308,7 @@ func TestServiceExecuteRecordsMetricsAndLogsProviderResult(t *testing.T) {
|
||||
require.Equal(t, []string{"smtp:accepted"}, telemetry.providerDurations)
|
||||
require.Contains(t, loggerBuffer.String(), "\"delivery_id\":\"delivery-template-sending\"")
|
||||
require.Contains(t, loggerBuffer.String(), "\"source\":\"notification\"")
|
||||
require.Contains(t, loggerBuffer.String(), "\"template_id\":\"game.turn_ready\"")
|
||||
require.Contains(t, loggerBuffer.String(), "\"template_id\":\"game.turn.ready\"")
|
||||
require.Contains(t, loggerBuffer.String(), "\"attempt_no\":1")
|
||||
require.Contains(t, loggerBuffer.String(), "\"otel_trace_id\":")
|
||||
require.True(t, hasExecuteSpanNamed(recorder.Ended(), "mail.provider_send"))
|
||||
@@ -431,7 +431,7 @@ func queuedTemplateWorkItem(t *testing.T) WorkItem {
|
||||
DeliveryID: common.DeliveryID("delivery-template"),
|
||||
Source: deliverydomain.SourceNotification,
|
||||
PayloadMode: deliverydomain.PayloadModeTemplate,
|
||||
TemplateID: common.TemplateID("game.turn_ready"),
|
||||
TemplateID: common.TemplateID("game.turn.ready"),
|
||||
Envelope: deliverydomain.Envelope{
|
||||
To: []common.Email{common.Email("pilot@example.com")},
|
||||
},
|
||||
@@ -512,7 +512,7 @@ func sendingTemplateWorkItem(t *testing.T, attemptNo int) WorkItem {
|
||||
DeliveryID: common.DeliveryID("delivery-template-sending"),
|
||||
Source: deliverydomain.SourceNotification,
|
||||
PayloadMode: deliverydomain.PayloadModeTemplate,
|
||||
TemplateID: common.TemplateID("game.turn_ready"),
|
||||
TemplateID: common.TemplateID("game.turn.ready"),
|
||||
Envelope: deliverydomain.Envelope{
|
||||
To: []common.Email{common.Email("pilot@example.com")},
|
||||
},
|
||||
|
||||
@@ -26,9 +26,9 @@ func TestServiceExecuteRendersExactLocale(t *testing.T) {
|
||||
catalog := newTestCatalog(t, map[string]string{
|
||||
filepath.Join("auth.login_code", "en", "subject.tmpl"): "Your login code",
|
||||
filepath.Join("auth.login_code", "en", "text.tmpl"): "Code: {{.code}}",
|
||||
filepath.Join("game.turn_ready", "fr-fr", "subject.tmpl"): "Tour {{.turn_number}}",
|
||||
filepath.Join("game.turn_ready", "fr-fr", "text.tmpl"): "Bonjour {{with .player}}{{.name}}{{end}}",
|
||||
filepath.Join("game.turn_ready", "fr-fr", "html.tmpl"): "<p>{{.player.name}}</p>",
|
||||
filepath.Join("game.turn.ready", "fr-fr", "subject.tmpl"): "Tour {{.turn_number}}",
|
||||
filepath.Join("game.turn.ready", "fr-fr", "text.tmpl"): "Bonjour {{with .player}}{{.name}}{{end}}",
|
||||
filepath.Join("game.turn.ready", "fr-fr", "html.tmpl"): "<p>{{.player.name}}</p>",
|
||||
})
|
||||
|
||||
store := &stubStore{}
|
||||
@@ -61,8 +61,8 @@ func TestServiceExecuteFallsBackToEnglish(t *testing.T) {
|
||||
catalog := newTestCatalog(t, map[string]string{
|
||||
filepath.Join("auth.login_code", "en", "subject.tmpl"): "Your login code",
|
||||
filepath.Join("auth.login_code", "en", "text.tmpl"): "Code: {{.code}}",
|
||||
filepath.Join("game.turn_ready", "en", "subject.tmpl"): "Turn {{.turn_number}}",
|
||||
filepath.Join("game.turn_ready", "en", "text.tmpl"): "Hello {{.player.name}}",
|
||||
filepath.Join("game.turn.ready", "en", "subject.tmpl"): "Turn {{.turn_number}}",
|
||||
filepath.Join("game.turn.ready", "en", "text.tmpl"): "Hello {{.player.name}}",
|
||||
})
|
||||
|
||||
store := &stubStore{}
|
||||
@@ -86,8 +86,8 @@ func TestServiceExecuteRecordsLocaleFallbackAndLogsFields(t *testing.T) {
|
||||
catalog := newTestCatalog(t, map[string]string{
|
||||
filepath.Join("auth.login_code", "en", "subject.tmpl"): "Your login code",
|
||||
filepath.Join("auth.login_code", "en", "text.tmpl"): "Code: {{.code}}",
|
||||
filepath.Join("game.turn_ready", "en", "subject.tmpl"): "Turn {{.turn_number}}",
|
||||
filepath.Join("game.turn_ready", "en", "text.tmpl"): "Hello {{.player.name}}",
|
||||
filepath.Join("game.turn.ready", "en", "subject.tmpl"): "Turn {{.turn_number}}",
|
||||
filepath.Join("game.turn.ready", "en", "text.tmpl"): "Hello {{.player.name}}",
|
||||
})
|
||||
|
||||
telemetry := &stubTelemetry{}
|
||||
@@ -107,10 +107,10 @@ func TestServiceExecuteRecordsLocaleFallbackAndLogsFields(t *testing.T) {
|
||||
_, err := service.Execute(context.Background(), validInput(t, "fr-FR"))
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, []string{"notification:rendered"}, telemetry.statuses)
|
||||
require.Equal(t, []string{"game.turn_ready:fr-FR:en"}, telemetry.fallbacks)
|
||||
require.Equal(t, []string{"game.turn.ready:fr-FR:en"}, telemetry.fallbacks)
|
||||
require.Contains(t, loggerBuffer.String(), "\"delivery_id\":\"delivery-123\"")
|
||||
require.Contains(t, loggerBuffer.String(), "\"source\":\"notification\"")
|
||||
require.Contains(t, loggerBuffer.String(), "\"template_id\":\"game.turn_ready\"")
|
||||
require.Contains(t, loggerBuffer.String(), "\"template_id\":\"game.turn.ready\"")
|
||||
require.Contains(t, loggerBuffer.String(), "\"attempt_no\":1")
|
||||
require.Contains(t, loggerBuffer.String(), "\"otel_trace_id\":")
|
||||
require.True(t, hasRenderSpanNamed(recorder.Ended(), "mail.render_delivery"))
|
||||
@@ -122,8 +122,8 @@ func TestServiceExecuteFailsOnMissingRequiredVariable(t *testing.T) {
|
||||
catalog := newTestCatalog(t, map[string]string{
|
||||
filepath.Join("auth.login_code", "en", "subject.tmpl"): "Your login code",
|
||||
filepath.Join("auth.login_code", "en", "text.tmpl"): "Code: {{.code}}",
|
||||
filepath.Join("game.turn_ready", "en", "subject.tmpl"): "Turn {{.turn_number}}",
|
||||
filepath.Join("game.turn_ready", "en", "text.tmpl"): "Hello {{.player.name}}",
|
||||
filepath.Join("game.turn.ready", "en", "subject.tmpl"): "Turn {{.turn_number}}",
|
||||
filepath.Join("game.turn.ready", "en", "text.tmpl"): "Hello {{.player.name}}",
|
||||
})
|
||||
|
||||
store := &stubStore{}
|
||||
@@ -153,8 +153,8 @@ func TestServiceExecuteFailsOnTemplateExecutionError(t *testing.T) {
|
||||
catalog := newTestCatalog(t, map[string]string{
|
||||
filepath.Join("auth.login_code", "en", "subject.tmpl"): "Your login code",
|
||||
filepath.Join("auth.login_code", "en", "text.tmpl"): "Code: {{.code}}",
|
||||
filepath.Join("game.turn_ready", "en", "subject.tmpl"): "{{call .callable}}",
|
||||
filepath.Join("game.turn_ready", "en", "text.tmpl"): "Hello {{.player.name}}",
|
||||
filepath.Join("game.turn.ready", "en", "subject.tmpl"): "{{call .callable}}",
|
||||
filepath.Join("game.turn.ready", "en", "text.tmpl"): "Hello {{.player.name}}",
|
||||
})
|
||||
|
||||
store := &stubStore{}
|
||||
@@ -231,8 +231,8 @@ func TestServiceExecuteReturnsServiceUnavailableOnStoreFailure(t *testing.T) {
|
||||
catalog := newTestCatalog(t, map[string]string{
|
||||
filepath.Join("auth.login_code", "en", "subject.tmpl"): "Your login code",
|
||||
filepath.Join("auth.login_code", "en", "text.tmpl"): "Code: {{.code}}",
|
||||
filepath.Join("game.turn_ready", "en", "subject.tmpl"): "Turn {{.turn_number}}",
|
||||
filepath.Join("game.turn_ready", "en", "text.tmpl"): "Hello {{.player.name}}",
|
||||
filepath.Join("game.turn.ready", "en", "subject.tmpl"): "Turn {{.turn_number}}",
|
||||
filepath.Join("game.turn.ready", "en", "text.tmpl"): "Hello {{.player.name}}",
|
||||
})
|
||||
|
||||
service := newTestService(t, Config{
|
||||
@@ -346,7 +346,7 @@ func validInput(t *testing.T, localeValue string) Input {
|
||||
DeliveryID: common.DeliveryID("delivery-123"),
|
||||
Source: deliverydomain.SourceNotification,
|
||||
PayloadMode: deliverydomain.PayloadModeTemplate,
|
||||
TemplateID: common.TemplateID("game.turn_ready"),
|
||||
TemplateID: common.TemplateID("game.turn.ready"),
|
||||
Envelope: deliverydomain.Envelope{
|
||||
To: []common.Email{common.Email("pilot@example.com")},
|
||||
},
|
||||
|
||||
@@ -121,7 +121,7 @@ func TestServiceExecuteLogsCloneCreationAndCreatesSpan(t *testing.T) {
|
||||
require.Equal(t, []string{"operator_resend:queued"}, telemetry.statuses)
|
||||
require.Contains(t, loggerBuffer.String(), "\"delivery_id\":\"clone-456\"")
|
||||
require.Contains(t, loggerBuffer.String(), "\"source\":\"operator_resend\"")
|
||||
require.Contains(t, loggerBuffer.String(), "\"template_id\":\"game.turn_ready\"")
|
||||
require.Contains(t, loggerBuffer.String(), "\"template_id\":\"game.turn.ready\"")
|
||||
require.Contains(t, loggerBuffer.String(), "\"otel_trace_id\":")
|
||||
require.True(t, hasResendSpanNamed(recorder.Ended(), "mail.resend_delivery"))
|
||||
}
|
||||
@@ -205,7 +205,7 @@ func validOriginalDelivery() deliverydomain.Delivery {
|
||||
DeliveryID: common.DeliveryID("delivery-original"),
|
||||
Source: deliverydomain.SourceNotification,
|
||||
PayloadMode: deliverydomain.PayloadModeTemplate,
|
||||
TemplateID: common.TemplateID("game.turn_ready"),
|
||||
TemplateID: common.TemplateID("game.turn.ready"),
|
||||
Envelope: deliverydomain.Envelope{
|
||||
To: []common.Email{common.Email("pilot@example.com")},
|
||||
Cc: []common.Email{common.Email("copilot@example.com")},
|
||||
|
||||
Reference in New Issue
Block a user