Skip to content

test(inbound): parser equivalence across Postmark / Mailgun / SES#31

Open
mpge wants to merge 1 commit intofeat/ses-parserfrom
test/parser-equivalence
Open

test(inbound): parser equivalence across Postmark / Mailgun / SES#31
mpge wants to merge 1 commit intofeat/ses-parserfrom
test/parser-equivalence

Conversation

@mpge
Copy link
Copy Markdown
Member

@mpge mpge commented Apr 24, 2026

Summary

Ports escalated-go#37 to .NET. Cements the three-provider parser contract: the same logical email, expressed in each provider's native webhook payload shape, should normalize to the same `InboundMessage` metadata.

Tests

Two xUnit cases:

  • `NormalizesToSameMessage`: asserts `FromEmail` / `ToEmail` / `Subject` / `InReplyTo` / `References` match across all three parsers for a single logical reply email.
  • `BodyExtractionMatches`: asserts `BodyText` matches when SES is configured with full-content delivery (`action.type=SNS`, `encoding=BASE64`). Postmark and Mailgun forward the body directly; SES needs the base64 MIME dance to get there.

Shared `LogicalEmail` record + `BuildXxxPayload` builders mean adding a fourth provider validates against the existing three for free.

Stacked PR

Based on `feat/ses-parser` (#30). Merge order: #23#24#25#26#29#30 → this PR.

Ports escalated-go#37 to .NET. The same logical email, expressed in
each provider's native webhook payload shape, should normalize to
the same InboundMessage metadata. Parser equivalence at this layer
guarantees a reply delivered via any provider routes to the same
ticket via the same threading chain.

Two xUnit cases:
  - NormalizesToSameMessage: asserts FromEmail / ToEmail / Subject
    / InReplyTo / References match across all three parsers.
  - BodyExtractionMatches: asserts BodyText matches when SES is
    configured with full-content delivery (action.type=SNS,
    encoding=BASE64).

Shared LogicalEmail record + BuildXxxPayload builders mean adding
a fourth provider validates against the existing three for free.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant