@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
@@ -4,7 +4,7 @@ import "@typespec/spector";
4
4
 
5
5
  using Http;
6
6
  using Spector;
7
- using TypeSpec.Versioning;
7
+ using Versioning;
8
8
 
9
9
  @doc("Illustrates OASIS repeatability headers")
10
10
  @scenarioService("/special-headers/repeatability")
@@ -15,7 +15,7 @@ model RepeatableResponse {
15
15
  @statusCode
16
16
  statusCode: 204;
17
17
 
18
- @visibility("read")
18
+ @visibility(Lifecycle.Read)
19
19
  @header("Repeatability-Result")
20
20
  @doc("Indicates whether the repeatable request was accepted or rejected.")
21
21
  repeatabilityResult?: "accepted" | "rejected";
@@ -34,6 +34,7 @@ using Spector;
34
34
  * in
35
35
  * is
36
36
  * lambda
37
+ * list
37
38
  * not
38
39
  * or
39
40
  * pass
@@ -56,7 +57,7 @@ interface Operations {
56
57
  @opNameScenario("and") and(): void;
57
58
  @opNameScenario("as") as(): void;
58
59
  @opNameScenario("assert") assert(): void;
59
- @opNameScenario("async") async(): void;
60
+ @opNameScenario("async") `async`(): void;
60
61
  @opNameScenario("await") await(): void;
61
62
  @opNameScenario("break") break(): void;
62
63
  @opNameScenario("class") class(): void;
@@ -84,7 +85,7 @@ interface Operations {
84
85
  @opNameScenario("return") `return`(): void;
85
86
  @opNameScenario("try") try(): void;
86
87
  @opNameScenario("while") while(): void;
87
- @opNameScenario("with") with(): void;
88
+ @opNameScenario("with") `with`(): void;
88
89
  @opNameScenario("yield") yield(): void;
89
90
  }
90
91
 
@@ -144,7 +145,7 @@ namespace Models {
144
145
  model and is Base;
145
146
  model as is Base;
146
147
  model assert is Base;
147
- model async is Base;
148
+ model `async` is Base;
148
149
  model await is Base;
149
150
  model break is Base;
150
151
  model class is Base;
@@ -172,13 +173,13 @@ namespace Models {
172
173
  model `return` is Base;
173
174
  model try is Base;
174
175
  model while is Base;
175
- model with is Base;
176
+ model `with` is Base;
176
177
  model yield is Base;
177
178
 
178
179
  @modelNameScenario("and") op withAnd(@body body: and): void;
179
180
  @modelNameScenario("as") op withAs(@body body: as): void;
180
181
  @modelNameScenario("assert") op withAssert(@body body: assert): void;
181
- @modelNameScenario("async") op withAsync(@body body: async): void;
182
+ @modelNameScenario("async") op withAsync(@body body: `async`): void;
182
183
  @modelNameScenario("await") op withAwait(@body body: await): void;
183
184
  @modelNameScenario("break") op withBreak(@body body: break): void;
184
185
  @modelNameScenario("class") op withClass(@body body: class): void;
@@ -206,7 +207,7 @@ namespace Models {
206
207
  @modelNameScenario("return") op withReturn(@body body: `return`): void;
207
208
  @modelNameScenario("try") op withTry(@body body: try): void;
208
209
  @modelNameScenario("while") op withWhile(@body body: while): void;
209
- @modelNameScenario("with") op withWith(@body body: with): void;
210
+ @modelNameScenario("with") op withWith(@body body: `with`): void;
210
211
  @modelNameScenario("yield") op withYield(@body body: yield): void;
211
212
  }
212
213
 
@@ -231,4 +232,115 @@ namespace ModelProperties {
231
232
  """)
232
233
  @route("same-as-model")
233
234
  op sameAsModel(@body body: SameAsModel): void;
235
+
236
+ // Python dict method names that could conflict
237
+ model DictMethods {
238
+ keys: string;
239
+ items: string;
240
+ values: string;
241
+ popitem: string;
242
+ clear: string;
243
+ update: string;
244
+ setdefault: string;
245
+ pop: string;
246
+ get: string;
247
+ copy: string;
248
+ }
249
+
250
+ @scenario
251
+ @scenarioDoc("""
252
+ Verify that model properties can use names that are Python dict methods. These names (keys, items, values, etc.) may conflict with Python's dict class methods.
253
+
254
+ Send
255
+
256
+ ```json
257
+ {
258
+ "keys": "ok",
259
+ "items": "ok",
260
+ "values": "ok",
261
+ "popitem": "ok",
262
+ "clear": "ok",
263
+ "update": "ok",
264
+ "setdefault": "ok",
265
+ "pop": "ok",
266
+ "get": "ok",
267
+ "copy": "ok"
268
+ }
269
+ ```
270
+ """)
271
+ @route("dict-methods")
272
+ op dictMethods(@body body: DictMethods): void;
273
+
274
+ // Test for model property named "list" which is a reserved word in many languages
275
+ model ModelWithList {
276
+ list: string;
277
+ }
278
+
279
+ @scenario
280
+ @scenarioDoc("""
281
+ Verify that a property can be named "list", which is a reserved word in many languages like Python.
282
+
283
+ Send
284
+
285
+ ```json
286
+ {"list": "ok"}
287
+ ```
288
+ """)
289
+ @route("list")
290
+ op withList(@body body: ModelWithList): void;
291
+ }
292
+
293
+ /**
294
+ * Verify enum member names that are special words using extensible enum (union).
295
+ */
296
+ union ExtensibleString {
297
+ string,
298
+ and: "and",
299
+ as: "as",
300
+ assert: "assert",
301
+ async: "async",
302
+ await: "await",
303
+ break: "break",
304
+ class: "class",
305
+ constructor: "constructor",
306
+ continue: "continue",
307
+ def: "def",
308
+ del: "del",
309
+ elif: "elif",
310
+ `else`: "else",
311
+ except: "except",
312
+ exec: "exec",
313
+ finally: "finally",
314
+ for: "for",
315
+ from: "from",
316
+ global: "global",
317
+ `if`: "if",
318
+ `import`: "import",
319
+ in: "in",
320
+ `is`: "is",
321
+ lambda: "lambda",
322
+ not: "not",
323
+ or: "or",
324
+ pass: "pass",
325
+ raise: "raise",
326
+ `return`: "return",
327
+ try: "try",
328
+ while: "while",
329
+ with: "with",
330
+ yield: "yield",
331
+ }
332
+
333
+ /**
334
+ * Verify enum member names that are special words.
335
+ */
336
+ @route("/extensible-strings")
337
+ interface ExtensibleStrings {
338
+ @scenario
339
+ @scenarioDoc("""
340
+ Verify that enum members with special word names can be sent and received properly.
341
+ Send 'class' and expect the same value back.
342
+ """)
343
+ @put
344
+ @route("/string")
345
+ putExtensibleStringValue(@body body: ExtensibleString): ExtensibleString;
234
346
  }
@@ -1,4 +1,4 @@
1
- import { passOnSuccess, ScenarioMockApi } from "@typespec/spec-api";
1
+ import { json, MockRequest, passOnSuccess, ScenarioMockApi } from "@typespec/spec-api";
2
2
 
3
3
  export const Scenarios: Record<string, ScenarioMockApi> = {};
4
4
 
@@ -6,9 +6,46 @@ Scenarios.SpecialWords_ModelProperties_sameAsModel = passOnSuccess({
6
6
  uri: "/special-words/model-properties/same-as-model",
7
7
  method: "post",
8
8
  request: {
9
- body: {
9
+ body: json({
10
10
  SameAsModel: "ok",
11
- },
11
+ }),
12
+ },
13
+ response: {
14
+ status: 204,
15
+ },
16
+ kind: "MockApiDefinition",
17
+ });
18
+
19
+ Scenarios.SpecialWords_ModelProperties_dictMethods = passOnSuccess({
20
+ uri: "/special-words/model-properties/dict-methods",
21
+ method: "post",
22
+ request: {
23
+ body: json({
24
+ keys: "ok",
25
+ items: "ok",
26
+ values: "ok",
27
+ popitem: "ok",
28
+ clear: "ok",
29
+ update: "ok",
30
+ setdefault: "ok",
31
+ pop: "ok",
32
+ get: "ok",
33
+ copy: "ok",
34
+ }),
35
+ },
36
+ response: {
37
+ status: 204,
38
+ },
39
+ kind: "MockApiDefinition",
40
+ });
41
+
42
+ Scenarios.SpecialWords_ModelProperties_withList = passOnSuccess({
43
+ uri: "/special-words/model-properties/list",
44
+ method: "post",
45
+ request: {
46
+ body: json({
47
+ list: "ok",
48
+ }),
12
49
  },
13
50
  response: {
14
51
  status: 204,
@@ -21,9 +58,9 @@ function createModelsTests(uri: string) {
21
58
  uri,
22
59
  method: "post",
23
60
  request: {
24
- body: {
61
+ body: json({
25
62
  name: "ok",
26
- },
63
+ }),
27
64
  },
28
65
  response: {
29
66
  status: 204,
@@ -134,7 +171,7 @@ function createParametersTests(uri: string, data: any, paramName: string) {
134
171
  uri,
135
172
  method: "get",
136
173
  request: {
137
- params: data,
174
+ query: data,
138
175
  },
139
176
  response: {
140
177
  status: 204,
@@ -382,3 +419,22 @@ Scenarios.SpecialWords_Parameters_cancellationToken = createParametersTests(
382
419
  },
383
420
  "cancellationToken",
384
421
  );
422
+
423
+ Scenarios.SpecialWords_ExtensibleStrings_putExtensibleStringValue = passOnSuccess({
424
+ uri: `/special-words/extensible-strings/string`,
425
+ method: "put",
426
+ request: {
427
+ body: json("class"),
428
+ },
429
+ response: {
430
+ status: 200,
431
+ body: json("class"),
432
+ },
433
+ handler: (req: MockRequest) => {
434
+ return {
435
+ status: 200,
436
+ body: json(req.body),
437
+ };
438
+ },
439
+ kind: "MockApiDefinition",
440
+ });
@@ -0,0 +1,33 @@
1
+ import "@typespec/http";
2
+ import "@typespec/http/streams";
3
+ import "@typespec/spector";
4
+
5
+ using Http;
6
+ using Http.Streams;
7
+ using Spector;
8
+
9
+ @doc("Test of jsonl streaming.")
10
+ @scenarioService("/streaming/jsonl")
11
+ namespace Streaming.Jsonl;
12
+
13
+ @route("basic")
14
+ namespace Basic {
15
+ @scenario
16
+ @scenarioDoc("""
17
+ Basic jsonl streaming for request.
18
+ """)
19
+ @route("send")
20
+ @post
21
+ op send(stream: JsonlStream<Info>): NoContentResponse;
22
+
23
+ @scenario
24
+ @scenarioDoc("""
25
+ Basic jsonl streaming for response.
26
+ """)
27
+ @route("receive")
28
+ op receive(): JsonlStream<Info>;
29
+
30
+ model Info {
31
+ desc: string;
32
+ }
33
+ }
@@ -0,0 +1,32 @@
1
+ import { passOnSuccess, ScenarioMockApi } from "@typespec/spec-api";
2
+
3
+ export const Scenarios: Record<string, ScenarioMockApi> = {};
4
+
5
+ Scenarios.Streaming_Jsonl_Basic_send = passOnSuccess({
6
+ uri: "/streaming/jsonl/basic/send",
7
+ method: "post",
8
+ request: {
9
+ body: {
10
+ rawContent: Buffer.from('{"desc": "one"}\n{"desc": "two"}\n{"desc": "three"}'),
11
+ contentType: "application/jsonl",
12
+ },
13
+ },
14
+ response: {
15
+ status: 204,
16
+ },
17
+ kind: "MockApiDefinition",
18
+ });
19
+
20
+ Scenarios.Streaming_Jsonl_Basic_receive = passOnSuccess({
21
+ uri: "/streaming/jsonl/basic/receive",
22
+ method: "get",
23
+ request: {},
24
+ response: {
25
+ status: 200,
26
+ body: {
27
+ rawContent: Buffer.from('{"desc": "one"}\n{"desc": "two"}\n{"desc": "three"}'),
28
+ contentType: "application/jsonl",
29
+ },
30
+ },
31
+ kind: "MockApiDefinition",
32
+ });
@@ -18,7 +18,7 @@ function createServerTests(uri: string, data: any) {
18
18
  uri,
19
19
  method: "put",
20
20
  request: {
21
- body: data,
21
+ body: json(data),
22
22
  },
23
23
  response: {
24
24
  status: 204,
@@ -18,7 +18,7 @@ function createServerTests(uri: string, data: any) {
18
18
  uri,
19
19
  method: "put",
20
20
  request: {
21
- body: data,
21
+ body: json(data),
22
22
  },
23
23
  response: {
24
24
  status: 204,
@@ -40,6 +40,9 @@ interface String {
40
40
  @get
41
41
  @route("/known-value")
42
42
  getKnownValue(): {
43
+ @header
44
+ contentType: "application/json";
45
+
43
46
  @body body: DaysOfWeekExtensibleEnum;
44
47
  };
45
48
 
@@ -48,6 +51,9 @@ interface String {
48
51
  @get
49
52
  @route("/unknown-value")
50
53
  getUnknownValue(): {
54
+ @header
55
+ contentType: "application/json";
56
+
51
57
  @body body: DaysOfWeekExtensibleEnum;
52
58
  };
53
59
 
@@ -55,11 +61,21 @@ interface String {
55
61
  @scenarioDoc("Expect to send a known value. Mock api expect to receive 'Monday'")
56
62
  @put
57
63
  @route("/known-value")
58
- putKnownValue(@body body: DaysOfWeekExtensibleEnum): void;
64
+ putKnownValue(
65
+ @header
66
+ contentType: "application/json",
67
+
68
+ @body body: DaysOfWeekExtensibleEnum,
69
+ ): void;
59
70
 
60
71
  @scenario
61
72
  @scenarioDoc("Expect to handle an unknown value. Mock api expect to receive 'Weekend'")
62
73
  @put
63
74
  @route("/unknown-value")
64
- putUnknownValue(@body body: DaysOfWeekExtensibleEnum): void;
75
+ putUnknownValue(
76
+ @header
77
+ contentType: "application/json",
78
+
79
+ @body body: DaysOfWeekExtensibleEnum,
80
+ ): void;
65
81
  }
@@ -18,7 +18,7 @@ function createMockServerTests(uri: string, data: any) {
18
18
  uri,
19
19
  method: "put",
20
20
  request: {
21
- body: data,
21
+ body: json(data),
22
22
  headers: {
23
23
  "Content-Type": "text/plain",
24
24
  },
@@ -40,7 +40,13 @@ interface String {
40
40
  @get
41
41
  @route("/known-value")
42
42
  @doc("getKnownValue")
43
- getKnownValue(): DaysOfWeekEnum;
43
+ getKnownValue(): {
44
+ @header
45
+ contentType: "application/json";
46
+
47
+ @body
48
+ body: DaysOfWeekEnum;
49
+ };
44
50
 
45
51
  #suppress "@azure-tools/typespec-azure-core/use-standard-operations" "For testing"
46
52
  @scenario
@@ -48,7 +54,10 @@ interface String {
48
54
  @put
49
55
  @route("/known-value")
50
56
  @doc("putKnownValue")
51
- putKnownValue(@body @doc("_") body: DaysOfWeekEnum): void;
57
+ putKnownValue(
58
+ @header contentType: "application/json",
59
+ @body @doc("_") body: DaysOfWeekEnum,
60
+ ): void;
52
61
 
53
62
  #suppress "@azure-tools/typespec-azure-core/use-standard-operations" "For testing"
54
63
  @scenario
@@ -56,5 +65,8 @@ interface String {
56
65
  @put
57
66
  @route("/unknown-value")
58
67
  @doc("putUnknownValue")
59
- putUnknownValue(@body @doc("_") body: DaysOfWeekEnum): void;
68
+ putUnknownValue(
69
+ @header contentType: "application/json",
70
+ @body @doc("_") body: DaysOfWeekEnum,
71
+ ): void;
60
72
  }
@@ -16,7 +16,7 @@ Scenarios.Type_Enum_Fixed_String_putKnownValue = passOnSuccess({
16
16
  uri: "/type/enum/fixed/string/known-value",
17
17
  method: "put",
18
18
  request: {
19
- body: "Monday",
19
+ body: json("Monday"),
20
20
  headers: {
21
21
  "Content-Type": "application/json",
22
22
  },
@@ -31,7 +31,7 @@ Scenarios.Type_Enum_Fixed_String_putUnknownValue = passOnCode(500, {
31
31
  uri: "/type/enum/fixed/string/unknown-value",
32
32
  method: "put",
33
33
  request: {
34
- body: "Weekend",
34
+ body: json("Weekend"),
35
35
  headers: {
36
36
  "Content-Type": "application/json",
37
37
  },
@@ -0,0 +1,109 @@
1
+ import "@typespec/http";
2
+ import "@typespec/spector";
3
+
4
+ using Http;
5
+ using Spector;
6
+
7
+ @doc("Test for File type usage in request and response bodies")
8
+ @scenarioService("/type/file")
9
+ namespace Type.File;
10
+
11
+ /**
12
+ * Test File as request and response body with specific content type
13
+ */
14
+ @route("/body")
15
+ namespace Body {
16
+ @scenario
17
+ @scenarioDoc("""
18
+ Test File type as request body with specific content type.
19
+ Expected request:
20
+ - Content-Type header: image/png
21
+ - Body: binary content matching packages/http-specs/assets/image.png
22
+ """)
23
+ @post
24
+ @route("/request/specific-content-type")
25
+ op uploadFileSpecificContentType(@bodyRoot file: Http.File<"image/png">): NoContentResponse;
26
+
27
+ @scenario
28
+ @scenarioDoc("""
29
+ Test File type as request body with JSON content type.
30
+ Expected request:
31
+ - Content-Type header: application/json
32
+ - Body: JSON content with file data
33
+ """)
34
+ @post
35
+ @route("/request/json-content-type")
36
+ op uploadFileJsonContentType(@bodyRoot file: Http.File<"application/json">): NoContentResponse;
37
+
38
+ @scenario
39
+ @scenarioDoc("""
40
+ Test File type as response body with JSON content type.
41
+ Expected response:
42
+ - Content-Type header: application/json
43
+ - Body: JSON content with file data
44
+ """)
45
+ @get
46
+ @route("/response/json-content-type")
47
+ op downloadFileJsonContentType(): Http.File<"application/json">;
48
+
49
+ @scenario
50
+ @scenarioDoc("""
51
+ Test File type as response body with specific content type.
52
+ Expected response:
53
+ - Content-Type header: image/png
54
+ - Body: binary content matching packages/http-specs/assets/image.png
55
+ """)
56
+ @get
57
+ @route("/response/specific-content-type")
58
+ op downloadFileSpecificContentType(): Http.File<"image/png">;
59
+
60
+ @scenario
61
+ @scenarioDoc("""
62
+ Test File type as request body with multiple allowed content types (image/png or image/jpeg).
63
+ Client should send image/png.
64
+ Expected request:
65
+ - Content-Type header: image/png
66
+ - Body: binary content matching packages/http-specs/assets/image.png
67
+ """)
68
+ @post
69
+ @route("/request/multiple-content-types")
70
+ op uploadFileMultipleContentTypes(
71
+ @bodyRoot file: Http.File<"image/png" | "image/jpeg">,
72
+ ): NoContentResponse;
73
+
74
+ @scenario
75
+ @scenarioDoc("""
76
+ Test File type as response body with multiple allowed content types.
77
+ Service will return image/png.
78
+ Expected response:
79
+ - Content-Type header: image/png
80
+ - Body: binary content matching packages/http-specs/assets/image.png
81
+ """)
82
+ @get
83
+ @route("/response/multiple-content-types")
84
+ op downloadFileMultipleContentTypes(): Http.File<"image/png" | "image/jpeg">;
85
+
86
+ @scenario
87
+ @scenarioDoc("""
88
+ Test File type as request body with unspecified content type.
89
+ The File type accepts any content type. For testing, sender will use image/png.
90
+ Expected request:
91
+ - Content-Type header: image/png
92
+ - Body: binary content matching packages/http-specs/assets/image.png
93
+ """)
94
+ @post
95
+ @route("/request/default-content-type")
96
+ op uploadFileDefaultContentType(@bodyRoot file: Http.File): NoContentResponse;
97
+
98
+ @scenario
99
+ @scenarioDoc("""
100
+ Test File type as response body with unspecified content type.
101
+ The File type accepts any content type. For testing, server will return image/png.
102
+ Expected response:
103
+ - Content-Type header: image/png
104
+ - Body: binary content matching packages/http-specs/assets/image.png
105
+ """)
106
+ @get
107
+ @route("/response/default-content-type")
108
+ op downloadFileDefaultContentType(): Http.File;
109
+ }