@typespec/http-specs 0.1.0-alpha.9 → 0.1.0-dev.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (224) hide show
  1. package/CHANGELOG.md +241 -3
  2. package/README.md +11 -3
  3. package/dist/specs/authentication/noauth/union/mockapi.d.ts +3 -0
  4. package/dist/specs/authentication/noauth/union/mockapi.d.ts.map +1 -0
  5. package/dist/specs/authentication/noauth/union/mockapi.js +25 -0
  6. package/dist/specs/authentication/noauth/union/mockapi.js.map +1 -0
  7. package/dist/specs/documentation/mockapi.d.ts +3 -0
  8. package/dist/specs/documentation/mockapi.d.ts.map +1 -0
  9. package/dist/specs/documentation/mockapi.js +40 -0
  10. package/dist/specs/documentation/mockapi.js.map +1 -0
  11. package/dist/specs/encode/array/mockapi.d.ts +3 -0
  12. package/dist/specs/encode/array/mockapi.d.ts.map +1 -0
  13. package/dist/specs/encode/array/mockapi.js +33 -0
  14. package/dist/specs/encode/array/mockapi.js.map +1 -0
  15. package/dist/specs/encode/bytes/mockapi.js +16 -24
  16. package/dist/specs/encode/bytes/mockapi.js.map +1 -1
  17. package/dist/specs/encode/datetime/mockapi.js +2 -2
  18. package/dist/specs/encode/datetime/mockapi.js.map +1 -1
  19. package/dist/specs/encode/duration/mockapi.d.ts.map +1 -1
  20. package/dist/specs/encode/duration/mockapi.js +110 -3
  21. package/dist/specs/encode/duration/mockapi.js.map +1 -1
  22. package/dist/specs/encode/numeric/mockapi.js +2 -2
  23. package/dist/specs/encode/numeric/mockapi.js.map +1 -1
  24. package/dist/specs/helper.d.ts +2 -2
  25. package/dist/specs/helper.d.ts.map +1 -1
  26. package/dist/specs/parameters/basic/mockapi.d.ts.map +1 -1
  27. package/dist/specs/parameters/basic/mockapi.js +3 -3
  28. package/dist/specs/parameters/basic/mockapi.js.map +1 -1
  29. package/dist/specs/parameters/body-optionality/mockapi.d.ts.map +1 -1
  30. package/dist/specs/parameters/body-optionality/mockapi.js +14 -4
  31. package/dist/specs/parameters/body-optionality/mockapi.js.map +1 -1
  32. package/dist/specs/parameters/collection-format/mockapi.js +4 -15
  33. package/dist/specs/parameters/collection-format/mockapi.js.map +1 -1
  34. package/dist/specs/parameters/path/mockapi.d.ts +3 -0
  35. package/dist/specs/parameters/path/mockapi.d.ts.map +1 -0
  36. package/dist/specs/parameters/path/mockapi.js +29 -0
  37. package/dist/specs/parameters/path/mockapi.js.map +1 -0
  38. package/dist/specs/parameters/query/mockapi.d.ts +3 -0
  39. package/dist/specs/parameters/query/mockapi.d.ts.map +1 -0
  40. package/dist/specs/parameters/query/mockapi.js +14 -0
  41. package/dist/specs/parameters/query/mockapi.js.map +1 -0
  42. package/dist/specs/parameters/spread/mockapi.d.ts.map +1 -1
  43. package/dist/specs/parameters/spread/mockapi.js +19 -19
  44. package/dist/specs/parameters/spread/mockapi.js.map +1 -1
  45. package/dist/specs/payload/json-merge-patch/mockapi.js +4 -4
  46. package/dist/specs/payload/json-merge-patch/mockapi.js.map +1 -1
  47. package/dist/specs/payload/media-type/mockapi.js +2 -2
  48. package/dist/specs/payload/media-type/mockapi.js.map +1 -1
  49. package/dist/specs/payload/multipart/mockapi.d.ts.map +1 -1
  50. package/dist/specs/payload/multipart/mockapi.js +189 -60
  51. package/dist/specs/payload/multipart/mockapi.js.map +1 -1
  52. package/dist/specs/payload/pageable/mockapi.d.ts.map +1 -1
  53. package/dist/specs/payload/pageable/mockapi.js +594 -14
  54. package/dist/specs/payload/pageable/mockapi.js.map +1 -1
  55. package/dist/specs/payload/xml/mockapi.d.ts +3 -0
  56. package/dist/specs/payload/xml/mockapi.d.ts.map +1 -1
  57. package/dist/specs/payload/xml/mockapi.js +35 -5
  58. package/dist/specs/payload/xml/mockapi.js.map +1 -1
  59. package/dist/specs/response/status-code-range/mockapi.d.ts.map +1 -1
  60. package/dist/specs/response/status-code-range/mockapi.js +5 -9
  61. package/dist/specs/response/status-code-range/mockapi.js.map +1 -1
  62. package/dist/specs/routes/mockapi.js +16 -16
  63. package/dist/specs/routes/mockapi.js.map +1 -1
  64. package/dist/specs/serialization/encoded-name/json/mockapi.js +1 -1
  65. package/dist/specs/serialization/encoded-name/json/mockapi.js.map +1 -1
  66. package/dist/specs/server/versions/not-versioned/mockapi.js +1 -1
  67. package/dist/specs/server/versions/not-versioned/mockapi.js.map +1 -1
  68. package/dist/specs/server/versions/versioned/mockapi.js +8 -12
  69. package/dist/specs/server/versions/versioned/mockapi.js.map +1 -1
  70. package/dist/specs/special-words/mockapi.d.ts.map +1 -1
  71. package/dist/specs/special-words/mockapi.js +59 -6
  72. package/dist/specs/special-words/mockapi.js.map +1 -1
  73. package/dist/specs/streaming/jsonl/mockapi.d.ts +3 -0
  74. package/dist/specs/streaming/jsonl/mockapi.d.ts.map +1 -0
  75. package/dist/specs/streaming/jsonl/mockapi.js +30 -0
  76. package/dist/specs/streaming/jsonl/mockapi.js.map +1 -0
  77. package/dist/specs/type/array/mockapi.js +1 -1
  78. package/dist/specs/type/array/mockapi.js.map +1 -1
  79. package/dist/specs/type/dictionary/mockapi.js +1 -1
  80. package/dist/specs/type/dictionary/mockapi.js.map +1 -1
  81. package/dist/specs/type/enum/extensible/mockapi.js +1 -1
  82. package/dist/specs/type/enum/extensible/mockapi.js.map +1 -1
  83. package/dist/specs/type/enum/fixed/mockapi.js +2 -2
  84. package/dist/specs/type/enum/fixed/mockapi.js.map +1 -1
  85. package/dist/specs/type/file/mockapi.d.ts +3 -0
  86. package/dist/specs/type/file/mockapi.d.ts.map +1 -0
  87. package/dist/specs/type/file/mockapi.js +187 -0
  88. package/dist/specs/type/file/mockapi.js.map +1 -0
  89. package/dist/specs/type/model/empty/mockapi.js +2 -2
  90. package/dist/specs/type/model/empty/mockapi.js.map +1 -1
  91. package/dist/specs/type/model/inheritance/enum-discriminator/mockapi.js +1 -1
  92. package/dist/specs/type/model/inheritance/enum-discriminator/mockapi.js.map +1 -1
  93. package/dist/specs/type/model/inheritance/nested-discriminator/mockapi.js +2 -2
  94. package/dist/specs/type/model/inheritance/nested-discriminator/mockapi.js.map +1 -1
  95. package/dist/specs/type/model/inheritance/not-discriminated/mockapi.js +2 -2
  96. package/dist/specs/type/model/inheritance/not-discriminated/mockapi.js.map +1 -1
  97. package/dist/specs/type/model/inheritance/recursive/mockapi.js +1 -1
  98. package/dist/specs/type/model/inheritance/recursive/mockapi.js.map +1 -1
  99. package/dist/specs/type/model/inheritance/single-discriminator/mockapi.js +2 -2
  100. package/dist/specs/type/model/inheritance/single-discriminator/mockapi.js.map +1 -1
  101. package/dist/specs/type/model/usage/mockapi.js +4 -4
  102. package/dist/specs/type/model/usage/mockapi.js.map +1 -1
  103. package/dist/specs/type/model/visibility/mockapi.js +9 -10
  104. package/dist/specs/type/model/visibility/mockapi.js.map +1 -1
  105. package/dist/specs/type/property/additional-properties/mockapi.js +9 -6
  106. package/dist/specs/type/property/additional-properties/mockapi.js.map +1 -1
  107. package/dist/specs/type/property/nullable/mockapi.js +2 -6
  108. package/dist/specs/type/property/nullable/mockapi.js.map +1 -1
  109. package/dist/specs/type/property/optionality/mockapi.js +1 -1
  110. package/dist/specs/type/property/optionality/mockapi.js.map +1 -1
  111. package/dist/specs/type/property/value-types/mockapi.js +3 -3
  112. package/dist/specs/type/property/value-types/mockapi.js.map +1 -1
  113. package/dist/specs/type/scalar/mockapi.js +9 -9
  114. package/dist/specs/type/scalar/mockapi.js.map +1 -1
  115. package/dist/specs/type/union/discriminated/mockapi.d.ts +3 -0
  116. package/dist/specs/type/union/discriminated/mockapi.d.ts.map +1 -0
  117. package/dist/specs/type/union/discriminated/mockapi.js +212 -0
  118. package/dist/specs/type/union/discriminated/mockapi.js.map +1 -0
  119. package/dist/specs/type/union/mockapi.js +2 -2
  120. package/dist/specs/type/union/mockapi.js.map +1 -1
  121. package/dist/specs/versioning/added/mockapi.js +6 -6
  122. package/dist/specs/versioning/added/mockapi.js.map +1 -1
  123. package/dist/specs/versioning/madeOptional/mockapi.js +2 -2
  124. package/dist/specs/versioning/madeOptional/mockapi.js.map +1 -1
  125. package/dist/specs/versioning/removed/mockapi.js +11 -11
  126. package/dist/specs/versioning/removed/mockapi.js.map +1 -1
  127. package/dist/specs/versioning/renamedFrom/mockapi.js +5 -5
  128. package/dist/specs/versioning/renamedFrom/mockapi.js.map +1 -1
  129. package/dist/specs/versioning/returnTypeChangedFrom/mockapi.js +1 -1
  130. package/dist/specs/versioning/returnTypeChangedFrom/mockapi.js.map +1 -1
  131. package/dist/specs/versioning/typeChangedFrom/mockapi.js +3 -3
  132. package/dist/specs/versioning/typeChangedFrom/mockapi.js.map +1 -1
  133. package/manifest.json +11200 -0
  134. package/package.json +30 -19
  135. package/smoke/petstore/main.tsp +96 -0
  136. package/smoke/todoapp/main.tsp +293 -0
  137. package/spec-summary.md +1745 -121
  138. package/specs/authentication/noauth/union/main.tsp +30 -0
  139. package/specs/authentication/noauth/union/mockapi.ts +27 -0
  140. package/specs/documentation/main.tsp +158 -0
  141. package/specs/documentation/mockapi.ts +59 -0
  142. package/specs/encode/array/main.tsp +339 -0
  143. package/specs/encode/array/mockapi.ts +83 -0
  144. package/specs/encode/bytes/main.tsp +29 -20
  145. package/specs/encode/bytes/mockapi.ts +13 -31
  146. package/specs/encode/datetime/main.tsp +2 -7
  147. package/specs/encode/datetime/mockapi.ts +2 -2
  148. package/specs/encode/duration/main.tsp +420 -7
  149. package/specs/encode/duration/mockapi.ts +216 -2
  150. package/specs/encode/numeric/mockapi.ts +2 -2
  151. package/specs/parameters/basic/mockapi.ts +3 -3
  152. package/specs/parameters/body-optionality/main.tsp +2 -0
  153. package/specs/parameters/body-optionality/mockapi.ts +24 -4
  154. package/specs/parameters/collection-format/main.tsp +5 -25
  155. package/specs/parameters/collection-format/mockapi.ts +4 -16
  156. package/specs/parameters/path/main.tsp +48 -0
  157. package/specs/parameters/path/mockapi.ts +34 -0
  158. package/specs/parameters/query/main.tsp +22 -0
  159. package/specs/parameters/query/mockapi.ts +15 -0
  160. package/specs/parameters/spread/mockapi.ts +19 -19
  161. package/specs/payload/json-merge-patch/main.tsp +2 -2
  162. package/specs/payload/json-merge-patch/mockapi.ts +4 -4
  163. package/specs/payload/media-type/mockapi.ts +2 -2
  164. package/specs/payload/multipart/main.tsp +230 -32
  165. package/specs/payload/multipart/mockapi.ts +200 -59
  166. package/specs/payload/pageable/main.tsp +601 -0
  167. package/specs/payload/pageable/mockapi.ts +656 -14
  168. package/specs/payload/xml/main.tsp +89 -0
  169. package/specs/payload/xml/mockapi.ts +44 -5
  170. package/specs/response/status-code-range/main.tsp +2 -2
  171. package/specs/response/status-code-range/mockapi.ts +5 -9
  172. package/specs/routes/main.tsp +29 -29
  173. package/specs/routes/mockapi.ts +16 -16
  174. package/specs/serialization/encoded-name/json/main.tsp +1 -1
  175. package/specs/serialization/encoded-name/json/mockapi.ts +1 -1
  176. package/specs/server/endpoint/not-defined/main.tsp +1 -3
  177. package/specs/server/path/multiple/main.tsp +3 -5
  178. package/specs/server/versions/not-versioned/mockapi.ts +1 -1
  179. package/specs/server/versions/versioned/main.tsp +1 -1
  180. package/specs/server/versions/versioned/mockapi.ts +6 -12
  181. package/specs/special-headers/conditional-request/main.tsp +1 -1
  182. package/specs/special-headers/repeatability/main.tsp +2 -2
  183. package/specs/special-words/main.tsp +118 -6
  184. package/specs/special-words/mockapi.ts +62 -6
  185. package/specs/streaming/jsonl/main.tsp +33 -0
  186. package/specs/streaming/jsonl/mockapi.ts +32 -0
  187. package/specs/type/array/mockapi.ts +1 -1
  188. package/specs/type/dictionary/mockapi.ts +1 -1
  189. package/specs/type/enum/extensible/main.tsp +18 -2
  190. package/specs/type/enum/extensible/mockapi.ts +1 -1
  191. package/specs/type/enum/fixed/main.tsp +15 -3
  192. package/specs/type/enum/fixed/mockapi.ts +2 -2
  193. package/specs/type/file/main.tsp +109 -0
  194. package/specs/type/file/mockapi.ts +200 -0
  195. package/specs/type/model/empty/mockapi.ts +2 -2
  196. package/specs/type/model/inheritance/enum-discriminator/mockapi.ts +1 -1
  197. package/specs/type/model/inheritance/nested-discriminator/mockapi.ts +2 -2
  198. package/specs/type/model/inheritance/not-discriminated/mockapi.ts +2 -2
  199. package/specs/type/model/inheritance/recursive/mockapi.ts +1 -1
  200. package/specs/type/model/inheritance/single-discriminator/mockapi.ts +2 -2
  201. package/specs/type/model/usage/mockapi.ts +4 -4
  202. package/specs/type/model/visibility/main.tsp +9 -17
  203. package/specs/type/model/visibility/mockapi.ts +9 -10
  204. package/specs/type/property/additional-properties/main.tsp +17 -17
  205. package/specs/type/property/additional-properties/mockapi.ts +10 -10
  206. package/specs/type/property/nullable/mockapi.ts +7 -8
  207. package/specs/type/property/optionality/mockapi.ts +1 -1
  208. package/specs/type/property/value-types/mockapi.ts +3 -3
  209. package/specs/type/scalar/main.tsp +58 -9
  210. package/specs/type/scalar/mockapi.ts +9 -9
  211. package/specs/type/union/discriminated/main.tsp +251 -0
  212. package/specs/type/union/discriminated/mockapi.ts +230 -0
  213. package/specs/type/union/mockapi.ts +2 -2
  214. package/specs/versioning/added/mockapi.ts +6 -6
  215. package/specs/versioning/madeOptional/mockapi.ts +2 -2
  216. package/specs/versioning/removed/main.tsp +5 -5
  217. package/specs/versioning/removed/mockapi.ts +11 -11
  218. package/specs/versioning/renamedFrom/mockapi.ts +5 -5
  219. package/specs/versioning/returnTypeChangedFrom/main.tsp +17 -2
  220. package/specs/versioning/returnTypeChangedFrom/mockapi.ts +1 -1
  221. package/specs/versioning/typeChangedFrom/mockapi.ts +3 -3
  222. package/temp/.tsbuildinfo +1 -1
  223. package/tsconfig.build.json +0 -4
  224. package/tspconfig.yaml +0 -2
