@typespec/http-specs 0.1.0-alpha.9-dev.5 → 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 +256 -2
  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
@@ -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,598 @@ 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
+ @route("/continuationtoken")
145
+ namespace ContinuationToken {
146
+ @scenario
147
+ @scenarioDoc("""
148
+ Test case for using continuation token as pagination. Continuation token is passed in the request query and response body.
149
+
150
+ Two requests need to be tested.
151
+
152
+ 1. Initial request:
153
+ Expected route: /payload/pageable/server-driven-pagination/continuationtoken/request-query-response-body?bar=bar
154
+
155
+ Expected request header:
156
+ foo=foo
157
+
158
+ Expected response body:
159
+ ```json
160
+ { "pets": [
161
+ { "id": "1", "name": "dog" },
162
+ { "id": "2", "name": "cat" }
163
+ ],
164
+ "nextToken": "page2"
165
+ }
166
+ ```
167
+
168
+ 2. Next page request:
169
+ Expected route: /payload/pageable/server-driven-pagination/continuationtoken/request-query-response-body?bar=bar&token=page2
170
+
171
+ Expected request header:
172
+ foo=foo
173
+
174
+ Expected response body:
175
+ ```json
176
+ { "pets": [
177
+ { "id": "3", "name": "bird" },
178
+ { "id": "4", "name": "fish" }
179
+ ]
180
+ }
181
+ ```
182
+ """)
183
+ @route("/request-query-response-body")
184
+ @list
185
+ op requestQueryResponseBody(@continuationToken @query token?: string, ...HeaderAndQuery): {
186
+ @pageItems
187
+ pets: Pet[];
188
+
189
+ @continuationToken nextToken?: string;
190
+ };
191
+
192
+ @scenario
193
+ @scenarioDoc("""
194
+ Test case for using continuation token as pagination. Continuation token is passed in the request header and response body.
195
+
196
+ Two requests need to be tested.
197
+
198
+ 1. Initial request:
199
+ Expected route: /payload/pageable/server-driven-pagination/continuationtoken/request-header-response-body?bar=bar
200
+
201
+ Expected request header:
202
+ foo=foo
203
+
204
+ Expected response body:
205
+ ```json
206
+ { "pets": [
207
+ { "id": "1", "name": "dog" },
208
+ { "id": "2", "name": "cat" }
209
+ ],
210
+ "nextToken": "page2"
211
+ }
212
+ ```
213
+
214
+ 2. Next page request:
215
+ Expected route: /payload/pageable/server-driven-pagination/continuationtoken/request-header-response-body?bar=bar
216
+
217
+ Expected request header:
218
+ token=page2
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-header-response-body")
231
+ @list
232
+ op requestHeaderResponseBody(@continuationToken @header 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 query and response header.
242
+
243
+ Two requests need to be tested.
244
+
245
+ 1. Initial request:
246
+ Expected route: /payload/pageable/server-driven-pagination/continuationtoken/request-query-response-header?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
+ }
258
+ ```
259
+
260
+ Expected response header:
261
+ next-token=page2
262
+
263
+ 2. Next page request:
264
+ Expected route: /payload/pageable/server-driven-pagination/continuationtoken/request-query-response-header?bar=bar&token=page2
265
+
266
+ Expected request header:
267
+ foo=foo
268
+
269
+ Expected response body:
270
+ ```json
271
+ { "pets": [
272
+ { "id": "3", "name": "bird" },
273
+ { "id": "4", "name": "fish" }
274
+ ]
275
+ }
276
+ ```
277
+ """)
278
+ @route("/request-query-response-header")
279
+ @list
280
+ op requestQueryResponseHeader(@continuationToken @query token?: string, ...HeaderAndQuery): {
281
+ @pageItems
282
+ pets: Pet[];
283
+
284
+ @continuationToken @header nextToken?: string;
285
+ };
286
+
287
+ @scenario
288
+ @scenarioDoc("""
289
+ Test case for using continuation token as pagination. Continuation token is passed in the request header and response header.
290
+
291
+ Two requests need to be tested.
292
+ 1. Initial request:
293
+ Expected route: /payload/pageable/server-driven-pagination/continuationtoken/request-header-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-header-response-header?bar=bar
312
+
313
+ Expected request header:
314
+ token=page2
315
+ foo=foo
316
+
317
+ Expected response body:
318
+ ```json
319
+ { "pets": [
320
+ { "id": "3", "name": "bird" },
321
+ { "id": "4", "name": "fish" }
322
+ ]
323
+ }
324
+ ```
325
+ """)
326
+ @route("/request-header-response-header")
327
+ @list
328
+ op requestHeaderResponseHeader(@continuationToken @header token?: string, ...HeaderAndQuery): {
329
+ @pageItems
330
+ pets: Pet[];
331
+
332
+ @continuationToken @header nextToken?: string;
333
+ };
334
+
335
+ @scenario
336
+ @scenarioDoc("""
337
+ 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.
338
+
339
+ Two requests need to be tested.
340
+
341
+ 1. Initial request:
342
+ Expected route: /payload/pageable/server-driven-pagination/continuationtoken/request-query-nested-response-body?bar=bar
343
+
344
+ Expected request header:
345
+ foo=foo
346
+
347
+ Expected response body:
348
+ ```json
349
+ { "nestedItems": {
350
+ "pets": [
351
+ { "id": "1", "name": "dog" },
352
+ { "id": "2", "name": "cat" }
353
+ ]
354
+ },
355
+ "nestedNext": {
356
+ "nextToken": "page2"
357
+ }
358
+ }
359
+ ```
360
+
361
+ 2. Next page request:
362
+ Expected route: /payload/pageable/server-driven-pagination/continuationtoken/request-query-nested-response-body?bar=bar&token=page2
363
+
364
+ Expected request header:
365
+ foo=foo
366
+
367
+ Expected response body:
368
+ ```json
369
+ { "nestedItems": {
370
+ "pets": [
371
+ { "id": "3", "name": "bird" },
372
+ { "id": "4", "name": "fish" }
373
+ ]
374
+ }
375
+ }
376
+ ```
377
+ """)
378
+ @route("/request-query-nested-response-body")
379
+ @list
380
+ op requestQueryNestedResponseBody(
381
+ @continuationToken @query token?: string,
382
+ ...HeaderAndQuery,
383
+ ): {
384
+ nestedItems: {
385
+ @pageItems
386
+ pets: Pet[];
387
+ };
388
+ nestedNext?: {
389
+ @continuationToken nextToken?: string;
390
+ };
391
+ };
392
+
393
+ @scenario
394
+ @scenarioDoc("""
395
+ 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.
396
+
397
+ Two requests need to be tested.
398
+
399
+ 1. Initial request:
400
+ Expected route: /payload/pageable/server-driven-pagination/continuationtoken/request-header-nested-response-body?bar=bar
401
+
402
+ Expected request header:
403
+ foo=foo
404
+
405
+ Expected response body:
406
+ ```json
407
+ { "nestedItems": {
408
+ "pets": [
409
+ { "id": "1", "name": "dog" },
410
+ { "id": "2", "name": "cat" }
411
+ ]
412
+ },
413
+ "next": {
414
+ "nextToken": "page2"
415
+ }
416
+ }
417
+ ```
418
+
419
+ 2. Next page request:
420
+ Expected route: /payload/pageable/server-driven-pagination/continuationtoken/request-header-nested-response-body?bar=bar
421
+
422
+ Expected request header:
423
+ token=page2
424
+ foo=foo
425
+
426
+ Expected response body:
427
+ ```json
428
+ { "nestedItems": {
429
+ "pets": [
430
+ { "id": "3", "name": "bird" },
431
+ { "id": "4", "name": "fish" }
432
+ ]
433
+ }
434
+ }
435
+ ```
436
+ """)
437
+ @route("/request-header-nested-response-body")
438
+ @list
439
+ op requestHeaderNestedResponseBody(
440
+ @continuationToken @header token?: string,
441
+ ...HeaderAndQuery,
442
+ ): {
443
+ nestedItems: {
444
+ @pageItems
445
+ pets: Pet[];
446
+ };
447
+ nestedNext?: {
448
+ @continuationToken nextToken?: string;
449
+ };
450
+ };
451
+ }
452
+ }
453
+
454
+ @route("/pagesize")
455
+ namespace PageSize {
456
+ @scenario
457
+ @scenarioDoc("""
458
+ Test case for simple pagination without nextlink or continuationToken.
459
+
460
+ Single request:
461
+ Expected route: /payload/pageable/pagesize/without-continuation
462
+
463
+ Expected response body:
464
+ ```json
465
+ { "pets": [
466
+ { "id": "1", "name": "dog" },
467
+ { "id": "2", "name": "cat" },
468
+ { "id": "3", "name": "bird" },
469
+ { "id": "4", "name": "fish" }
470
+ ]
471
+ }
472
+ ```
473
+ """)
474
+ @route("/without-continuation")
475
+ @list
476
+ op listWithoutContinuation(): {
477
+ @pageItems
478
+ pets: Pet[];
479
+ };
480
+
481
+ @scenario
482
+ @scenarioDoc("""
483
+ Test case for pagination with a regular @pageSize parameter.
484
+
485
+ Two requests need to be tested:
486
+ 1. Request with pageSize=2:
487
+ Expected route: /payload/pageable/pagesize/list?pageSize=2
488
+
489
+ Expected response body:
490
+ ```json
491
+ { "pets": [
492
+ { "id": "1", "name": "dog" },
493
+ { "id": "2", "name": "cat" }
494
+ ]
495
+ }
496
+ ```
497
+
498
+ 2. Request with pageSize=4:
499
+ Expected route: /payload/pageable/pagesize/list?pageSize=4
500
+
501
+ Expected response body:
502
+ ```json
503
+ { "pets": [
504
+ { "id": "1", "name": "dog" },
505
+ { "id": "2", "name": "cat" },
506
+ { "id": "3", "name": "bird" },
507
+ { "id": "4", "name": "fish" }
508
+ ]
509
+ }
510
+ ```
511
+ """)
512
+ @route("/list")
513
+ @list
514
+ op listWithPageSize(@pageSize @query pageSize?: int32): {
515
+ @pageItems
516
+ pets: Pet[];
517
+ };
518
+ }
519
+
520
+ @doc("An XML pet item.")
521
+ @name("Pet")
522
+ model XmlPet {
523
+ @name("Id") id: string;
524
+ @name("Name") name: string;
525
+ }
526
+
527
+ @route("/xml")
528
+ namespace XmlPagination {
529
+ @scenario
530
+ @scenarioDoc("""
531
+ Test case for XML pagination with continuation token. Continuation token is passed in the request query and response body.
532
+
533
+ Two requests need to be tested.
534
+
535
+ 1. Initial request:
536
+ Expected route: /payload/pageable/xml/list
537
+
538
+ Expected response body:
539
+ ```xml
540
+ <PetListResult>
541
+ <Pets>
542
+ <Pet>
543
+ <Id>1</Id>
544
+ <Name>dog</Name>
545
+ </Pet>
546
+ <Pet>
547
+ <Id>2</Id>
548
+ <Name>cat</Name>
549
+ </Pet>
550
+ </Pets>
551
+ <NextMarker>page2</NextMarker>
552
+ </PetListResult>
553
+ ```
554
+
555
+ 2. Next page request:
556
+ Expected route: /payload/pageable/xml/list?marker=page2
557
+
558
+ Expected response body:
559
+ ```xml
560
+ <PetListResult>
561
+ <Pets>
562
+ <Pet>
563
+ <Id>3</Id>
564
+ <Name>bird</Name>
565
+ </Pet>
566
+ <Pet>
567
+ <Id>4</Id>
568
+ <Name>fish</Name>
569
+ </Pet>
570
+ </Pets>
571
+ </PetListResult>
572
+ ```
573
+ """)
574
+ @route("/list-with-continuation")
575
+ @list
576
+ op listWithContinuation(@continuationToken @query marker?: string): {
577
+ @header("content-type") contentType: "application/xml";
578
+ @body body: XmlPetListResult;
579
+ };
580
+
581
+ @scenario
582
+ @scenarioDoc("""
583
+ Test case for XML pagination with next link.
584
+
585
+ Two requests need to be tested.
586
+
587
+ 1. Initial request:
588
+ Expected route: /payload/pageable/xml/list-with-next-link
589
+
590
+ Expected response body:
591
+ ```xml
592
+ <PetListResult>
593
+ <Pets>
594
+ <Pet>
595
+ <Id>1</Id>
596
+ <Name>dog</Name>
597
+ </Pet>
598
+ <Pet>
599
+ <Id>2</Id>
600
+ <Name>cat</Name>
601
+ </Pet>
602
+ </Pets>
603
+ <NextLink>http://[host]:[port]/payload/pageable/xml/list-with-next-link/nextPage</NextLink>
604
+ </PetListResult>
605
+ ```
606
+
607
+ 2. Next page request:
608
+ Expected route: /payload/pageable/xml/list-with-next-link/nextPage
609
+
610
+ Expected response body:
611
+ ```xml
612
+ <PetListResult>
613
+ <Pets>
614
+ <Pet>
615
+ <Id>3</Id>
616
+ <Name>bird</Name>
617
+ </Pet>
618
+ <Pet>
619
+ <Id>4</Id>
620
+ <Name>fish</Name>
621
+ </Pet>
622
+ </Pets>
623
+ </PetListResult>
624
+ ```
625
+ """)
626
+ @route("/list-with-next-link")
627
+ @list
628
+ op listWithNextLink(): {
629
+ @header("content-type") contentType: "application/xml";
630
+ @body body: XmlPetListResultWithNextLink;
631
+ };
632
+ }
633
+
634
+ @doc("The XML response for listing pets.")
635
+ @name("PetListResult")
636
+ model XmlPetListResult {
637
+ @pageItems
638
+ @name("Pets")
639
+ pets: XmlPet[];
640
+
641
+ @continuationToken
642
+ @name("NextMarker")
643
+ nextMarker?: string;
644
+ }
645
+
646
+ @doc("The XML response for listing pets with next link.")
647
+ @name("PetListResult")
648
+ model XmlPetListResultWithNextLink {
649
+ @pageItems
650
+ @name("Pets")
651
+ pets: XmlPet[];
652
+
653
+ @nextLink
654
+ @name("NextLink")
655
+ nextLink?: url;
55
656
  }