@typespec/http-specs 0.1.0-alpha.3-dev.6 → 0.1.0-alpha.30-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 (206) hide show
  1. package/CHANGELOG.md +238 -0
  2. package/README.md +11 -3
  3. package/dist/specs/documentation/mockapi.d.ts.map +1 -0
  4. package/dist/specs/documentation/mockapi.js +38 -0
  5. package/dist/specs/documentation/mockapi.js.map +1 -0
  6. package/dist/specs/encode/array/mockapi.d.ts +3 -0
  7. package/dist/specs/encode/array/mockapi.d.ts.map +1 -0
  8. package/dist/specs/encode/array/mockapi.js +25 -0
  9. package/dist/specs/encode/array/mockapi.js.map +1 -0
  10. package/dist/specs/encode/bytes/mockapi.js +16 -24
  11. package/dist/specs/encode/bytes/mockapi.js.map +1 -1
  12. package/dist/specs/encode/datetime/mockapi.js +2 -2
  13. package/dist/specs/encode/datetime/mockapi.js.map +1 -1
  14. package/dist/specs/encode/duration/mockapi.js +74 -2
  15. package/dist/specs/encode/duration/mockapi.js.map +1 -1
  16. package/dist/specs/encode/numeric/mockapi.js +2 -2
  17. package/dist/specs/encode/numeric/mockapi.js.map +1 -1
  18. package/dist/specs/helper.d.ts +2 -2
  19. package/dist/specs/helper.d.ts.map +1 -1
  20. package/dist/specs/parameters/basic/mockapi.d.ts.map +1 -1
  21. package/dist/specs/parameters/basic/mockapi.js +3 -3
  22. package/dist/specs/parameters/basic/mockapi.js.map +1 -1
  23. package/dist/specs/parameters/body-optionality/mockapi.d.ts.map +1 -1
  24. package/dist/specs/parameters/body-optionality/mockapi.js +14 -4
  25. package/dist/specs/parameters/body-optionality/mockapi.js.map +1 -1
  26. package/dist/specs/parameters/collection-format/mockapi.js +4 -15
  27. package/dist/specs/parameters/collection-format/mockapi.js.map +1 -1
  28. package/dist/specs/parameters/path/mockapi.d.ts +3 -0
  29. package/dist/specs/parameters/path/mockapi.d.ts.map +1 -0
  30. package/dist/specs/parameters/path/mockapi.js +29 -0
  31. package/dist/specs/parameters/path/mockapi.js.map +1 -0
  32. package/dist/specs/parameters/spread/mockapi.d.ts.map +1 -1
  33. package/dist/specs/parameters/spread/mockapi.js +19 -19
  34. package/dist/specs/parameters/spread/mockapi.js.map +1 -1
  35. package/dist/specs/payload/json-merge-patch/mockapi.js +4 -4
  36. package/dist/specs/payload/json-merge-patch/mockapi.js.map +1 -1
  37. package/dist/specs/payload/media-type/mockapi.js +2 -2
  38. package/dist/specs/payload/media-type/mockapi.js.map +1 -1
  39. package/dist/specs/payload/multipart/mockapi.d.ts.map +1 -1
  40. package/dist/specs/payload/multipart/mockapi.js +42 -60
  41. package/dist/specs/payload/multipart/mockapi.js.map +1 -1
  42. package/dist/specs/payload/pageable/mockapi.d.ts.map +1 -1
  43. package/dist/specs/payload/pageable/mockapi.js +425 -18
  44. package/dist/specs/payload/pageable/mockapi.js.map +1 -1
  45. package/dist/specs/payload/xml/mockapi.js +1 -4
  46. package/dist/specs/payload/xml/mockapi.js.map +1 -1
  47. package/dist/specs/response/status-code-range/mockapi.d.ts +3 -0
  48. package/dist/specs/response/status-code-range/mockapi.d.ts.map +1 -0
  49. package/dist/specs/response/status-code-range/mockapi.js +29 -0
  50. package/dist/specs/response/status-code-range/mockapi.js.map +1 -0
  51. package/dist/specs/routes/mockapi.js +25 -25
  52. package/dist/specs/routes/mockapi.js.map +1 -1
  53. package/dist/specs/serialization/encoded-name/json/mockapi.js +1 -1
  54. package/dist/specs/serialization/encoded-name/json/mockapi.js.map +1 -1
  55. package/dist/specs/server/versions/not-versioned/mockapi.js +1 -1
  56. package/dist/specs/server/versions/not-versioned/mockapi.js.map +1 -1
  57. package/dist/specs/server/versions/versioned/mockapi.js +8 -12
  58. package/dist/specs/server/versions/versioned/mockapi.js.map +1 -1
  59. package/dist/specs/special-words/mockapi.d.ts.map +1 -1
  60. package/dist/specs/special-words/mockapi.js +28 -6
  61. package/dist/specs/special-words/mockapi.js.map +1 -1
  62. package/dist/specs/streaming/jsonl/mockapi.d.ts +3 -0
  63. package/dist/specs/streaming/jsonl/mockapi.d.ts.map +1 -0
  64. package/dist/specs/streaming/jsonl/mockapi.js +30 -0
  65. package/dist/specs/streaming/jsonl/mockapi.js.map +1 -0
  66. package/dist/specs/type/array/mockapi.js +1 -1
  67. package/dist/specs/type/array/mockapi.js.map +1 -1
  68. package/dist/specs/type/dictionary/mockapi.js +1 -1
  69. package/dist/specs/type/dictionary/mockapi.js.map +1 -1
  70. package/dist/specs/type/enum/extensible/mockapi.js +1 -1
  71. package/dist/specs/type/enum/extensible/mockapi.js.map +1 -1
  72. package/dist/specs/type/enum/fixed/mockapi.js +2 -2
  73. package/dist/specs/type/enum/fixed/mockapi.js.map +1 -1
  74. package/dist/specs/type/model/empty/mockapi.js +2 -2
  75. package/dist/specs/type/model/empty/mockapi.js.map +1 -1
  76. package/dist/specs/type/model/inheritance/enum-discriminator/mockapi.js +1 -1
  77. package/dist/specs/type/model/inheritance/enum-discriminator/mockapi.js.map +1 -1
  78. package/dist/specs/type/model/inheritance/nested-discriminator/mockapi.js +2 -2
  79. package/dist/specs/type/model/inheritance/nested-discriminator/mockapi.js.map +1 -1
  80. package/dist/specs/type/model/inheritance/not-discriminated/mockapi.js +2 -2
  81. package/dist/specs/type/model/inheritance/not-discriminated/mockapi.js.map +1 -1
  82. package/dist/specs/type/model/inheritance/recursive/mockapi.js +1 -1
  83. package/dist/specs/type/model/inheritance/recursive/mockapi.js.map +1 -1
  84. package/dist/specs/type/model/inheritance/single-discriminator/mockapi.js +2 -2
  85. package/dist/specs/type/model/inheritance/single-discriminator/mockapi.js.map +1 -1
  86. package/dist/specs/type/model/usage/mockapi.js +4 -4
  87. package/dist/specs/type/model/usage/mockapi.js.map +1 -1
  88. package/dist/specs/type/model/visibility/mockapi.js +9 -10
  89. package/dist/specs/type/model/visibility/mockapi.js.map +1 -1
  90. package/dist/specs/type/property/additional-properties/mockapi.js +9 -6
  91. package/dist/specs/type/property/additional-properties/mockapi.js.map +1 -1
  92. package/dist/specs/type/property/nullable/mockapi.js +2 -6
  93. package/dist/specs/type/property/nullable/mockapi.js.map +1 -1
  94. package/dist/specs/type/property/optionality/mockapi.js +1 -1
  95. package/dist/specs/type/property/optionality/mockapi.js.map +1 -1
  96. package/dist/specs/type/property/value-types/mockapi.js +3 -3
  97. package/dist/specs/type/property/value-types/mockapi.js.map +1 -1
  98. package/dist/specs/type/scalar/mockapi.js +9 -9
  99. package/dist/specs/type/scalar/mockapi.js.map +1 -1
  100. package/dist/specs/type/union/discriminated/mockapi.d.ts +3 -0
  101. package/dist/specs/type/union/discriminated/mockapi.d.ts.map +1 -0
  102. package/dist/specs/type/union/discriminated/mockapi.js +212 -0
  103. package/dist/specs/type/union/discriminated/mockapi.js.map +1 -0
  104. package/dist/specs/type/union/mockapi.js +2 -2
  105. package/dist/specs/type/union/mockapi.js.map +1 -1
  106. package/dist/specs/versioning/added/mockapi.js +6 -6
  107. package/dist/specs/versioning/added/mockapi.js.map +1 -1
  108. package/dist/specs/versioning/madeOptional/mockapi.js +2 -2
  109. package/dist/specs/versioning/madeOptional/mockapi.js.map +1 -1
  110. package/dist/specs/versioning/removed/mockapi.js +46 -2
  111. package/dist/specs/versioning/removed/mockapi.js.map +1 -1
  112. package/dist/specs/versioning/renamedFrom/mockapi.js +5 -5
  113. package/dist/specs/versioning/renamedFrom/mockapi.js.map +1 -1
  114. package/dist/specs/versioning/returnTypeChangedFrom/mockapi.js +1 -1
  115. package/dist/specs/versioning/returnTypeChangedFrom/mockapi.js.map +1 -1
  116. package/dist/specs/versioning/typeChangedFrom/mockapi.js +3 -3
  117. package/dist/specs/versioning/typeChangedFrom/mockapi.js.map +1 -1
  118. package/package.json +32 -19
  119. package/smoke/petstore/main.tsp +96 -0
  120. package/smoke/todoapp/main.tsp +293 -0
  121. package/spec-summary.md +1289 -265
  122. package/specs/documentation/main.tsp +158 -0
  123. package/specs/documentation/mockapi.ts +57 -0
  124. package/specs/encode/array/main.tsp +112 -0
  125. package/specs/encode/array/mockapi.ts +43 -0
  126. package/specs/encode/bytes/main.tsp +29 -20
  127. package/specs/encode/bytes/mockapi.ts +13 -31
  128. package/specs/encode/datetime/main.tsp +2 -7
  129. package/specs/encode/datetime/mockapi.ts +2 -2
  130. package/specs/encode/duration/main.tsp +420 -7
  131. package/specs/encode/duration/mockapi.ts +174 -2
  132. package/specs/encode/numeric/mockapi.ts +2 -2
  133. package/specs/parameters/basic/mockapi.ts +3 -3
  134. package/specs/parameters/body-optionality/main.tsp +2 -0
  135. package/specs/parameters/body-optionality/mockapi.ts +24 -4
  136. package/specs/parameters/collection-format/main.tsp +5 -25
  137. package/specs/parameters/collection-format/mockapi.ts +4 -16
  138. package/specs/parameters/path/main.tsp +48 -0
  139. package/specs/parameters/path/mockapi.ts +34 -0
  140. package/specs/parameters/spread/mockapi.ts +19 -19
  141. package/specs/payload/json-merge-patch/main.tsp +2 -2
  142. package/specs/payload/json-merge-patch/mockapi.ts +4 -4
  143. package/specs/payload/media-type/mockapi.ts +2 -2
  144. package/specs/payload/multipart/main.tsp +34 -32
  145. package/specs/payload/multipart/mockapi.ts +42 -59
  146. package/specs/payload/pageable/main.tsp +462 -7
  147. package/specs/payload/pageable/mockapi.ts +478 -18
  148. package/specs/payload/xml/mockapi.ts +1 -4
  149. package/specs/response/status-code-range/main.tsp +82 -0
  150. package/specs/response/status-code-range/mockapi.ts +31 -0
  151. package/specs/routes/main.tsp +48 -48
  152. package/specs/routes/mockapi.ts +25 -25
  153. package/specs/serialization/encoded-name/json/main.tsp +1 -1
  154. package/specs/serialization/encoded-name/json/mockapi.ts +1 -1
  155. package/specs/server/endpoint/not-defined/main.tsp +1 -3
  156. package/specs/server/path/multiple/main.tsp +3 -5
  157. package/specs/server/versions/not-versioned/mockapi.ts +1 -1
  158. package/specs/server/versions/versioned/main.tsp +1 -1
  159. package/specs/server/versions/versioned/mockapi.ts +6 -12
  160. package/specs/special-headers/conditional-request/main.tsp +1 -1
  161. package/specs/special-headers/repeatability/main.tsp +2 -2
  162. package/specs/special-words/main.tsp +44 -6
  163. package/specs/special-words/mockapi.ts +29 -6
  164. package/specs/streaming/jsonl/main.tsp +33 -0
  165. package/specs/streaming/jsonl/mockapi.ts +32 -0
  166. package/specs/type/array/mockapi.ts +1 -1
  167. package/specs/type/dictionary/mockapi.ts +1 -1
  168. package/specs/type/enum/extensible/main.tsp +18 -2
  169. package/specs/type/enum/extensible/mockapi.ts +1 -1
  170. package/specs/type/enum/fixed/main.tsp +15 -3
  171. package/specs/type/enum/fixed/mockapi.ts +2 -2
  172. package/specs/type/model/empty/mockapi.ts +2 -2
  173. package/specs/type/model/inheritance/enum-discriminator/mockapi.ts +1 -1
  174. package/specs/type/model/inheritance/nested-discriminator/mockapi.ts +2 -2
  175. package/specs/type/model/inheritance/not-discriminated/mockapi.ts +2 -2
  176. package/specs/type/model/inheritance/recursive/mockapi.ts +1 -1
  177. package/specs/type/model/inheritance/single-discriminator/mockapi.ts +2 -2
  178. package/specs/type/model/usage/mockapi.ts +4 -4
  179. package/specs/type/model/visibility/main.tsp +15 -23
  180. package/specs/type/model/visibility/mockapi.ts +9 -10
  181. package/specs/type/property/additional-properties/main.tsp +17 -17
  182. package/specs/type/property/additional-properties/mockapi.ts +10 -10
  183. package/specs/type/property/nullable/mockapi.ts +7 -8
  184. package/specs/type/property/optionality/mockapi.ts +1 -1
  185. package/specs/type/property/value-types/mockapi.ts +3 -3
  186. package/specs/type/scalar/main.tsp +58 -9
  187. package/specs/type/scalar/mockapi.ts +9 -9
  188. package/specs/type/union/discriminated/main.tsp +251 -0
  189. package/specs/type/union/discriminated/mockapi.ts +230 -0
  190. package/specs/type/union/mockapi.ts +2 -2
  191. package/specs/versioning/added/mockapi.ts +6 -6
  192. package/specs/versioning/madeOptional/mockapi.ts +2 -2
  193. package/specs/versioning/removed/main.tsp +65 -3
  194. package/specs/versioning/removed/mockapi.ts +49 -2
  195. package/specs/versioning/renamedFrom/mockapi.ts +5 -5
  196. package/specs/versioning/returnTypeChangedFrom/main.tsp +17 -2
  197. package/specs/versioning/returnTypeChangedFrom/mockapi.ts +1 -1
  198. package/specs/versioning/typeChangedFrom/mockapi.ts +3 -3
  199. package/temp/.tsbuildinfo +1 -1
  200. package/tspconfig.yaml +0 -2
  201. package/dist/specs/type/model/templated/mockapi.d.ts.map +0 -1
  202. package/dist/specs/type/model/templated/mockapi.js +0 -63
  203. package/dist/specs/type/model/templated/mockapi.js.map +0 -1
  204. package/specs/type/model/templated/main.tsp +0 -130
  205. package/specs/type/model/templated/mockapi.ts +0 -66
  206. /package/dist/specs/{type/model/templated → documentation}/mockapi.d.ts +0 -0
