@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
@@ -1,12 +1,218 @@
1
- import { json, MockRequest, passOnSuccess, ScenarioMockApi } from "@typespec/spec-api";
1
+ import {
2
+ dyn,
3
+ dynItem,
4
+ json,
5
+ MockRequest,
6
+ passOnSuccess,
7
+ ScenarioMockApi,
8
+ ValidationError,
9
+ xml,
10
+ } from "@typespec/spec-api";
2
11
 
3
12
  export const Scenarios: Record<string, ScenarioMockApi> = {};
4
13
 
14
+ const FirstPage = [
15
+ { id: "1", name: "dog" },
16
+ { id: "2", name: "cat" },
17
+ ];
18
+
19
+ const SecondPage = [
20
+ { id: "3", name: "bird" },
21
+ { id: "4", name: "fish" },
22
+ ];
23
+
24
+ const FirstResponseTokenInBody = {
25
+ status: 200,
26
+ body: json({
27
+ pets: FirstPage,
28
+ nextToken: "page2",
29
+ }),
30
+ };
31
+
32
+ const SecondResponse = {
33
+ status: 200,
34
+ body: json({
35
+ pets: SecondPage,
36
+ }),
37
+ };
38
+
39
+ const FirstResponseTokenInHeader = {
40
+ status: 200,
41
+ body: json({
42
+ pets: FirstPage,
43
+ }),
44
+ headers: {
45
+ "next-token": "page2",
46
+ foo: "foo",
47
+ },
48
+ };
49
+
50
+ const RequestTokenInQuery = {
51
+ query: { token: "page2", bar: "bar" },
52
+ headers: { foo: "foo" },
53
+ };
54
+
55
+ const RequestTokenInHeader = { headers: { token: "page2", foo: "foo" }, query: { bar: "bar" } };
56
+
57
+ function createTests(reqInfo: "query" | "header", resInfo: "body" | "header") {
58
+ const uri = `/payload/pageable/server-driven-pagination/continuationtoken/request-${reqInfo}-response-${resInfo}`;
59
+ function createHandler() {
60
+ return (req: MockRequest) => {
61
+ req.expect.containsHeader("foo", "foo");
62
+ req.expect.containsQueryParam("bar", "bar");
63
+ const token = reqInfo === "header" ? req.headers?.token : req.query?.token;
64
+ switch (token) {
65
+ case undefined:
66
+ return resInfo === "header" ? FirstResponseTokenInHeader : FirstResponseTokenInBody;
67
+ case "page2":
68
+ return SecondResponse;
69
+ default:
70
+ throw new ValidationError(
71
+ "Unsupported continuation token",
72
+ `"undefined" | "page2"`,
73
+ token,
74
+ );
75
+ }
76
+ };
77
+ }
78
+
79
+ return passOnSuccess([
80
+ {
81
+ uri: uri,
82
+ method: "get",
83
+ request: { headers: { foo: "foo" }, query: { bar: "bar" } },
84
+ response: resInfo === "header" ? FirstResponseTokenInHeader : FirstResponseTokenInBody,
85
+ handler: createHandler(),
86
+ kind: "MockApiDefinition",
87
+ },
88
+ {
89
+ uri: uri,
90
+ method: "get",
91
+ request: reqInfo === "header" ? RequestTokenInHeader : RequestTokenInQuery,
92
+ response: SecondResponse,
93
+ handler: createHandler(),
94
+ kind: "MockApiDefinition",
95
+ },
96
+ ]);
97
+ }
98
+
5
99
  Scenarios.Payload_Pageable_ServerDrivenPagination_link = passOnSuccess([
6
100
  {
7
101
  uri: "/payload/pageable/server-driven-pagination/link",
8
102
  method: "get",
9
103
  request: {},
104
+ response: {
105
+ status: 200,
106
+ body: json({
107
+ pets: FirstPage,
108
+ next: dyn`${dynItem("baseUrl")}/payload/pageable/server-driven-pagination/link/nextPage`,
109
+ }),
110
+ },
111
+ kind: "MockApiDefinition",
112
+ },
113
+ {
114
+ uri: "/payload/pageable/server-driven-pagination/link/nextPage",
115
+ method: "get",
116
+ request: {},
117
+ response: SecondResponse,
118
+ kind: "MockApiDefinition",
119
+ },
120
+ ]);
121
+
122
+ Scenarios.Payload_Pageable_ServerDrivenPagination_linkString = passOnSuccess([
123
+ {
124
+ uri: "/payload/pageable/server-driven-pagination/link-string",
125
+ method: "get",
126
+ request: {},
127
+ response: {
128
+ status: 200,
129
+ body: json({
130
+ pets: FirstPage,
131
+ next: dyn`${dynItem("baseUrl")}/payload/pageable/server-driven-pagination/link-string/nextPage`,
132
+ }),
133
+ },
134
+ kind: "MockApiDefinition",
135
+ },
136
+ {
137
+ uri: "/payload/pageable/server-driven-pagination/link-string/nextPage",
138
+ method: "get",
139
+ request: {},
140
+ response: SecondResponse,
141
+ kind: "MockApiDefinition",
142
+ },
143
+ ]);
144
+
145
+ Scenarios.Payload_Pageable_ServerDrivenPagination_nestedLink = passOnSuccess([
146
+ {
147
+ uri: "/payload/pageable/server-driven-pagination/nested-link",
148
+ method: "get",
149
+ request: {},
150
+ response: {
151
+ status: 200,
152
+ body: json({
153
+ nestedItems: {
154
+ pets: FirstPage,
155
+ },
156
+ nestedNext: {
157
+ next: dyn`${dynItem("baseUrl")}/payload/pageable/server-driven-pagination/nested-link/nextPage`,
158
+ },
159
+ }),
160
+ },
161
+ kind: "MockApiDefinition",
162
+ },
163
+ {
164
+ uri: "/payload/pageable/server-driven-pagination/nested-link/nextPage",
165
+ method: "get",
166
+ request: {},
167
+ response: {
168
+ status: 200,
169
+ body: json({
170
+ nestedItems: {
171
+ pets: SecondPage,
172
+ },
173
+ }),
174
+ },
175
+ kind: "MockApiDefinition",
176
+ },
177
+ ]);
178
+
179
+ Scenarios.Payload_Pageable_ServerDrivenPagination_ContinuationToken_requestQueryResponseBody =
180
+ createTests("query", "body");
181
+
182
+ Scenarios.Payload_Pageable_ServerDrivenPagination_ContinuationToken_requestHeaderResponseBody =
183
+ createTests("header", "body");
184
+
185
+ Scenarios.Payload_Pageable_ServerDrivenPagination_ContinuationToken_requestQueryResponseHeader =
186
+ createTests("query", "header");
187
+
188
+ Scenarios.Payload_Pageable_ServerDrivenPagination_ContinuationToken_requestHeaderResponseHeader =
189
+ createTests("header", "header");
190
+
191
+ Scenarios.Payload_Pageable_PageSize_listWithoutContinuation = passOnSuccess([
192
+ {
193
+ uri: "/payload/pageable/pagesize/without-continuation",
194
+ method: "get",
195
+ request: {},
196
+ response: {
197
+ status: 200,
198
+ body: json({
199
+ pets: [
200
+ { id: "1", name: "dog" },
201
+ { id: "2", name: "cat" },
202
+ { id: "3", name: "bird" },
203
+ { id: "4", name: "fish" },
204
+ ],
205
+ }),
206
+ },
207
+ kind: "MockApiDefinition",
208
+ },
209
+ ]);
210
+
211
+ Scenarios.Payload_Pageable_PageSize_listWithPageSize = passOnSuccess([
212
+ {
213
+ uri: "/payload/pageable/pagesize/list",
214
+ method: "get",
215
+ request: { query: { pageSize: "2" } },
10
216
  response: {
11
217
  status: 200,
12
218
  body: json({
@@ -14,36 +220,472 @@ Scenarios.Payload_Pageable_ServerDrivenPagination_link = passOnSuccess([
14
220
  { id: "1", name: "dog" },
15
221
  { id: "2", name: "cat" },
16
222
  ],
17
- next: "/payload/pageable/server-driven-pagination/link/nextPage",
18
223
  }),
19
224
  },
20
225
  handler: (req: MockRequest) => {
21
- return {
22
- status: 200,
23
- body: json({
24
- pets: [
25
- { id: "1", name: "dog" },
26
- { id: "2", name: "cat" },
27
- ],
28
- next: `${req.baseUrl}/payload/pageable/server-driven-pagination/link/nextPage`,
29
- }),
30
- };
226
+ const pageSize = req.query?.pageSize;
227
+
228
+ switch (pageSize) {
229
+ case "2":
230
+ return {
231
+ status: 200,
232
+ body: json({
233
+ pets: [
234
+ { id: "1", name: "dog" },
235
+ { id: "2", name: "cat" },
236
+ ],
237
+ }),
238
+ };
239
+ case "4":
240
+ return {
241
+ status: 200,
242
+ body: json({
243
+ pets: [
244
+ { id: "1", name: "dog" },
245
+ { id: "2", name: "cat" },
246
+ { id: "3", name: "bird" },
247
+ { id: "4", name: "fish" },
248
+ ],
249
+ }),
250
+ };
251
+ default:
252
+ throw new ValidationError("Unsupported page size", `"2" | "4"`, pageSize);
253
+ }
31
254
  },
32
255
  kind: "MockApiDefinition",
33
256
  },
34
257
  {
35
- uri: "/payload/pageable/server-driven-pagination/link/nextPage",
258
+ uri: "/payload/pageable/pagesize/list",
36
259
  method: "get",
37
- request: {},
260
+ request: { query: { pageSize: "4" } },
38
261
  response: {
39
262
  status: 200,
40
263
  body: json({
41
264
  pets: [
265
+ { id: "1", name: "dog" },
266
+ { id: "2", name: "cat" },
42
267
  { id: "3", name: "bird" },
43
268
  { id: "4", name: "fish" },
44
269
  ],
45
270
  }),
46
271
  },
272
+ handler: (req: MockRequest) => {
273
+ const pageSize = req.query?.pageSize;
274
+
275
+ switch (pageSize) {
276
+ case "2":
277
+ return {
278
+ status: 200,
279
+ body: json({
280
+ pets: [
281
+ { id: "1", name: "dog" },
282
+ { id: "2", name: "cat" },
283
+ ],
284
+ }),
285
+ };
286
+ case "4":
287
+ return {
288
+ status: 200,
289
+ body: json({
290
+ pets: [
291
+ { id: "1", name: "dog" },
292
+ { id: "2", name: "cat" },
293
+ { id: "3", name: "bird" },
294
+ { id: "4", name: "fish" },
295
+ ],
296
+ }),
297
+ };
298
+ default:
299
+ throw new ValidationError("Unsupported page size", `"2" | "4"`, pageSize);
300
+ }
301
+ },
302
+ kind: "MockApiDefinition",
303
+ },
304
+ ]);
305
+
306
+ Scenarios.Payload_Pageable_ServerDrivenPagination_ContinuationToken_requestQueryNestedResponseBody =
307
+ passOnSuccess([
308
+ {
309
+ uri: "/payload/pageable/server-driven-pagination/continuationtoken/request-query-nested-response-body",
310
+ method: "get",
311
+ request: { headers: { foo: "foo" }, query: { bar: "bar" } },
312
+ response: {
313
+ status: 200,
314
+ body: json({
315
+ nestedItems: {
316
+ pets: FirstPage,
317
+ },
318
+ nestedNext: {
319
+ nextToken: "page2",
320
+ },
321
+ }),
322
+ },
323
+ handler: (req: MockRequest) => {
324
+ req.expect.containsHeader("foo", "foo");
325
+ req.expect.containsQueryParam("bar", "bar");
326
+ const token = req.query?.token;
327
+
328
+ switch (token) {
329
+ case undefined:
330
+ return {
331
+ status: 200,
332
+ body: json({
333
+ nestedItems: {
334
+ pets: FirstPage,
335
+ },
336
+ nestedNext: {
337
+ nextToken: "page2",
338
+ },
339
+ }),
340
+ };
341
+ case "page2":
342
+ return {
343
+ status: 200,
344
+ body: json({
345
+ nestedItems: {
346
+ pets: SecondPage,
347
+ },
348
+ }),
349
+ };
350
+ default:
351
+ throw new ValidationError(
352
+ "Unsupported continuation token",
353
+ `"undefined" | "page2"`,
354
+ token,
355
+ );
356
+ }
357
+ },
358
+ kind: "MockApiDefinition",
359
+ },
360
+ {
361
+ uri: "/payload/pageable/server-driven-pagination/continuationtoken/request-query-nested-response-body",
362
+ method: "get",
363
+ request: RequestTokenInQuery,
364
+ response: {
365
+ status: 200,
366
+ body: json({
367
+ nestedItems: {
368
+ pets: SecondPage,
369
+ },
370
+ }),
371
+ },
372
+ handler: (req: MockRequest) => {
373
+ req.expect.containsHeader("foo", "foo");
374
+ req.expect.containsQueryParam("bar", "bar");
375
+ const token = req.query?.token;
376
+
377
+ switch (token) {
378
+ case undefined:
379
+ return {
380
+ status: 200,
381
+ body: json({
382
+ nestedItems: {
383
+ pets: FirstPage,
384
+ },
385
+ nestedNext: {
386
+ nextToken: "page2",
387
+ },
388
+ }),
389
+ };
390
+ case "page2":
391
+ return {
392
+ status: 200,
393
+ body: json({
394
+ nestedItems: {
395
+ pets: SecondPage,
396
+ },
397
+ }),
398
+ };
399
+ default:
400
+ throw new ValidationError(
401
+ "Unsupported continuation token",
402
+ `"undefined" | "page2"`,
403
+ token,
404
+ );
405
+ }
406
+ },
407
+ kind: "MockApiDefinition",
408
+ },
409
+ ]);
410
+
411
+ Scenarios.Payload_Pageable_ServerDrivenPagination_ContinuationToken_requestHeaderNestedResponseBody =
412
+ passOnSuccess([
413
+ {
414
+ uri: "/payload/pageable/server-driven-pagination/continuationtoken/request-header-nested-response-body",
415
+ method: "get",
416
+ request: { headers: { foo: "foo" }, query: { bar: "bar" } },
417
+ response: {
418
+ status: 200,
419
+ body: json({
420
+ nestedItems: {
421
+ pets: FirstPage,
422
+ },
423
+ nestedNext: {
424
+ nextToken: "page2",
425
+ },
426
+ }),
427
+ },
428
+ handler: (req: MockRequest) => {
429
+ req.expect.containsHeader("foo", "foo");
430
+ req.expect.containsQueryParam("bar", "bar");
431
+ const token = req.headers?.token;
432
+
433
+ switch (token) {
434
+ case undefined:
435
+ return {
436
+ status: 200,
437
+ body: json({
438
+ nestedItems: {
439
+ pets: FirstPage,
440
+ },
441
+ nestedNext: {
442
+ nextToken: "page2",
443
+ },
444
+ }),
445
+ };
446
+ case "page2":
447
+ return {
448
+ status: 200,
449
+ body: json({
450
+ nestedItems: {
451
+ pets: SecondPage,
452
+ },
453
+ }),
454
+ };
455
+ default:
456
+ throw new ValidationError(
457
+ "Unsupported continuation token",
458
+ `"undefined" | "page2"`,
459
+ token,
460
+ );
461
+ }
462
+ },
463
+ kind: "MockApiDefinition",
464
+ },
465
+ {
466
+ uri: "/payload/pageable/server-driven-pagination/continuationtoken/request-header-nested-response-body",
467
+ method: "get",
468
+ request: RequestTokenInHeader,
469
+ response: {
470
+ status: 200,
471
+ body: json({
472
+ nestedItems: {
473
+ pets: SecondPage,
474
+ },
475
+ }),
476
+ },
477
+ handler: (req: MockRequest) => {
478
+ req.expect.containsHeader("foo", "foo");
479
+ req.expect.containsQueryParam("bar", "bar");
480
+ const token = req.headers?.token;
481
+
482
+ switch (token) {
483
+ case undefined:
484
+ return {
485
+ status: 200,
486
+ body: json({
487
+ nestedItems: {
488
+ pets: FirstPage,
489
+ },
490
+ nestedNext: {
491
+ nextToken: "page2",
492
+ },
493
+ }),
494
+ };
495
+ case "page2":
496
+ return {
497
+ status: 200,
498
+ body: json({
499
+ nestedItems: {
500
+ pets: SecondPage,
501
+ },
502
+ }),
503
+ };
504
+ default:
505
+ throw new ValidationError(
506
+ "Unsupported continuation token",
507
+ `"undefined" | "page2"`,
508
+ token,
509
+ );
510
+ }
511
+ },
512
+ kind: "MockApiDefinition",
513
+ },
514
+ ]);
515
+
516
+ const XmlContTokenFirstPage = `
517
+ <PetListResult>
518
+ <Pets>
519
+ <Pet>
520
+ <Id>1</Id>
521
+ <Name>dog</Name>
522
+ </Pet>
523
+ <Pet>
524
+ <Id>2</Id>
525
+ <Name>cat</Name>
526
+ </Pet>
527
+ </Pets>
528
+ <NextMarker>page2</NextMarker>
529
+ </PetListResult>
530
+ `;
531
+
532
+ const XmlContTokenSecondPage = `
533
+ <PetListResult>
534
+ <Pets>
535
+ <Pet>
536
+ <Id>3</Id>
537
+ <Name>bird</Name>
538
+ </Pet>
539
+ <Pet>
540
+ <Id>4</Id>
541
+ <Name>fish</Name>
542
+ </Pet>
543
+ </Pets>
544
+ </PetListResult>
545
+ `;
546
+
547
+ Scenarios.Payload_Pageable_XmlPagination_listWithContinuation = passOnSuccess([
548
+ {
549
+ uri: "/payload/pageable/xml/list-with-continuation",
550
+ method: "get",
551
+ request: {},
552
+ response: {
553
+ status: 200,
554
+ body: xml(XmlContTokenFirstPage),
555
+ headers: {
556
+ "content-type": "application/xml",
557
+ },
558
+ },
559
+ handler: (req: MockRequest) => {
560
+ const marker = req.query?.marker;
561
+
562
+ switch (marker) {
563
+ case undefined:
564
+ return {
565
+ status: 200,
566
+ body: xml(XmlContTokenFirstPage),
567
+ headers: {
568
+ "content-type": "application/xml",
569
+ },
570
+ };
571
+ case "page2":
572
+ return {
573
+ status: 200,
574
+ body: xml(XmlContTokenSecondPage),
575
+ headers: {
576
+ "content-type": "application/xml",
577
+ },
578
+ };
579
+ default:
580
+ throw new ValidationError("Unsupported marker", `"undefined" | "page2"`, marker);
581
+ }
582
+ },
583
+ kind: "MockApiDefinition",
584
+ },
585
+ {
586
+ uri: "/payload/pageable/xml/list-with-continuation",
587
+ method: "get",
588
+ request: { query: { marker: "page2" } },
589
+ response: {
590
+ status: 200,
591
+ body: xml(XmlContTokenSecondPage),
592
+ headers: {
593
+ "content-type": "application/xml",
594
+ },
595
+ },
596
+ handler: (req: MockRequest) => {
597
+ const marker = req.query?.marker;
598
+
599
+ switch (marker) {
600
+ case undefined:
601
+ return {
602
+ status: 200,
603
+ body: xml(XmlContTokenFirstPage),
604
+ headers: {
605
+ "content-type": "application/xml",
606
+ },
607
+ };
608
+ case "page2":
609
+ return {
610
+ status: 200,
611
+ body: xml(XmlContTokenSecondPage),
612
+ headers: {
613
+ "content-type": "application/xml",
614
+ },
615
+ };
616
+ default:
617
+ throw new ValidationError("Unsupported marker", `"undefined" | "page2"`, marker);
618
+ }
619
+ },
620
+ kind: "MockApiDefinition",
621
+ },
622
+ ]);
623
+
624
+ const xmlNextLinkFirstPage = (baseUrl: string) => `
625
+ <PetListResult>
626
+ <Pets>
627
+ <Pet>
628
+ <Id>1</Id>
629
+ <Name>dog</Name>
630
+ </Pet>
631
+ <Pet>
632
+ <Id>2</Id>
633
+ <Name>cat</Name>
634
+ </Pet>
635
+ </Pets>
636
+ <NextLink>${baseUrl}/payload/pageable/xml/list-with-next-link/nextPage</NextLink>
637
+ </PetListResult>
638
+ `;
639
+
640
+ const XmlNextLinkSecondPage = `
641
+ <PetListResult>
642
+ <Pets>
643
+ <Pet>
644
+ <Id>3</Id>
645
+ <Name>bird</Name>
646
+ </Pet>
647
+ <Pet>
648
+ <Id>4</Id>
649
+ <Name>fish</Name>
650
+ </Pet>
651
+ </Pets>
652
+ </PetListResult>
653
+ `;
654
+
655
+ Scenarios.Payload_Pageable_XmlPagination_listWithNextLink = passOnSuccess([
656
+ {
657
+ uri: "/payload/pageable/xml/list-with-next-link",
658
+ method: "get",
659
+ request: {},
660
+ response: {
661
+ status: 200,
662
+ body: xml(xmlNextLinkFirstPage("PLACEHOLDER_BASE_URL")),
663
+ headers: {
664
+ "content-type": "application/xml",
665
+ },
666
+ },
667
+ handler: (req: MockRequest) => {
668
+ return {
669
+ status: 200,
670
+ body: xml(xmlNextLinkFirstPage(req.baseUrl)),
671
+ headers: {
672
+ "content-type": "application/xml",
673
+ },
674
+ };
675
+ },
676
+ kind: "MockApiDefinition",
677
+ },
678
+ {
679
+ uri: "/payload/pageable/xml/list-with-next-link/nextPage",
680
+ method: "get",
681
+ request: {},
682
+ response: {
683
+ status: 200,
684
+ body: xml(XmlNextLinkSecondPage),
685
+ headers: {
686
+ "content-type": "application/xml",
687
+ },
688
+ },
47
689
  kind: "MockApiDefinition",
48
690
  },
49
691
  ]);