Skip to content

Add discriminated union serialization tests - #1860

Open
jar-stripe wants to merge 5 commits into
masterfrom
jar/discriminated-unions
Open

Add discriminated union serialization tests#1860
jar-stripe wants to merge 5 commits into
masterfrom
jar/discriminated-unions

Conversation

@jar-stripe

@jar-stripe jar-stripe commented Jul 30, 2026

Copy link
Copy Markdown
Contributor

Why?

Validates that the discriminated union serialization design works correctly in stripe-python before codegen produces these patterns. Exercises both request-side (params encoding via _api_encode) and response-side (StripeObject.construct_from deserialization).

What?

  • Adds tests/test_discriminated_unions.py with 29 tests covering:
    • Request standalone union: TypedDicts with Literal["value"] discriminator field, encoded via _api_encode verifying correct bracket-notation output (color[model]=rgb, color[r]=255)
    • Request inline union: Parent PaymentParams TypedDict with discriminator + per-variant nullable payload fields (matching flattenDiscriminatedUnionFields output), encoded via _api_encode verifying top-level discriminator + nested payload keys
    • Response standalone union: StripeObject.construct_from with flat JSON, verifying discriminator and payload field access via attribute and bracket notation
    • Response inline union: StripeObject.construct_from with nested JSON ({"type": "card", "card": {"number": "4242"}}), verifying recursive StripeObject deserialization of variant payloads
    • Round-trip: _api_encode for request direction, construct_from + to_dict for response direction

Tests discriminated union type shapes for both request-side (TypedDict
params with Literal discriminator) and response-side (StripeObject
deserialization), covering standalone and inline variants.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Committed-By-Agent: claude
@jar-stripe
jar-stripe marked this pull request as ready for review August 6, 2026 21:13
@jar-stripe
jar-stripe requested a review from a team as a code owner August 6, 2026 21:13
@jar-stripe
jar-stripe requested review from xavdid and a lite review from Copilot and removed request for a team August 6, 2026 21:13

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Adds a new test module intended to validate “discriminated union” payload shapes, covering both request-style dict params (TypedDict + Literal discriminator) and response-style StripeObject construct/to_dict round-trips.

Changes:

  • Introduces standalone and inline discriminator “union” examples via TypedDict variants.
  • Adds runtime tests for discriminator field presence/access on dict params and StripeObject instances.
  • Adds round-trip checks ensuring discriminator fields survive construct_from(...).to_dict().

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment thread tests/test_discriminated_unions.py Outdated
Comment on lines +289 to +291
params: RgbColorParams = {"model": "rgb", "r": 200, "g": 100, "b": 50}
# Simulating what the SDK does when encoding params for an API request.
serialized = dict(params)

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed — updated the comment to clarify that this tests runtime dict semantics (discriminator and variant fields survive a shallow copy), not the full SDK encoding pipeline.

Comment on lines +1 to +11
"""
Tests for discriminated union type shapes.

Covers both sides of the API boundary:
- Request side: TypedDict params with Literal discriminator fields
- Response side: StripeObject deserialization from JSON with a discriminator

Two structural patterns are tested:
- Standalone union: the discriminated union is its own type (e.g. ColorParams)
- Inline union: the discriminator lives at the parent object level (e.g. shape.type)
"""

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Good catch — updated the module docstring to explicitly state these tests exercise runtime semantics only, not static type narrowing.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

yeah this was basically going to be my comment. We have some other types test in the repo already!

jar-stripe and others added 2 commits August 7, 2026 13:11
The module docstring now explicitly states these tests exercise runtime
semantics (dict construction, field access, round-trip), not static type
narrowing. The dict() comment explains what it's actually testing.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Committed-By-Agent: claude

@xavdid xavdid left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

commented - but this isn't really testing types yet

Inline union tests now use the flattened TypedDict pattern (discriminator
and per-variant payload fields on the parent) rather than the incorrect
per-variant TypedDicts-with-type-field pattern that was there before.

Request-side tests now exercise `_api_encode` so they verify real SDK
encoding behavior (bracket notation, nested dicts) rather than just dict
construction and key lookup.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Committed-By-Agent: claude
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.

3 participants