@@ -14,14 +14,25 @@ interface String {
14
14
  @scenarioDoc("Expect to handle a string value. Mock api will return 'test'")
15
15
  @get
16
16
  @doc("get string value")
17
- get(): string;
17
+ get(): {
18
+ @header
19
+ contentType: "application/json";
20
+
21
+ @body
22
+ body: string;
23
+ };
18
24
 
19
25
  #suppress "@azure-tools/typespec-azure-core/use-standard-operations" "For testing"
20
26
  @scenario
21
27
  @scenarioDoc("Expect to send a string value. Mock api expect to receive 'test'")
22
28
  @put
23
29
  @doc("put string value")
24
- put(@body @doc("_") body: string): void;
30
+ put(
31
+ @header
32
+ contentType: "application/json",
33
+
34
+ @body @doc("_") body: string,
35
+ ): void;
25
36
  }
26
37
 
27
38
  @route("/boolean")
@@ -31,14 +42,25 @@ interface Boolean {
31
42
  @scenarioDoc("Expect to handle a boolean value. Mock api will return true ")
32
43
  @get
33
44
  @doc("get boolean value")
34
- get(): boolean;
45
+ get(): {
46
+ @header
47
+ contentType: "application/json";
48
+
49
+ @body
50
+ body: boolean;
51
+ };
35
52
 
36
53
  #suppress "@azure-tools/typespec-azure-core/use-standard-operations" "For testing"
37
54
  @scenario
38
55
  @scenarioDoc("Expect to send a boolean value. Mock api expect to receive 'true'")
39
56
  @put
40
57
  @doc("put boolean value")
41
- put(@body @doc("_") body: boolean): void;
58
+ put(
59
+ @header
60
+ contentType: "application/json",
61
+
62
+ @body @doc("_") body: boolean,
63
+ ): void;
42
64
  }