@@ -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,
@@ -6,11 +6,11 @@ Scenarios.Versioning_Added_v1 = passOnSuccess({
6
6
  uri: `/versioning/added/api-version:v2/v1`,
7
7
  method: `post`,
8
8
  request: {
9
- body: {
9
+ body: json({
10
10
  prop: "foo",
11
11
  enumProp: "enumMemberV2",
12
12
  unionProp: 10,
13
- },
13
+ }),
14
14
  headers: {
15
15
  "header-v2": "bar",
16
16
  },
@@ -26,11 +26,11 @@ Scenarios.Versioning_Added_v2 = passOnSuccess({
26
26
  uri: `/versioning/added/api-version:v2/v2`,
27
27
  method: `post`,
28
28
  request: {
29
- body: {
29
+ body: json({
30
30
  prop: "foo",
31
31
  enumProp: "enumMember",
32
32
  unionProp: "bar",
33
- },
33
+ }),
34
34
  },
35
35
  response: {
36
36
  status: 200,
@@ -43,11 +43,11 @@ Scenarios.Versioning_Added_InterfaceV2 = passOnSuccess({
43
43
  uri: `/versioning/added/api-version:v2/interface-v2/v2`,
44
44
  method: `post`,
45
45
  request: {
46
- body: {
46
+ body: json({
47
47
  prop: "foo",
48
48
  enumProp: "enumMember",
49
49
  unionProp: "bar",
50
- },
50
+ }),
51
51
  },
52
52
  response: {
53
53
  status: 200,
@@ -6,9 +6,9 @@ Scenarios.Versioning_MadeOptional_test = passOnSuccess({
6
6
  uri: `/versioning/made-optional/api-version:v2/test`,
7
7
  method: `post`,
8
8
  request: {
9
- body: {
9
+ body: json({
10
10
  prop: "foo",
11
- },
11
+ }),
12
12
  },
13
13
  response: {
14
14
  status: 200,
@@ -21,7 +21,7 @@ using TypeSpec.Versioning;
21
21
  endpoint: url,
22
22
 
23
23
  /**
24
- * Need to be set as 'v1' or 'v2' in client.
24
+ * Need to be set as 'v1', 'v2preview' or 'v2' in client.
25
25
  */
26
26
  version: Versions,
27
27
  }
@@ -37,6 +37,11 @@ enum Versions {
37
37
  */
38
38
  v1: "v1",
39
39
 
40
+ /**
41
+ * The V2 Preview version.
42
+ */
43
+ v2preview: "v2preview",
44
+
40
45
  /**
41
46
  * The version v2.
42
47
  */
@@ -67,6 +72,14 @@ model ModelV2 {
67
72
  unionProp: UnionV2;
68
73
  }
69
74
 
75
+ model ModelV3 {
76
+ id: string;
77
+
78
+ @removed(Versions.v2preview)
79
+ @added(Versions.v2)
80
+ enumProp: EnumV3;
81
+ }
82
+
70
83
  enum EnumV2 {
71
84
  @removed(Versions.v2)
72
85
  enumMemberV1,
@@ -74,6 +87,14 @@ enum EnumV2 {
74
87
  enumMemberV2,
75
88
  }
76
89
 
90
+ enum EnumV3 {
91
+ @removed(Versions.v2preview)
92
+ @added(Versions.v2)
93
+ enumMemberV1,
94
+
95
+ enumMemberV2Preview,
96
+ }
97
+
77
98
  @removed(Versions.v2)
78
99
  union UnionV1 {
79
100
  string,
@@ -94,7 +115,7 @@ scalar V1Scalar extends int32;
94
115
  /**
95
116
  * This operation should not be generated with latest version's signature.
96
117
  */
97
- #suppress "@azure-tools/cadl-ranch-expect/missing-scenario" "by design"
118
+ #suppress "@typespec/spector/missing-scenario" "by design"
98
119
  @route("/v1")
99
120
  @post
100
121
  @removed(Versions.v2)
@@ -119,8 +140,49 @@ op v2(@body body: ModelV2, @removed(Versions.v2) @query param: string): ModelV2;
119
140
  @route("/interface-v1")
120
141
  @removed(Versions.v2)
121
142
  interface InterfaceV1 {
122
- #suppress "@azure-tools/cadl-ranch-expect/missing-scenario" "by design"
143
+ #suppress "@typespec/spector/missing-scenario" "by design"
123
144
  @post
124
145
  @route("/v1")
125
146
  v1InInterface(@body body: ModelV1): ModelV1;
126
147
  }
148
+
149
+ /** This operation will pass different paths and different request bodies based on different versions. */
150
+ @scenario
151
+ @scenarioDoc("""
152
+ path: "/versioning/removed/api-version:v1/v3"
153
+ Expected request body:
154
+ ```json
155
+ { "id": "123", "enumProp": "enumMemberV1" }
156
+ ```
157
+
158
+ Expected response body:
159
+ ```json
160
+ { "id": "123", "enumProp": "enumMemberV1" }
161
+ ```
162
+
163
+ path: "/versioning/removed/api-version:v2preview/v3"
164
+ Expected request body:
165
+ ```json
166
+ { "id": "123"}
167
+ ```
168
+
169
+ Expected response body:
170
+ ```json
171
+ { "id": "123"}
172
+ ```
173
+
174
+ path: "/versioning/removed/api-version:v2/v3"
175
+ Expected request body:
176
+ ```json
177
+ { "id": "123", "enumProp": "enumMemberV1" }
178
+ ```
179
+
180
+ Expected response body:
181
+ ```json
182
+ { "id": "123", "enumProp": "enumMemberV1" }
183
+ ```
184
+
185
+ """)
186
+ @post
187
+ @route("/v3")
188
+ op modelV3(@body body: ModelV3): ModelV3;
@@ -6,11 +6,11 @@ Scenarios.Versioning_Removed_v2 = passOnSuccess({
6
6
  uri: `/versioning/removed/api-version:v2/v2`,
7
7
  method: `post`,
8
8
  request: {
9
- body: {
9
+ body: json({
10
10
  prop: "foo",
11
11
  enumProp: "enumMemberV2",
12
12
  unionProp: "bar",
13
- },
13
+ }),
14
14
  },
15
15
  response: {
16
16
  status: 200,
@@ -18,3 +18,50 @@ Scenarios.Versioning_Removed_v2 = passOnSuccess({
18
18
  },
19
19
  kind: "MockApiDefinition",
20
20
  });
21
+
22
+ Scenarios.Versioning_Removed_modelV3 = passOnSuccess({
23
+ uri: `/versioning/removed/api-version\\:v1/v3`,
24
+ method: "post",
25
+ request: {
26
+ body: json({
27
+ id: "123",
28
+ enumProp: "enumMemberV1",
29
+ }),
30
+ },
31
+ response: {
32
+ status: 200,
33
+ body: json({ id: "123", enumProp: "enumMemberV1" }),
34
+ },
35
+ kind: "MockApiDefinition",
36
+ });
37
+
38
+ Scenarios.Versioning_Removed_modelV3_V2 = passOnSuccess({
39
+ uri: `/versioning/removed/api-version\\:v2/v3`,
40
+ method: "post",
41
+ request: {
42
+ body: json({
43
+ id: "123",
44
+ enumProp: "enumMemberV1",
45
+ }),
46
+ },
47
+ response: {
48
+ status: 200,
49
+ body: json({ id: "123", enumProp: "enumMemberV1" }),
50
+ },
51
+ kind: "MockApiDefinition",
52
+ });
53
+
54
+ Scenarios.Versioning_Removed_modelV3_V2preview = passOnSuccess({
55
+ uri: `/versioning/removed/api-version\\:v2preview/v3`,
56
+ method: "post",
57
+ request: {
58
+ body: json({
59
+ id: "123",
60
+ }),
61
+ },
62
+ response: {
63
+ status: 200,
64
+ body: json({ id: "123" }),
65
+ },
66
+ kind: "MockApiDefinition",
67
+ });
@@ -6,12 +6,12 @@ Scenarios.Versioning_RenamedFrom_newOp = passOnSuccess({
6
6
  uri: `/versioning/renamed-from/api-version:v2/test`,
7
7
  method: `post`,
8
8
  request: {
9
- body: {
9
+ body: json({
10
10
  newProp: "foo",
11
11
  enumProp: "newEnumMember",
12
12
  unionProp: 10,
13
- },
14
- params: {
13
+ }),
14
+ query: {
15
15
  newQuery: "bar",
16
16
  },
17
17
  },
@@ -26,11 +26,11 @@ Scenarios.Versioning_RenamedFrom_NewInterface = passOnSuccess({
26
26
  uri: `/versioning/renamed-from/api-version:v2/interface/test`,
27
27
  method: `post`,
28
28
  request: {
29
- body: {
29
+ body: json({
30
30
  newProp: "foo",
31
31
  enumProp: "newEnumMember",
32
32
  unionProp: 10,
33
- },
33
+ }),
34
34
  },
35
35
  response: {
36
36
  status: 200,
@@ -53,5 +53,20 @@ enum Versions {
53
53
  """)
54
54
  @route("/test")
55
55
  @post
56
- @returnTypeChangedFrom(Versions.v2, int32)
57
- op test(@body body: string): string;
56
+ @returnTypeChangedFrom(
57
+ Versions.v2,
58
+ {
59
+ @header
60
+ contentType: "application/json",
61
+
62
+ @body
63
+ body: int32,
64
+ }
65
+ )
66
+ op test(@header contentType: "application/json", @body body: string): {
67
+ @header
68
+ contentType: "application/json";
69
+
70
+ @body
71
+ body: string;
72
+ };
@@ -6,7 +6,7 @@ Scenarios.Versioning_ReturnTypeChangedFrom_test = passOnSuccess({
6
6
  uri: `/versioning/return-type-changed-from/api-version:v2/test`,
7
7
  method: `post`,
8
8
  request: {
9
- body: "test",
9
+ body: json("test"),
10
10
  headers: {
11
11
  "Content-Type": "text/plain",
12
12
  },
@@ -6,13 +6,13 @@ Scenarios.Versioning_TypeChangedFrom_test = passOnSuccess({
6
6
  uri: `/versioning/type-changed-from/api-version:v2/test`,
7
7
  method: `post`,
8
8
  request: {
9
- params: {
9
+ query: {
10
10
  param: "baz",
11
11
  },
12
- body: {
12
+ body: json({
13
13
  prop: "foo",
14
14
  changedProp: "bar",
15
- },
15
+ }),
16
16
  },
17
17
  response: {
18
18
  status: 200,