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

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 +260 -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 +115 -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 +196 -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 +626 -14
  54. package/dist/specs/payload/pageable/mockapi.js.map +1 -1
  55. package/dist/specs/payload/xml/mockapi.d.ts +19 -5
  56. package/dist/specs/payload/xml/mockapi.d.ts.map +1 -1
  57. package/dist/specs/payload/xml/mockapi.js +311 -55
  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 +11545 -0
  134. package/package.json +31 -20
  135. package/smoke/petstore/main.tsp +96 -0
  136. package/smoke/todoapp/main.tsp +293 -0
  137. package/spec-summary.md +2137 -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 +221 -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 +207 -59
  166. package/specs/payload/pageable/main.tsp +648 -0
  167. package/specs/payload/pageable/mockapi.ts +691 -14
  168. package/specs/payload/xml/main.tsp +532 -132
  169. package/specs/payload/xml/mockapi.ts +402 -67
  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 +124 -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
@@ -1,8 +1,10 @@
1
1
  import "@typespec/http";
2
2
  import "@typespec/spector";
3
+ import "@typespec/xml";
3
4
 
4
5
  using Http;
5
6
  using Spector;
7
+ using Xml;
6
8
 
7
9
  /**
8
10
  * Test for pageable payload.
@@ -15,6 +17,11 @@ model Pet {
15
17
  name: string;
16
18
  }
17
19
 
20
+ alias HeaderAndQuery = {
21
+ @header foo?: string;
22
+ @query bar?: string;
23
+ };
24
+
18
25
  @route("/server-driven-pagination")
19
26
  namespace ServerDrivenPagination {
20
27
  @scenario
@@ -52,4 +59,645 @@ namespace ServerDrivenPagination {
52
59
 
53
60
  @nextLink next?: url;
54
61
  };
62
+
63
+ @scenario
64
+ @scenarioDoc("""
65
+ Test case for using link as pagination with string nextLink.
66
+
67
+ Two requests need to be tested.
68
+ 1. Initial request:
69
+ Expected route: /payload/pageable/server-driven-pagination/link-string
70
+ Expected response body:
71
+ ```json
72
+ { "pets": [
73
+ { "id": "1", "name": "dog" },
74
+ { "id": "2", "name": "cat" }
75
+ ],
76
+ "next": "http://[host]:[port]/payload/pageable/server-driven-pagination/link-string/nextPage"
77
+ }
78
+ ```
79
+ 2. Next page request:
80
+ Expected route: /payload/pageable/server-driven-pagination/link-string/nextPage
81
+ Expected response body:
82
+ ```json
83
+ { "pets": [
84
+ { "id": "3", "name": "bird" },
85
+ { "id": "4", "name": "fish" }
86
+ ]
87
+ }
88
+ ```
89
+ """)
90
+ @route("/link-string")
91
+ @list
92
+ op linkString(): {
93
+ @pageItems
94
+ pets: Pet[];
95
+
96
+ @nextLink next?: string;
97
+ };
98
+
99
+ @scenario
100
+ @scenarioDoc("""
101
+ Test case for using link as pagination with nested structure.
102
+
103
+ Two requests need to be tested.
104
+ 1. Initial request:
105
+ Expected route: /payload/pageable/server-driven-pagination/nested-link
106
+ Expected response body:
107
+ ```json
108
+ { "nestedItems": {
109
+ "pets": [
110
+ { "id": "1", "name": "dog" },
111
+ { "id": "2", "name": "cat" }
112
+ ]
113
+ },
114
+ "nestedNext": {
115
+ "next": "http://[host]:[port]/payload/pageable/server-driven-pagination/nested-link/nextPage"
116
+ }
117
+ }
118
+ ```
119
+ 2. Next page request:
120
+ Expected route: /payload/pageable/server-driven-pagination/nested-link/nextPage
121
+ Expected response body:
122
+ ```json
123
+ { "nestedItems": {
124
+ "pets": [
125
+ { "id": "3", "name": "bird" },
126
+ { "id": "4", "name": "fish" }
127
+ ]
128
+ }
129
+ }
130
+ ```
131
+ """)
132
+ @route("/nested-link")
133
+ @list
134
+ op nestedLink(): {
135
+ nestedItems: {
136
+ @pageItems
137
+ pets: Pet[];
138
+ };
139
+ nestedNext: {
140
+ @nextLink next?: url;
141
+ };
142
+ };
143
+
144
+ /** Scenario where the initial request is not a GET request. However following the next link always result in a GET request. */
145
+ namespace AlternateInitialVerb {
146
+ model Filter {
147
+ filter: string;
148
+ }
149
+
150
+ @scenario
151
+ @scenarioDoc("""
152
+ Test case for initial POST request followed by GET for next pages using link pagination.
153
+ The initial request is a POST with a filter body, and the next page is fetched using a GET request on the next link.
154
+
155
+ Two requests need to be tested.
156
+ 1. Initial request (POST):
157
+ Expected route: /payload/pageable/server-driven-pagination/link/initial-post
158
+ Expected request body:
159
+ ```json
160
+ { "filter": "foo eq bar" }
161
+ ```
162
+ Expected response body:
163
+ ```json
164
+ { "pets": [
165
+ { "id": "1", "name": "dog" },
166
+ { "id": "2", "name": "cat" }
167
+ ],
168
+ "next": "http://[host]:[port]/payload/pageable/server-driven-pagination/link/initial-post/nextPage?token=abc"
169
+ }
170
+ ```
171
+ 2. Next page request (GET):
172
+ Expected route: /payload/pageable/server-driven-pagination/link/initial-post/nextPage?token=abc
173
+ Expected response body:
174
+ ```json
175
+ { "pets": [
176
+ { "id": "3", "name": "bird" },
177
+ { "id": "4", "name": "fish" }
178
+ ]
179
+ }
180
+ ```
181
+ """)
182
+ @route("/link/initial-post")
183
+ @list
184
+ @post
185
+ op post(@body body: Filter): {
186
+ @pageItems pets: Pet[];
187
+ @nextLink next?: url;
188
+ };
189
+ }
190
+
191
+ @route("/continuationtoken")
192
+ namespace ContinuationToken {
193
+ @scenario
194
+ @scenarioDoc("""
195
+ Test case for using continuation token as pagination. Continuation token is passed in the request query and response body.
196
+
197
+ Two requests need to be tested.
198
+
199
+ 1. Initial request:
200
+ Expected route: /payload/pageable/server-driven-pagination/continuationtoken/request-query-response-body?bar=bar
201
+
202
+ Expected request header:
203
+ foo=foo
204
+
205
+ Expected response body:
206
+ ```json
207
+ { "pets": [
208
+ { "id": "1", "name": "dog" },
209
+ { "id": "2", "name": "cat" }
210
+ ],
211
+ "nextToken": "page2"
212
+ }
213
+ ```
214
+
215
+ 2. Next page request:
216
+ Expected route: /payload/pageable/server-driven-pagination/continuationtoken/request-query-response-body?bar=bar&token=page2
217
+
218
+ Expected request header:
219
+ foo=foo
220
+
221
+ Expected response body:
222
+ ```json
223
+ { "pets": [
224
+ { "id": "3", "name": "bird" },
225
+ { "id": "4", "name": "fish" }
226
+ ]
227
+ }
228
+ ```
229
+ """)
230
+ @route("/request-query-response-body")
231
+ @list
232
+ op requestQueryResponseBody(@continuationToken @query token?: string, ...HeaderAndQuery): {
233
+ @pageItems
234
+ pets: Pet[];
235
+
236
+ @continuationToken nextToken?: string;
237
+ };
238
+
239
+ @scenario
240
+ @scenarioDoc("""
241
+ Test case for using continuation token as pagination. Continuation token is passed in the request header and response body.
242
+
243
+ Two requests need to be tested.
244
+
245
+ 1. Initial request:
246
+ Expected route: /payload/pageable/server-driven-pagination/continuationtoken/request-header-response-body?bar=bar
247
+
248
+ Expected request header:
249
+ foo=foo
250
+
251
+ Expected response body:
252
+ ```json
253
+ { "pets": [
254
+ { "id": "1", "name": "dog" },
255
+ { "id": "2", "name": "cat" }
256
+ ],
257
+ "nextToken": "page2"
258
+ }
259
+ ```
260
+
261
+ 2. Next page request:
262
+ Expected route: /payload/pageable/server-driven-pagination/continuationtoken/request-header-response-body?bar=bar
263
+
264
+ Expected request header:
265
+ token=page2
266
+ foo=foo
267
+
268
+ Expected response body:
269
+ ```json
270
+ { "pets": [
271
+ { "id": "3", "name": "bird" },
272
+ { "id": "4", "name": "fish" }
273
+ ]
274
+ }
275
+ ```
276
+ """)
277
+ @route("/request-header-response-body")
278
+ @list
279
+ op requestHeaderResponseBody(@continuationToken @header token?: string, ...HeaderAndQuery): {
280
+ @pageItems
281
+ pets: Pet[];
282
+
283
+ @continuationToken nextToken?: string;
284
+ };
285
+
286
+ @scenario
287
+ @scenarioDoc("""
288
+ Test case for using continuation token as pagination. Continuation token is passed in the request query and response header.
289
+
290
+ Two requests need to be tested.
291
+
292
+ 1. Initial request:
293
+ Expected route: /payload/pageable/server-driven-pagination/continuationtoken/request-query-response-header?bar=bar
294
+
295
+ Expected request header:
296
+ foo=foo
297
+
298
+ Expected response body:
299
+ ```json
300
+ { "pets": [
301
+ { "id": "1", "name": "dog" },
302
+ { "id": "2", "name": "cat" }
303
+ ]
304
+ }
305
+ ```
306
+
307
+ Expected response header:
308
+ next-token=page2
309
+
310
+ 2. Next page request:
311
+ Expected route: /payload/pageable/server-driven-pagination/continuationtoken/request-query-response-header?bar=bar&token=page2
312
+
313
+ Expected request header:
314
+ foo=foo
315
+
316
+ Expected response body:
317
+ ```json
318
+ { "pets": [
319
+ { "id": "3", "name": "bird" },
320
+ { "id": "4", "name": "fish" }
321
+ ]
322
+ }
323
+ ```
324
+ """)
325
+ @route("/request-query-response-header")
326
+ @list
327
+ op requestQueryResponseHeader(@continuationToken @query token?: string, ...HeaderAndQuery): {
328
+ @pageItems
329
+ pets: Pet[];
330
+
331
+ @continuationToken @header nextToken?: string;
332
+ };
333
+
334
+ @scenario
335
+ @scenarioDoc("""
336
+ Test case for using continuation token as pagination. Continuation token is passed in the request header and response header.
337
+
338
+ Two requests need to be tested.
339
+ 1. Initial request:
340
+ Expected route: /payload/pageable/server-driven-pagination/continuationtoken/request-header-response-header?bar=bar
341
+
342
+ Expected request header:
343
+ foo=foo
344
+
345
+ Expected response body:
346
+ ```json
347
+ { "pets": [
348
+ { "id": "1", "name": "dog" },
349
+ { "id": "2", "name": "cat" }
350
+ ]
351
+ }
352
+ ```
353
+
354
+ Expected response header:
355
+ next-token=page2
356
+
357
+ 2. Next page request:
358
+ Expected route: /payload/pageable/server-driven-pagination/continuationtoken/request-header-response-header?bar=bar
359
+
360
+ Expected request header:
361
+ token=page2
362
+ foo=foo
363
+
364
+ Expected response body:
365
+ ```json
366
+ { "pets": [
367
+ { "id": "3", "name": "bird" },
368
+ { "id": "4", "name": "fish" }
369
+ ]
370
+ }
371
+ ```
372
+ """)
373
+ @route("/request-header-response-header")
374
+ @list
375
+ op requestHeaderResponseHeader(@continuationToken @header token?: string, ...HeaderAndQuery): {
376
+ @pageItems
377
+ pets: Pet[];
378
+
379
+ @continuationToken @header nextToken?: string;
380
+ };
381
+
382
+ @scenario
383
+ @scenarioDoc("""
384
+ Test case for using continuation token as pagination with nested response structure. Continuation token is passed in the request query and nested within response body.
385
+
386
+ Two requests need to be tested.
387
+
388
+ 1. Initial request:
389
+ Expected route: /payload/pageable/server-driven-pagination/continuationtoken/request-query-nested-response-body?bar=bar
390
+
391
+ Expected request header:
392
+ foo=foo
393
+
394
+ Expected response body:
395
+ ```json
396
+ { "nestedItems": {
397
+ "pets": [
398
+ { "id": "1", "name": "dog" },
399
+ { "id": "2", "name": "cat" }
400
+ ]
401
+ },
402
+ "nestedNext": {
403
+ "nextToken": "page2"
404
+ }
405
+ }
406
+ ```
407
+
408
+ 2. Next page request:
409
+ Expected route: /payload/pageable/server-driven-pagination/continuationtoken/request-query-nested-response-body?bar=bar&token=page2
410
+
411
+ Expected request header:
412
+ foo=foo
413
+
414
+ Expected response body:
415
+ ```json
416
+ { "nestedItems": {
417
+ "pets": [
418
+ { "id": "3", "name": "bird" },
419
+ { "id": "4", "name": "fish" }
420
+ ]
421
+ }
422
+ }
423
+ ```
424
+ """)
425
+ @route("/request-query-nested-response-body")
426
+ @list
427
+ op requestQueryNestedResponseBody(
428
+ @continuationToken @query token?: string,
429
+ ...HeaderAndQuery,
430
+ ): {
431
+ nestedItems: {
432
+ @pageItems
433
+ pets: Pet[];
434
+ };
435
+ nestedNext?: {
436
+ @continuationToken nextToken?: string;
437
+ };
438
+ };
439
+
440
+ @scenario
441
+ @scenarioDoc("""
442
+ Test case for using continuation token as pagination with nested response structure. Continuation token is passed in the request header and nested within response body.
443
+
444
+ Two requests need to be tested.
445
+
446
+ 1. Initial request:
447
+ Expected route: /payload/pageable/server-driven-pagination/continuationtoken/request-header-nested-response-body?bar=bar
448
+
449
+ Expected request header:
450
+ foo=foo
451
+
452
+ Expected response body:
453
+ ```json
454
+ { "nestedItems": {
455
+ "pets": [
456
+ { "id": "1", "name": "dog" },
457
+ { "id": "2", "name": "cat" }
458
+ ]
459
+ },
460
+ "next": {
461
+ "nextToken": "page2"
462
+ }
463
+ }
464
+ ```
465
+
466
+ 2. Next page request:
467
+ Expected route: /payload/pageable/server-driven-pagination/continuationtoken/request-header-nested-response-body?bar=bar
468
+
469
+ Expected request header:
470
+ token=page2
471
+ foo=foo
472
+
473
+ Expected response body:
474
+ ```json
475
+ { "nestedItems": {
476
+ "pets": [
477
+ { "id": "3", "name": "bird" },
478
+ { "id": "4", "name": "fish" }
479
+ ]
480
+ }
481
+ }
482
+ ```
483
+ """)
484
+ @route("/request-header-nested-response-body")
485
+ @list
486
+ op requestHeaderNestedResponseBody(
487
+ @continuationToken @header token?: string,
488
+ ...HeaderAndQuery,
489
+ ): {
490
+ nestedItems: {
491
+ @pageItems
492
+ pets: Pet[];
493
+ };
494
+ nestedNext?: {
495
+ @continuationToken nextToken?: string;
496
+ };
497
+ };
498
+ }
499
+ }
500
+
501
+ @route("/pagesize")
502
+ namespace PageSize {
503
+ @scenario
504
+ @scenarioDoc("""
505
+ Test case for simple pagination without nextlink or continuationToken.
506
+
507
+ Single request:
508
+ Expected route: /payload/pageable/pagesize/without-continuation
509
+
510
+ Expected response body:
511
+ ```json
512
+ { "pets": [
513
+ { "id": "1", "name": "dog" },
514
+ { "id": "2", "name": "cat" },
515
+ { "id": "3", "name": "bird" },
516
+ { "id": "4", "name": "fish" }
517
+ ]
518
+ }
519
+ ```
520
+ """)
521
+ @route("/without-continuation")
522
+ @list
523
+ op listWithoutContinuation(): {
524
+ @pageItems
525
+ pets: Pet[];
526
+ };
527
+
528
+ @scenario
529
+ @scenarioDoc("""
530
+ Test case for pagination with a regular @pageSize parameter.
531
+
532
+ Two requests need to be tested:
533
+ 1. Request with pageSize=2:
534
+ Expected route: /payload/pageable/pagesize/list?pageSize=2
535
+
536
+ Expected response body:
537
+ ```json
538
+ { "pets": [
539
+ { "id": "1", "name": "dog" },
540
+ { "id": "2", "name": "cat" }
541
+ ]
542
+ }
543
+ ```
544
+
545
+ 2. Request with pageSize=4:
546
+ Expected route: /payload/pageable/pagesize/list?pageSize=4
547
+
548
+ Expected response body:
549
+ ```json
550
+ { "pets": [
551
+ { "id": "1", "name": "dog" },
552
+ { "id": "2", "name": "cat" },
553
+ { "id": "3", "name": "bird" },
554
+ { "id": "4", "name": "fish" }
555
+ ]
556
+ }
557
+ ```
558
+ """)
559
+ @route("/list")
560
+ @list
561
+ op listWithPageSize(@pageSize @query pageSize?: int32): {
562
+ @pageItems
563
+ pets: Pet[];
564
+ };
565
+ }
566
+
567
+ @doc("An XML pet item.")
568
+ @name("Pet")
569
+ model XmlPet {
570
+ @name("Id") id: string;
571
+ @name("Name") name: string;
572
+ }
573
+
574
+ @route("/xml")
575
+ namespace XmlPagination {
576
+ @scenario
577
+ @scenarioDoc("""
578
+ Test case for XML pagination with continuation token. Continuation token is passed in the request query and response body.
579
+
580
+ Two requests need to be tested.
581
+
582
+ 1. Initial request:
583
+ Expected route: /payload/pageable/xml/list
584
+
585
+ Expected response body:
586
+ ```xml
587
+ <PetListResult>
588
+ <Pets>
589
+ <Pet>
590
+ <Id>1</Id>
591
+ <Name>dog</Name>
592
+ </Pet>
593
+ <Pet>
594
+ <Id>2</Id>
595
+ <Name>cat</Name>
596
+ </Pet>
597
+ </Pets>
598
+ <NextMarker>page2</NextMarker>
599
+ </PetListResult>
600
+ ```
601
+
602
+ 2. Next page request:
603
+ Expected route: /payload/pageable/xml/list?marker=page2
604
+
605
+ Expected response body:
606
+ ```xml
607
+ <PetListResult>
608
+ <Pets>
609
+ <Pet>
610
+ <Id>3</Id>
611
+ <Name>bird</Name>
612
+ </Pet>
613
+ <Pet>
614
+ <Id>4</Id>
615
+ <Name>fish</Name>
616
+ </Pet>
617
+ </Pets>
618
+ </PetListResult>
619
+ ```
620
+ """)
621
+ @route("/list-with-continuation")
622
+ @list
623
+ op listWithContinuation(@continuationToken @query marker?: string): {
624
+ @header("content-type") contentType: "application/xml";
625
+ @body body: XmlPetListResult;
626
+ };
627
+
628
+ @scenario
629
+ @scenarioDoc("""
630
+ Test case for XML pagination with next link.
631
+
632
+ Two requests need to be tested.
633
+
634
+ 1. Initial request:
635
+ Expected route: /payload/pageable/xml/list-with-next-link
636
+
637
+ Expected response body:
638
+ ```xml
639
+ <PetListResult>
640
+ <Pets>
641
+ <Pet>
642
+ <Id>1</Id>
643
+ <Name>dog</Name>
644
+ </Pet>
645
+ <Pet>
646
+ <Id>2</Id>
647
+ <Name>cat</Name>
648
+ </Pet>
649
+ </Pets>
650
+ <NextLink>http://[host]:[port]/payload/pageable/xml/list-with-next-link/nextPage</NextLink>
651
+ </PetListResult>
652
+ ```
653
+
654
+ 2. Next page request:
655
+ Expected route: /payload/pageable/xml/list-with-next-link/nextPage
656
+
657
+ Expected response body:
658
+ ```xml
659
+ <PetListResult>
660
+ <Pets>
661
+ <Pet>
662
+ <Id>3</Id>
663
+ <Name>bird</Name>
664
+ </Pet>
665
+ <Pet>
666
+ <Id>4</Id>
667
+ <Name>fish</Name>
668
+ </Pet>
669
+ </Pets>
670
+ </PetListResult>
671
+ ```
672
+ """)
673
+ @route("/list-with-next-link")
674
+ @list
675
+ op listWithNextLink(): {
676
+ @header("content-type") contentType: "application/xml";
677
+ @body body: XmlPetListResultWithNextLink;
678
+ };
679
+ }
680
+
681
+ @doc("The XML response for listing pets.")
682
+ @name("PetListResult")
683
+ model XmlPetListResult {
684
+ @pageItems
685
+ @name("Pets")
686
+ pets: XmlPet[];
687
+
688
+ @continuationToken
689
+ @name("NextMarker")
690
+ nextMarker?: string;
691
+ }
692
+
693
+ @doc("The XML response for listing pets with next link.")
694
+ @name("PetListResult")
695
+ model XmlPetListResultWithNextLink {
696
+ @pageItems
697
+ @name("Pets")
698
+ pets: XmlPet[];
699
+
700
+ @nextLink
701
+ @name("NextLink")
702
+ nextLink?: url;
55
703
  }