43
65
 
44
66
  @route("/unknown")
@@ -48,14 +70,25 @@ interface Unknown {
48
70
  @scenarioDoc("Expect to handle a unknown type value. Mock api will return 'test'")
49
71
  @get
50
72
  @doc("get unknown value")
51
- get(): unknown;
73
+ get(): {
74
+ @header
75
+ contentType: "application/json";
76
+
77
+ @body
78
+ body: unknown;
79
+ };
52
80
 
53
81
  #suppress "@azure-tools/typespec-azure-core/use-standard-operations" "For testing"
54
82
  @scenario
55
83
  @scenarioDoc("Expect to send a string value. Mock api expect to receive 'test'")
56
84
  @put
57
85
  @doc("put unknown value")
58
- put(@body @doc("_") body: unknown): void;
86
+ put(
87
+ @header
88
+ contentType: "application/json",
89
+
90
+ @body @doc("_") body: unknown,
91
+ ): void;
59
92
  }
60
93
 
61
94
  @doc("Template to have scalar types operations")
@@ -69,7 +102,13 @@ interface ScalarTypesOperations<T, TDoc extends valueof string> {
69
102
  """)
70
103
  @get
71
104
  @route("/response_body")
72
- responseBody(): T;
105
+ responseBody(): {
106
+ @header
107
+ contentType: "application/json";
108
+
109
+ @body
110
+ body: T;
111
+ };
73
112
 
74
113
  @scenario
75
114
  @scenarioDoc("""
@@ -80,7 +119,12 @@ interface ScalarTypesOperations<T, TDoc extends valueof string> {
80
119
  """)
81
120
  @put
82
121
  @route("/resquest_body")
83
- requestBody(@body body: T): void;
122
+ requestBody(
123
+ @header
124
+ contentType: "application/json",
125
+
126
+ @body body: T,
127
+ ): void;
84
128
 
85
129
  @scenario
86
130
  @scenarioDoc("""
@@ -124,7 +168,12 @@ interface NumberTypesVerifyOperations<
124
168
  """)
125
169
  @post
126
170
  @route("/verify")
127
- verify(@body body: T): void;
171
+ verify(
172
+ @header
173
+ contentType: "application/json",
174
+
175
+ @body body: T,
176
+ ): void;
128
177
  }
129
178
 
130
179
  @doc("Decimal type verification")
@@ -17,7 +17,7 @@ Scenarios.Type_Scalar_String_put = passOnSuccess({
17
17
  uri: "/type/scalar/string",
18
18
  method: `put`,
19
19
  request: {
20
- body: "test",
20
+ body: json("test"),
21
21
  headers: {
22
22
  "Content-Type": "text/plain",
23
23
  },
@@ -43,7 +43,7 @@ Scenarios.Type_Scalar_Boolean_put = passOnSuccess({
43
43
  uri: "/type/scalar/boolean",
44
44
  method: `put`,
45
45
  request: {
46
- body: true,
46
+ body: json(true),
47
47
  headers: {
48
48
  "Content-Type": "application/json; charset=utf-8",
49
49
  },
@@ -68,7 +68,7 @@ Scenarios.Type_Scalar_Unknown_put = passOnSuccess({
68
68
  uri: "/type/scalar/unknown",
69
69
  method: `put`,
70
70
  request: {
71
- body: "test",
71
+ body: json("test"),
72
72
  headers: {
73
73
  "Content-Type": "text/plain",
74
74
  },
@@ -103,7 +103,7 @@ Scenarios.Type_Scalar_DecimalType_requestBody = passOnSuccess({
103
103
  uri: "/type/scalar/decimal/resquest_body",
104
104
  method: `put`,
105
105
  request: {
106
- body: 0.33333,
106
+ body: json(0.33333),
107
107
  headers: {
108
108
  "Content-Type": "application/json; charset=utf-8",
109
109
  },
@@ -117,7 +117,7 @@ Scenarios.Type_Scalar_Decimal128Type_requestBody = passOnSuccess({
117
117
  uri: "/type/scalar/decimal128/resquest_body",
118
118
  method: `put`,
119
119
  request: {
120
- body: 0.33333,
120
+ body: json(0.33333),
121
121
  headers: {
122
122
  "Content-Type": "application/json; charset=utf-8",
123
123
  },
@@ -131,7 +131,7 @@ Scenarios.Type_Scalar_DecimalType_requestParameter = passOnSuccess({
131
131
  uri: "/type/scalar/decimal/request_parameter",
132
132
  method: `get`,
133
133
  request: {
134
- params: { value: "0.33333" },
134
+ query: { value: "0.33333" },
135
135
  },
136
136
  response: {
137
137
  status: 204,
@@ -142,7 +142,7 @@ Scenarios.Type_Scalar_Decimal128Type_requestParameter = passOnSuccess({
142
142
  uri: "/type/scalar/decimal128/request_parameter",
143
143
  method: `get`,
144
144
  request: {
145
- params: { value: "0.33333" },
145
+ query: { value: "0.33333" },
146
146
  },
147
147
  response: {
148
148
  status: 204,
@@ -173,7 +173,7 @@ Scenarios.Type_Scalar_DecimalVerify_verify = passOnSuccess({
173
173
  uri: "/type/scalar/decimal/verify",
174
174
  method: `post`,
175
175
  request: {
176
- body: 0.3,
176
+ body: json(0.3),
177
177
  headers: {
178
178
  "Content-Type": "application/json; charset=utf-8",
179
179
  },
@@ -187,7 +187,7 @@ Scenarios.Type_Scalar_Decimal128Verify_verify = passOnSuccess({
187
187
  uri: "/type/scalar/decimal128/verify",
188
188
  method: `post`,
189
189
  request: {
190
- body: 0.3,
190
+ body: json(0.3),
191
191
  headers: {
192
192
  "Content-Type": "application/json; charset=utf-8",
193
193
  },
@@ -0,0 +1,251 @@
1
+ import "@typespec/http";
2
+ import "@typespec/spector";
3
+
4
+ using Http;
5
+ using Spector;
6
+
7
+ /**
8
+ * Describe scenarios for discriminated unions.
9
+ */
10
+ @scenarioService("/type/union/discriminated")
11
+ namespace Type.Union.Discriminated;
12
+
13
+ // Models for discriminated unions
14
+ model Cat {
15
+ name: string;
16
+ meow: boolean;
17
+ }
18
+
19
+ model Dog {
20
+ name: string;
21
+ bark: boolean;
22
+ }
23
+
24
+ /**
25
+ * Test discriminated union with default envelope serialization.
26
+ * The discriminated union should serialize with "kind" as discriminator
27
+ * and "value" as envelope property.
28
+ */
29
+ @discriminated
30
+ union PetWithEnvelope {
31
+ cat: Cat,
32
+ dog: Dog,
33
+ }
34
+
35
+ @route("/envelope")
36
+ namespace Envelope {
37
+ @route("/object")
38
+ namespace Object {
39
+ @route("/default")
40
+ interface Default {
41
+ @scenario
42
+ @scenarioDoc("""
43
+ Test discriminated union with envelope serialization.
44
+ When value of query parameter "kind" is "cat" or no query parameter input, the expected response is:
45
+ ```json
46
+ {
47
+ "kind": "cat",
48
+ "value": {
49
+ "name": "Whiskers",
50
+ "meow": true
51
+ }
52
+ }
53
+ ```
54
+ When it is "dog", expected response is:
55
+ ```json
56
+ {
57
+ "kind": "dog",
58
+ "value": {
59
+ "name": "Rex",
60
+ "bark": false
61
+ }
62
+ }
63
+ ```
64
+ """)
65
+ @get
66
+ get(@query kind?: string): PetWithEnvelope;
67
+
68
+ @scenario
69
+ @scenarioDoc("""
70
+ Test discriminated union with envelope serialization.
71
+ Send the union as:
72
+ ```json
73
+ {
74
+ "kind": "cat",
75
+ "value": {
76
+ "name": "Whiskers",
77
+ "meow": true
78
+ }
79
+ }
80
+ ```
81
+ """)
82
+ @put
83
+ put(@body input: PetWithEnvelope): PetWithEnvelope;
84
+ }
85
+
86
+ @route("/custom-properties")
87
+ interface CustomProperties {
88
+ @scenario
89
+ @scenarioDoc("""
90
+ Test discriminated union with custom property names.
91
+ When value of query parameter "petType" is "cat" or no query parameter input, the expected response is:
92
+ ```json
93
+ {
94
+ "petType": "cat",
95
+ "petData": {
96
+ "name": "Whiskers",
97
+ "meow": true
98
+ }
99
+ }
100
+ ```
101
+ When it is "dog", expected response is:
102
+ ```json
103
+ {
104
+ "petType": "dog",
105
+ "petData": {
106
+ "name": "Rex",
107
+ "bark": false
108
+ }
109
+ }
110
+ ```
111
+ """)
112
+ @get
113
+ get(@query petType?: string): PetWithCustomNames;
114
+
115
+ @scenario
116
+ @scenarioDoc("""
117
+ Test discriminated union with custom property names.
118
+ Send the union as:
119
+ ```json
120
+ {
121
+ "petType": "cat",
122
+ "petData": {
123
+ "name": "Whiskers",
124
+ "meow": true
125
+ }
126
+ }
127
+ ```
128
+ """)
129
+ @put
130
+ put(@body input: PetWithCustomNames): PetWithCustomNames;
131
+ }
132
+ }
133
+ }
134
+
135
+ /**
136
+ * Test discriminated union with custom property names.
137
+ * The discriminated union should serialize with custom discriminator
138
+ * and envelope property names.
139
+ */
140
+ @discriminated(#{ discriminatorPropertyName: "petType", envelopePropertyName: "petData" })
141
+ union PetWithCustomNames {
142
+ cat: Cat,
143
+ dog: Dog,
144
+ }
145
+
146
+ /**
147
+ * Test discriminated union with inline discriminator (no envelope).
148
+ * The discriminated union should serialize with discriminator property
149
+ * injected directly into the variant object.
150
+ */
151
+ @discriminated(#{ envelope: "none" })
152
+ union PetInline {
153
+ cat: Cat,
154
+ dog: Dog,
155
+ }
156
+
157
+ /**
158
+ * Test discriminated union with inline discriminator and custom discriminator property name.
159
+ * The discriminated union should serialize with custom discriminator property
160
+ * injected directly into the variant object.
161
+ */
162
+ @discriminated(#{ envelope: "none", discriminatorPropertyName: "type" })
163
+ union PetInlineWithCustomDiscriminator {
164
+ cat: Cat,
165
+ dog: Dog,
166
+ }
167
+
168
+ @route("/no-envelope")
169
+ namespace NoEnvelope {
170
+ @route("/default")
171
+ interface Default {
172
+ @scenario
173
+ @scenarioDoc("""
174
+ Test discriminated union with inline discriminator.
175
+ When value of query parameter "kind" is "cat" or no query parameter input, the expected response is:
176
+ ```json
177
+ {
178
+ "kind": "cat",
179
+ "name": "Whiskers",
180
+ "meow": true
181
+ }
182
+ ```
183
+ When it is "dog", expected response is:
184
+ ```json
185
+ {
186
+ "kind": "dog",
187
+ "name": "Rex",
188
+ "bark": false
189
+ }
190
+ ```
191
+ """)
192
+ @get
193
+ get(@query kind?: string): PetInline;
194
+
195
+ @scenario
196
+ @scenarioDoc("""
197
+ Test discriminated union with inline discriminator.
198
+ Send the union as:
199
+ ```json
200
+ {
201
+ "kind": "cat",
202
+ "name": "Whiskers",
203
+ "meow": true
204
+ }
205
+ ```
206
+ """)
207
+ @put
208
+ put(@body input: PetInline): PetInline;
209
+ }
210
+
211
+ @route("/custom-discriminator")
212
+ interface CustomDiscriminator {
213
+ @scenario
214
+ @scenarioDoc("""
215
+ Test discriminated union with inline discriminator and custom discriminator property name.
216
+ When value of query parameter "type" is "cat" or no query parameter input, the expected response is:
217
+ ```json
218
+ {
219
+ "type": "cat",
220
+ "name": "Whiskers",
221
+ "meow": true
222
+ }
223
+ ```
224
+ When it is "dog", expected response is:
225
+ ```json
226
+ {
227
+ "type": "dog",
228
+ "name": "Rex",
229
+ "bark": false
230
+ }
231
+ ```
232
+ """)
233
+ @get
234
+ get(@query type?: string): PetInlineWithCustomDiscriminator;
235
+
236
+ @scenario
237
+ @scenarioDoc("""
238
+ Test discriminated union with inline discriminator and custom discriminator property name.
239
+ Send the union as:
240
+ ```json
241
+ {
242
+ "type": "cat",
243
+ "name": "Whiskers",
244
+ "meow": true
245
+ }
246
+ ```
247
+ """)
248
+ @put
249
+ put(@body input: PetInlineWithCustomDiscriminator): PetInlineWithCustomDiscriminator;
250
+ }
251
+ }
@@ -0,0 +1,230 @@
1
+ import { json, MockRequest, passOnSuccess, ScenarioMockApi } from "@typespec/spec-api";
2
+
3
+ export const Scenarios: Record<string, ScenarioMockApi> = {};
4
+
5
+ // Test data for discriminated union scenarios
6
+ const catData = {
7
+ name: "Whiskers",
8
+ meow: true,
9
+ };
10
+
11
+ const dogData = {
12
+ name: "Rex",
13
+ bark: false,
14
+ };
15
+
16
+ // Envelope discriminated union (default serialization)
17
+ const envelopeCatBody = {
18
+ kind: "cat",
19
+ value: catData,
20
+ };
21
+
22
+ const envelopeDogBody = {
23
+ kind: "dog",
24
+ value: dogData,
25
+ };
26
+
27
+ Scenarios.Type_Union_Discriminated_Envelope_Object_Default_get = passOnSuccess({
28
+ uri: "/type/union/discriminated/envelope/object/default",
29
+ method: "get",
30
+ request: {},
31
+ response: {
32
+ status: 200,
33
+ body: json(envelopeCatBody),
34
+ },
35
+ handler: (req: MockRequest) => {
36
+ const kind = req.query.kind as string | undefined;
37
+
38
+ // When kind is null or "cat", return response for "cat"
39
+ // When kind is "dog", return response for "dog"
40
+ if (kind === "dog") {
41
+ return {
42
+ status: 200,
43
+ body: json(envelopeDogBody),
44
+ };
45
+ } else {
46
+ // Default case: when kind is null, undefined, or "cat"
47
+ return {
48
+ status: 200,
49
+ body: json(envelopeCatBody),
50
+ };
51
+ }
52
+ },
53
+ kind: "MockApiDefinition",
54
+ });
55
+
56
+ Scenarios.Type_Union_Discriminated_Envelope_Object_Default_put = passOnSuccess({
57
+ uri: "/type/union/discriminated/envelope/object/default",
58
+ method: "put",
59
+ request: {
60
+ body: json(envelopeCatBody),
61
+ },
62
+ response: {
63
+ status: 200,
64
+ body: json(envelopeCatBody),
65
+ },
66
+ kind: "MockApiDefinition",
67
+ });
68
+
69
+ // Custom names discriminated union
70
+ const customNamesCatBody = {
71
+ petType: "cat",
72
+ petData: catData,
73
+ };
74
+
75
+ const customNamesDogBody = {
76
+ petType: "dog",
77
+ petData: dogData,
78
+ };
79
+
80
+ Scenarios.Type_Union_Discriminated_Envelope_Object_CustomProperties_get = passOnSuccess({
81
+ uri: "/type/union/discriminated/envelope/object/custom-properties",
82
+ method: "get",
83
+ request: {},
84
+ response: {
85
+ status: 200,
86
+ body: json(customNamesCatBody),
87
+ },
88
+ handler: (req: MockRequest) => {
89
+ const petType = req.query.petType as string | undefined;
90
+
91
+ // When petType is null or "cat", return response for "cat"
92
+ // When petType is "dog", return response for "dog"
93
+ if (petType === "dog") {
94
+ return {
95
+ status: 200,
96
+ body: json(customNamesDogBody),
97
+ };
98
+ } else {
99
+ // Default case: when petType is null, undefined, or "cat"
100
+ return {
101
+ status: 200,
102
+ body: json(customNamesCatBody),
103
+ };
104
+ }
105
+ },
106
+ kind: "MockApiDefinition",
107
+ });
108
+
109
+ Scenarios.Type_Union_Discriminated_Envelope_Object_CustomProperties_put = passOnSuccess({
110
+ uri: "/type/union/discriminated/envelope/object/custom-properties",
111
+ method: "put",
112
+ request: {
113
+ body: json(customNamesCatBody),
114
+ },
115
+ response: {
116
+ status: 200,
117
+ body: json(customNamesCatBody),
118
+ },
119
+ kind: "MockApiDefinition",
120
+ });
121
+
122
+ // Inline discriminated union (no envelope)
123
+ const inlineCatBody = {
124
+ kind: "cat",
125
+ name: "Whiskers",
126
+ meow: true,
127
+ };
128
+
129
+ const inlineDogBody = {
130
+ kind: "dog",
131
+ name: "Rex",
132
+ bark: false,
133
+ };
134
+
135
+ Scenarios.Type_Union_Discriminated_NoEnvelope_Default_get = passOnSuccess({
136
+ uri: "/type/union/discriminated/no-envelope/default",
137
+ method: "get",
138
+ request: {},
139
+ response: {
140
+ status: 200,
141
+ body: json(inlineCatBody),
142
+ },
143
+ handler: (req: MockRequest) => {
144
+ const kind = req.query.kind as string | undefined;
145
+
146
+ // When kind is null or "cat", return response for "cat"
147
+ // When kind is "dog", return response for "dog"
148
+ if (kind === "dog") {
149
+ return {
150
+ status: 200,
151
+ body: json(inlineDogBody),
152
+ };
153
+ } else {
154
+ // Default case: when kind is null, undefined, or "cat"
155
+ return {
156
+ status: 200,
157
+ body: json(inlineCatBody),
158
+ };
159
+ }
160
+ },
161
+ kind: "MockApiDefinition",
162
+ });
163
+
164
+ Scenarios.Type_Union_Discriminated_NoEnvelope_Default_put = passOnSuccess({
165
+ uri: "/type/union/discriminated/no-envelope/default",
166
+ method: "put",
167
+ request: {
168
+ body: json(inlineCatBody),
169
+ },
170
+ response: {
171
+ status: 200,
172
+ body: json(inlineCatBody),
173
+ },
174
+ kind: "MockApiDefinition",
175
+ });
176
+
177
+ // Inline discriminated union with custom discriminator property name
178
+ const inlineCustomCatBody = {
179
+ type: "cat",
180
+ name: "Whiskers",
181
+ meow: true,
182
+ };
183
+
184
+ const inlineCustomDogBody = {
185
+ type: "dog",
186
+ name: "Rex",
187
+ bark: false,
188
+ };
189
+
190
+ Scenarios.Type_Union_Discriminated_NoEnvelope_CustomDiscriminator_get = passOnSuccess({
191
+ uri: "/type/union/discriminated/no-envelope/custom-discriminator",
192
+ method: "get",
193
+ request: {},
194
+ response: {
195
+ status: 200,
196
+ body: json(inlineCustomCatBody),
197
+ },
198
+ handler: (req: MockRequest) => {
199
+ const type = req.query.type as string | undefined;
200
+
201
+ // When type is null or "cat", return response for "cat"
202
+ // When type is "dog", return response for "dog"
203
+ if (type === "dog") {
204
+ return {
205
+ status: 200,
206
+ body: json(inlineCustomDogBody),
207
+ };
208
+ } else {
209
+ // Default case: when type is null, undefined, or "cat"
210
+ return {
211
+ status: 200,
212
+ body: json(inlineCustomCatBody),
213
+ };
214
+ }
215
+ },
216
+ kind: "MockApiDefinition",
217
+ });
218
+
219
+ Scenarios.Type_Union_Discriminated_NoEnvelope_CustomDiscriminator_put = passOnSuccess({
220
+ uri: "/type/union/discriminated/no-envelope/custom-discriminator",
221
+ method: "put",
222
+ request: {
223
+ body: json(inlineCustomCatBody),
224
+ },
225
+ response: {
226
+ status: 200,
227
+ body: json(inlineCustomCatBody),
228
+ },
229
+ kind: "MockApiDefinition",
230
+ });
@@ -20,9 +20,9 @@ function createPostServerTests(url: string, value: unknown) {
20
20
  uri: url,
21
21
  method: `post`,
22
22
  request: {
23
- body: {
23
+ body: json({
24
24
  prop: value,
25
- },
25
+ }),
26
26
  },
27
27
  response: {
28
28
  status: 204,