-
Notifications
You must be signed in to change notification settings - Fork 291
[spector] Add discriminated union test cases #7602
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Conversation
Co-authored-by: msyyc <70930885+msyyc@users.noreply.github.com>
Co-authored-by: msyyc <70930885+msyyc@users.noreply.github.com>
Co-authored-by: msyyc <70930885+msyyc@users.noreply.github.com>
@copilot Apply comments #7602 (comment) and #7602 (comment) for all scenarios. |
… to all GET endpoints Co-authored-by: msyyc <70930885+msyyc@users.noreply.github.com>
Applied both comments to all scenarios:
Updated mockapi implementations to handle the optional parameters with appropriate response logic (when parameter is null/"cat" returns cat response, when "dog" returns dog response). All 56 scenarios pass validation. Implemented in commit ab3ee92. |
Co-authored-by: msyyc <70930885+msyyc@users.noreply.github.com>
… union scenarios Co-authored-by: msyyc <70930885+msyyc@users.noreply.github.com>
Co-authored-by: msyyc <70930885+msyyc@users.noreply.github.com>
Just as a heads up, I was blocked by some firewall rules while working on your feedback. Expand below for details. Warning Firewall rules blocked me from connecting to one or more addressesI tried to connect to the following addresses, but was blocked by firewall rules:
If you need me to access, download, or install something from one of these locations, you can either:
|
* The discriminated union should serialize with "kind" as discriminator | ||
* and "value" as envelope property. | ||
*/ | ||
@discriminated |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
In envelope case, is it allowed if Cat and Dog has "extend"? And what if they have property "kind" also?
model Pet {
name: string;
}
model Cat {
meow: boolean;
}
model Dog {
bark: boolean;
}
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Added test scenarios for both cases you asked about:
-
Model inheritance: Yes, it's allowed. Added
/envelope/object/inheritance
scenario testing Cat/Dog models that extend a base Pet model. -
Property name conflicts: Yes, when models have a "kind" property, it needs to match the discriminator value. Added
/envelope/object/conflict
scenario testing this case.
The implementation shows that TypeSpec handles both inheritance and property conflicts correctly. Implemented in commit fc0cafa.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This PR is just for basic cases, and we could add more in the future if needed.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Let me clarify why I am asking this question - I am okay the pr is only for basic case, I just want to understand what the boundary is for discriminated union in typespec side. I believe no emitter supports this feature yet but since TypeSpec is GA and we have real customer's ask for this feature and if it is not allowed, it's better to have some limitation then.
Maybe @timotheeguerin could help us understand this.
* The discriminated union should serialize with discriminator property | ||
* injected directly into the variant object. | ||
*/ | ||
@discriminated(#{ envelope: "none" }) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
In no-envelope case, is it allowed if Cat and Dog has "extend"? And what if they have property "kind" also?
model Pet {
name: string;
}
model Cat {
meow: boolean;
}
model Dog {
bark: boolean;
}
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Added test scenarios for both cases you asked about in the no-envelope case:
-
Model inheritance: Yes, it's allowed. Added
/no-envelope/inheritance
scenario testing Cat/Dog models that extend a base Pet model with inline discriminator. -
Property name conflicts: Yes, when models have a "kind" property, it merges with the inline discriminator. Added
/no-envelope/conflict
scenario testing this case.
Both inheritance and property conflicts work correctly with inline discriminators. Implemented in commit fc0cafa.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This PR is just for basic cases, and we could add more in the future if needed.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
see comments.
…r property name Co-authored-by: MaryGao <9943211+MaryGao@users.noreply.github.com>
|
||
# discriminated union issue - https://github.com/microsoft/typespec/issues/7134 | ||
|
||
type/union/discriminated |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Let's skip this case since this is not supported in js yet. /cc @joheredi
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The discriminated union test case is already being skipped for JS via the .testignore file (line 11: type/union/discriminated
), so this is correctly handled.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@copilot Add changelog for http-client-js like you do for http-specs
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Added changelog entry for http-client-js documenting that discriminated union test scenarios are skipped since the feature is not yet supported by the JavaScript emitter. Commit c53bed6.
Co-authored-by: MaryGao <9943211+MaryGao@users.noreply.github.com>
Co-authored-by: msyyc <70930885+msyyc@users.noreply.github.com>
Just as a heads up, I was blocked by some firewall rules while working on your feedback. Expand below for details. Warning Firewall rules blocked me from connecting to one or more addressesI tried to connect to the following addresses, but was blocked by firewall rules:
If you need me to access, download, or install something from one of these locations, you can either:
|
Co-authored-by: iscai-msft <43154838+iscai-msft@users.noreply.github.com>
@copilot Add changelog for http-client-js just like you do for http-specs. |
Co-authored-by: msyyc <70930885+msyyc@users.noreply.github.com>
This PR adds comprehensive spector test cases for discriminated unions based on the TypeSpec standard library documentation.
Scenarios Implemented
Added test cases covering the three main discriminated union patterns:
Default serialization (
/envelope
) - Uses defaultkind
andvalue
envelope structure:Custom property names (
/custom-names
) - Uses custom discriminator and envelope properties:Inline discriminator (
/inline
) - Usesenvelope: "none"
to inject discriminator directly:Each scenario includes both GET and PUT operations with complete mockapi implementations.
Files Added
packages/http-specs/specs/type/union/discriminated/main.tsp
- TypeSpec definitions with 6 scenariospackages/http-specs/specs/type/union/discriminated/mockapi.ts
- Mock API implementationsspec-summary.md
with auto-generated documentationValidation
✅ All 56 scenarios (including new ones) pass validation
✅ TypeScript compilation successful
✅ Mock API validation passes
✅ No linting errors
✅ Documentation regenerated
The implementation follows existing spector patterns and provides comprehensive test coverage for discriminated unions as specified in the TypeSpec documentation.
Fixes #7601.
Warning
Firewall rules blocked me from connecting to one or more addresses
I tried to connect to the following addresses, but was blocked by firewall rules:
typespec.io
curl -s REDACTED
(dns block)If you need me to access, download, or install something from one of these locations, you can either:
💡 You can make Copilot smarter by setting up custom instructions, customizing its development environment and configuring Model Context Protocol (MCP) servers. Learn more Copilot coding agent tips in the docs.