package notification import ( "path/filepath" "testing" "github.com/stretchr/testify/require" ) var expectedNotificationPushPublicationDocumentationSnippets = []string{ "one long-lived `push` route publisher", "the `push` publisher claims only routes whose `route_id` starts with `push:`", "`Gateway` publication uses `XADD MAXLEN ~` with `NOTIFICATION_GATEWAY_CLIENT_EVENTS_STREAM_MAX_LEN`", "`event_id` equals `/`", "`device_session_id` is intentionally omitted so `Gateway` fans the event out to every active stream of that user", } var expectedNotificationMailPublicationDocumentationSnippets = []string{ "one long-lived `email` route publisher", "template-mode `email` publication toward `Mail Service`", "`Mail Service` publication uses plain `XADD` with no stream trimming", "`delivery_id` equals `/`", "`idempotency_key` equals `notification:/`", "`requested_at_ms` equals `accepted_at_ms`", "`payload_json.to` contains exactly one resolved recipient email", "`payload_json.cc`, `payload_json.bcc`, `payload_json.reply_to`, and `payload_json.attachments` are empty arrays in v1", "`email` publication failures are classified minimally as `payload_encoding_failed` and `mail_stream_publish_failed`", } func TestNotificationRoutePublicationDocsStayInSync(t *testing.T) { t.Parallel() readme := loadTextFile(t, "README.md") flowsDoc := loadTextFile(t, filepath.Join("docs", "flows.md")) runtimeDoc := loadTextFile(t, filepath.Join("docs", "runtime.md")) docsIndex := loadTextFile(t, filepath.Join("docs", "README.md")) mailReadme := loadTextFile(t, filepath.Join("..", "mail", "README.md")) mailAsyncAPI := loadTextFile(t, filepath.Join("..", "mail", "api", "delivery-commands-asyncapi.yaml")) normalizedReadme := normalizeWhitespace(readme) normalizedFlowsDoc := normalizeWhitespace(flowsDoc) normalizedRuntimeDoc := normalizeWhitespace(runtimeDoc) normalizedMailReadme := normalizeWhitespace(mailReadme) require.Contains(t, docsIndex, "- [Main flows](flows.md)") require.Contains(t, docsIndex, "- [Runtime and components](runtime.md)") for _, snippet := range expectedNotificationPushPublicationDocumentationSnippets { normalizedSnippet := normalizeWhitespace(snippet) require.Contains(t, normalizedReadme, normalizedSnippet) } for _, snippet := range expectedNotificationMailPublicationDocumentationSnippets { normalizedSnippet := normalizeWhitespace(snippet) require.Contains(t, normalizedReadme, normalizedSnippet) } require.Contains(t, normalizedRuntimeDoc, normalizeWhitespace("processes only scheduled route IDs beginning with `push:`")) require.Contains(t, normalizedRuntimeDoc, normalizeWhitespace("processes only scheduled route IDs beginning with `email:`")) require.Contains(t, normalizedFlowsDoc, normalizeWhitespace("XADD MAXLEN ~ gateway client-event stream")) require.Contains(t, normalizedFlowsDoc, normalizeWhitespace("XADD mail:delivery_commands")) require.Contains(t, normalizedFlowsDoc, normalizeWhitespace("`payload_mode=template`")) require.Contains(t, normalizedReadme, normalizeWhitespace("`notification:route_leases::`")) require.Contains(t, normalizedReadme, normalizeWhitespace("`payload_encoding_failed`")) require.Contains(t, normalizedReadme, normalizeWhitespace("`gateway_stream_publish_failed`")) require.Contains(t, normalizedReadme, normalizeWhitespace("`mail_stream_publish_failed`")) require.Contains(t, normalizedMailReadme, normalizeWhitespace("- `requested_at_ms`")) require.Contains(t, normalizedMailReadme, normalizeWhitespace("`requested_at_ms` stores the publisher-side original request timestamp")) require.Contains(t, mailAsyncAPI, "requested_at_ms:") require.Contains(t, mailAsyncAPI, "payload_mode:") }