@typespec/http-specs 0.1.0-alpha.2 → 0.1.0-alpha.20

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 (186) hide show
  1. package/CHANGELOG.md +146 -0
  2. package/README.md +11 -3
  3. package/dist/specs/encode/bytes/mockapi.js +16 -24
  4. package/dist/specs/encode/bytes/mockapi.js.map +1 -1
  5. package/dist/specs/encode/datetime/mockapi.js +2 -2
  6. package/dist/specs/encode/datetime/mockapi.js.map +1 -1
  7. package/dist/specs/encode/duration/mockapi.js +2 -2
  8. package/dist/specs/encode/duration/mockapi.js.map +1 -1
  9. package/dist/specs/encode/numeric/mockapi.js +2 -2
  10. package/dist/specs/encode/numeric/mockapi.js.map +1 -1
  11. package/dist/specs/helper.d.ts +2 -2
  12. package/dist/specs/helper.d.ts.map +1 -1
  13. package/dist/specs/parameters/basic/mockapi.d.ts.map +1 -1
  14. package/dist/specs/parameters/basic/mockapi.js +3 -3
  15. package/dist/specs/parameters/basic/mockapi.js.map +1 -1
  16. package/dist/specs/parameters/body-optionality/mockapi.d.ts.map +1 -1
  17. package/dist/specs/parameters/body-optionality/mockapi.js +4 -4
  18. package/dist/specs/parameters/body-optionality/mockapi.js.map +1 -1
  19. package/dist/specs/parameters/collection-format/mockapi.js +4 -15
  20. package/dist/specs/parameters/collection-format/mockapi.js.map +1 -1
  21. package/dist/specs/parameters/path/mockapi.d.ts.map +1 -0
  22. package/dist/specs/parameters/path/mockapi.js +29 -0
  23. package/dist/specs/parameters/path/mockapi.js.map +1 -0
  24. package/dist/specs/parameters/spread/mockapi.d.ts.map +1 -1
  25. package/dist/specs/parameters/spread/mockapi.js +19 -19
  26. package/dist/specs/parameters/spread/mockapi.js.map +1 -1
  27. package/dist/specs/payload/json-merge-patch/mockapi.js +4 -4
  28. package/dist/specs/payload/json-merge-patch/mockapi.js.map +1 -1
  29. package/dist/specs/payload/media-type/mockapi.js +2 -2
  30. package/dist/specs/payload/media-type/mockapi.js.map +1 -1
  31. package/dist/specs/payload/multipart/mockapi.d.ts.map +1 -1
  32. package/dist/specs/payload/multipart/mockapi.js +42 -60
  33. package/dist/specs/payload/multipart/mockapi.js.map +1 -1
  34. package/dist/specs/payload/pageable/mockapi.d.ts +3 -0
  35. package/dist/specs/payload/pageable/mockapi.d.ts.map +1 -0
  36. package/dist/specs/payload/pageable/mockapi.js +115 -0
  37. package/dist/specs/payload/pageable/mockapi.js.map +1 -0
  38. package/dist/specs/payload/xml/mockapi.js +1 -4
  39. package/dist/specs/payload/xml/mockapi.js.map +1 -1
  40. package/dist/specs/response/status-code-range/mockapi.d.ts +3 -0
  41. package/dist/specs/response/status-code-range/mockapi.d.ts.map +1 -0
  42. package/dist/specs/response/status-code-range/mockapi.js +29 -0
  43. package/dist/specs/response/status-code-range/mockapi.js.map +1 -0
  44. package/dist/specs/routes/mockapi.js +25 -25
  45. package/dist/specs/routes/mockapi.js.map +1 -1
  46. package/dist/specs/serialization/encoded-name/json/mockapi.js +1 -1
  47. package/dist/specs/serialization/encoded-name/json/mockapi.js.map +1 -1
  48. package/dist/specs/server/versions/not-versioned/mockapi.js +1 -1
  49. package/dist/specs/server/versions/not-versioned/mockapi.js.map +1 -1
  50. package/dist/specs/server/versions/versioned/mockapi.js +8 -12
  51. package/dist/specs/server/versions/versioned/mockapi.js.map +1 -1
  52. package/dist/specs/special-words/mockapi.d.ts.map +1 -1
  53. package/dist/specs/special-words/mockapi.js +6 -6
  54. package/dist/specs/special-words/mockapi.js.map +1 -1
  55. package/dist/specs/streaming/jsonl/mockapi.d.ts +3 -0
  56. package/dist/specs/streaming/jsonl/mockapi.d.ts.map +1 -0
  57. package/dist/specs/streaming/jsonl/mockapi.js +30 -0
  58. package/dist/specs/streaming/jsonl/mockapi.js.map +1 -0
  59. package/dist/specs/type/array/mockapi.js +1 -1
  60. package/dist/specs/type/array/mockapi.js.map +1 -1
  61. package/dist/specs/type/dictionary/mockapi.js +1 -1
  62. package/dist/specs/type/dictionary/mockapi.js.map +1 -1
  63. package/dist/specs/type/enum/extensible/mockapi.js +1 -1
  64. package/dist/specs/type/enum/extensible/mockapi.js.map +1 -1
  65. package/dist/specs/type/enum/fixed/mockapi.js +2 -2
  66. package/dist/specs/type/enum/fixed/mockapi.js.map +1 -1
  67. package/dist/specs/type/model/empty/mockapi.js +2 -2
  68. package/dist/specs/type/model/empty/mockapi.js.map +1 -1
  69. package/dist/specs/type/model/inheritance/enum-discriminator/mockapi.js +1 -1
  70. package/dist/specs/type/model/inheritance/enum-discriminator/mockapi.js.map +1 -1
  71. package/dist/specs/type/model/inheritance/nested-discriminator/mockapi.js +2 -2
  72. package/dist/specs/type/model/inheritance/nested-discriminator/mockapi.js.map +1 -1
  73. package/dist/specs/type/model/inheritance/not-discriminated/mockapi.js +2 -2
  74. package/dist/specs/type/model/inheritance/not-discriminated/mockapi.js.map +1 -1
  75. package/dist/specs/type/model/inheritance/recursive/mockapi.js +1 -1
  76. package/dist/specs/type/model/inheritance/recursive/mockapi.js.map +1 -1
  77. package/dist/specs/type/model/inheritance/single-discriminator/mockapi.js +2 -2
  78. package/dist/specs/type/model/inheritance/single-discriminator/mockapi.js.map +1 -1
  79. package/dist/specs/type/model/usage/mockapi.js +4 -4
  80. package/dist/specs/type/model/usage/mockapi.js.map +1 -1
  81. package/dist/specs/type/model/visibility/mockapi.js +9 -10
  82. package/dist/specs/type/model/visibility/mockapi.js.map +1 -1
  83. package/dist/specs/type/property/additional-properties/mockapi.js +9 -6
  84. package/dist/specs/type/property/additional-properties/mockapi.js.map +1 -1
  85. package/dist/specs/type/property/nullable/mockapi.js +2 -6
  86. package/dist/specs/type/property/nullable/mockapi.js.map +1 -1
  87. package/dist/specs/type/property/optionality/mockapi.js +1 -1
  88. package/dist/specs/type/property/optionality/mockapi.js.map +1 -1
  89. package/dist/specs/type/property/value-types/mockapi.js +3 -3
  90. package/dist/specs/type/property/value-types/mockapi.js.map +1 -1
  91. package/dist/specs/type/scalar/mockapi.js +9 -9
  92. package/dist/specs/type/scalar/mockapi.js.map +1 -1
  93. package/dist/specs/type/union/mockapi.js +2 -2
  94. package/dist/specs/type/union/mockapi.js.map +1 -1
  95. package/dist/specs/versioning/added/mockapi.js +6 -6
  96. package/dist/specs/versioning/added/mockapi.js.map +1 -1
  97. package/dist/specs/versioning/madeOptional/mockapi.js +2 -2
  98. package/dist/specs/versioning/madeOptional/mockapi.js.map +1 -1
  99. package/dist/specs/versioning/removed/mockapi.js +46 -2
  100. package/dist/specs/versioning/removed/mockapi.js.map +1 -1
  101. package/dist/specs/versioning/renamedFrom/mockapi.js +5 -5
  102. package/dist/specs/versioning/renamedFrom/mockapi.js.map +1 -1
  103. package/dist/specs/versioning/returnTypeChangedFrom/mockapi.js +1 -1
  104. package/dist/specs/versioning/returnTypeChangedFrom/mockapi.js.map +1 -1
  105. package/dist/specs/versioning/typeChangedFrom/mockapi.js +3 -3
  106. package/dist/specs/versioning/typeChangedFrom/mockapi.js.map +1 -1
  107. package/package.json +23 -17
  108. package/spec-summary.md +393 -175
  109. package/specs/encode/bytes/main.tsp +28 -20
  110. package/specs/encode/bytes/mockapi.ts +13 -31
  111. package/specs/encode/datetime/main.tsp +2 -7
  112. package/specs/encode/datetime/mockapi.ts +2 -2
  113. package/specs/encode/duration/main.tsp +2 -7
  114. package/specs/encode/duration/mockapi.ts +2 -2
  115. package/specs/encode/numeric/mockapi.ts +2 -2
  116. package/specs/parameters/basic/mockapi.ts +3 -3
  117. package/specs/parameters/body-optionality/mockapi.ts +4 -4
  118. package/specs/parameters/collection-format/main.tsp +5 -25
  119. package/specs/parameters/collection-format/mockapi.ts +4 -16
  120. package/specs/parameters/path/main.tsp +48 -0
  121. package/specs/parameters/path/mockapi.ts +34 -0
  122. package/specs/parameters/spread/mockapi.ts +19 -19
  123. package/specs/payload/json-merge-patch/main.tsp +2 -2
  124. package/specs/payload/json-merge-patch/mockapi.ts +4 -4
  125. package/specs/payload/media-type/mockapi.ts +2 -2
  126. package/specs/payload/multipart/main.tsp +34 -32
  127. package/specs/payload/multipart/mockapi.ts +42 -59
  128. package/specs/payload/pageable/main.tsp +252 -0
  129. package/specs/payload/pageable/mockapi.ts +138 -0
  130. package/specs/payload/xml/mockapi.ts +1 -4
  131. package/specs/response/status-code-range/main.tsp +82 -0
  132. package/specs/response/status-code-range/mockapi.ts +31 -0
  133. package/specs/routes/main.tsp +48 -48
  134. package/specs/routes/mockapi.ts +25 -25
  135. package/specs/serialization/encoded-name/json/main.tsp +1 -1
  136. package/specs/serialization/encoded-name/json/mockapi.ts +1 -1
  137. package/specs/server/endpoint/not-defined/main.tsp +1 -3
  138. package/specs/server/path/multiple/main.tsp +3 -5
  139. package/specs/server/versions/not-versioned/mockapi.ts +1 -1
  140. package/specs/server/versions/versioned/main.tsp +1 -1
  141. package/specs/server/versions/versioned/mockapi.ts +6 -12
  142. package/specs/special-headers/conditional-request/main.tsp +1 -1
  143. package/specs/special-headers/repeatability/main.tsp +2 -2
  144. package/specs/special-words/main.tsp +6 -6
  145. package/specs/special-words/mockapi.ts +6 -6
  146. package/specs/streaming/jsonl/main.tsp +33 -0
  147. package/specs/streaming/jsonl/mockapi.ts +32 -0
  148. package/specs/type/array/mockapi.ts +1 -1
  149. package/specs/type/dictionary/mockapi.ts +1 -1
  150. package/specs/type/enum/extensible/main.tsp +18 -2
  151. package/specs/type/enum/extensible/mockapi.ts +1 -1
  152. package/specs/type/enum/fixed/main.tsp +15 -3
  153. package/specs/type/enum/fixed/mockapi.ts +2 -2
  154. package/specs/type/model/empty/mockapi.ts +2 -2
  155. package/specs/type/model/inheritance/enum-discriminator/mockapi.ts +1 -1
  156. package/specs/type/model/inheritance/nested-discriminator/mockapi.ts +2 -2
  157. package/specs/type/model/inheritance/not-discriminated/mockapi.ts +2 -2
  158. package/specs/type/model/inheritance/recursive/mockapi.ts +1 -1
  159. package/specs/type/model/inheritance/single-discriminator/mockapi.ts +2 -2
  160. package/specs/type/model/usage/mockapi.ts +4 -4
  161. package/specs/type/model/visibility/main.tsp +17 -21
  162. package/specs/type/model/visibility/mockapi.ts +9 -10
  163. package/specs/type/property/additional-properties/main.tsp +17 -17
  164. package/specs/type/property/additional-properties/mockapi.ts +10 -10
  165. package/specs/type/property/nullable/mockapi.ts +7 -8
  166. package/specs/type/property/optionality/mockapi.ts +1 -1
  167. package/specs/type/property/value-types/mockapi.ts +3 -3
  168. package/specs/type/scalar/main.tsp +58 -9
  169. package/specs/type/scalar/mockapi.ts +9 -9
  170. package/specs/type/union/mockapi.ts +2 -2
  171. package/specs/versioning/added/mockapi.ts +6 -6
  172. package/specs/versioning/madeOptional/mockapi.ts +2 -2
  173. package/specs/versioning/removed/main.tsp +65 -3
  174. package/specs/versioning/removed/mockapi.ts +49 -2
  175. package/specs/versioning/renamedFrom/mockapi.ts +5 -5
  176. package/specs/versioning/returnTypeChangedFrom/main.tsp +17 -2
  177. package/specs/versioning/returnTypeChangedFrom/mockapi.ts +1 -1
  178. package/specs/versioning/typeChangedFrom/mockapi.ts +3 -3
  179. package/temp/.tsbuildinfo +1 -1
  180. package/tspconfig.yaml +0 -2
  181. package/dist/specs/type/model/templated/mockapi.d.ts.map +0 -1
  182. package/dist/specs/type/model/templated/mockapi.js +0 -63
  183. package/dist/specs/type/model/templated/mockapi.js.map +0 -1
  184. package/specs/type/model/templated/main.tsp +0 -130
  185. package/specs/type/model/templated/mockapi.ts +0 -66
  186. /package/dist/specs/{type/model/templated → parameters/path}/mockapi.d.ts +0 -0
@@ -0,0 +1,252 @@
1
+ import "@typespec/http";
2
+ import "@typespec/spector";
3
+
4
+ using Http;
5
+ using Spector;
6
+
7
+ /**
8
+ * Test for pageable payload.
9
+ */
10
+ @scenarioService("/payload/pageable")
11
+ namespace Payload.Pageable;
12
+
13
+ model Pet {
14
+ id: string;
15
+ name: string;
16
+ }
17
+
18
+ alias HeaderAndQuery = {
19
+ @header foo?: string;
20
+ @query bar?: string;
21
+ };
22
+
23
+ @route("/server-driven-pagination")
24
+ namespace ServerDrivenPagination {
25
+ @scenario
26
+ @scenarioDoc("""
27
+ Test case for using link as pagination.
28
+
29
+ Two requests need to be tested.
30
+ 1. Initial request:
31
+ Expected route: /payload/pageable/server-driven-pagination/link
32
+ Expected response body:
33
+ ```json
34
+ { "pets": [
35
+ { "id": "1", "name": "dog" },
36
+ { "id": "2", "name": "cat" }
37
+ ],
38
+ "next": "http://[host]:[port]/payload/pageable/server-driven-pagination/link/nextPage"
39
+ }
40
+ ```
41
+ 2. Next page request:
42
+ Expected route: /payload/pageable/server-driven-pagination/link/nextPage
43
+ Expected response body:
44
+ ```json
45
+ { "pets": [
46
+ { "id": "3", "name": "bird" },
47
+ { "id": "4", "name": "fish" }
48
+ ]
49
+ }
50
+ ```
51
+ """)
52
+ @route("/link")
53
+ @list
54
+ op link(): {
55
+ @pageItems
56
+ pets: Pet[];
57
+
58
+ @nextLink next?: url;
59
+ };
60
+
61
+ @route("/continuationtoken")
62
+ namespace ContinuationToken {
63
+ @scenario
64
+ @scenarioDoc("""
65
+ Test case for using continuation token as pagination. Continuation token is passed in the request query and response body.
66
+
67
+ Two requests need to be tested.
68
+
69
+ 1. Initial request:
70
+ Expected route: /payload/pageable/server-driven-pagination/continuationtoken/request-query-response-body?bar=bar
71
+
72
+ Expected request header:
73
+ foo=foo
74
+
75
+ Expected response body:
76
+ ```json
77
+ { "pets": [
78
+ { "id": "1", "name": "dog" },
79
+ { "id": "2", "name": "cat" }
80
+ ],
81
+ "nextToken": "page2"
82
+ }
83
+ ```
84
+
85
+ 2. Next page request:
86
+ Expected route: /payload/pageable/server-driven-pagination/continuationtoken/request-query-response-body?bar=bar&token=page2
87
+
88
+ Expected request header:
89
+ foo=foo
90
+
91
+ Expected response body:
92
+ ```json
93
+ { "pets": [
94
+ { "id": "3", "name": "bird" },
95
+ { "id": "4", "name": "fish" }
96
+ ]
97
+ }
98
+ ```
99
+ """)
100
+ @route("/request-query-response-body")
101
+ @list
102
+ op requestQueryResponseBody(@continuationToken @query token?: string, ...HeaderAndQuery): {
103
+ @pageItems
104
+ pets: Pet[];
105
+
106
+ @continuationToken nextToken?: string;
107
+ };
108
+
109
+ @scenario
110
+ @scenarioDoc("""
111
+ Test case for using continuation token as pagination. Continuation token is passed in the request header and response body.
112
+
113
+ Two requests need to be tested.
114
+
115
+ 1. Initial request:
116
+ Expected route: /payload/pageable/server-driven-pagination/continuationtoken/request-header-response-body?bar=bar
117
+
118
+ Expected request header:
119
+ foo=foo
120
+
121
+ Expected response body:
122
+ ```json
123
+ { "pets": [
124
+ { "id": "1", "name": "dog" },
125
+ { "id": "2", "name": "cat" }
126
+ ],
127
+ "nextToken": "page2"
128
+ }
129
+ ```
130
+
131
+ 2. Next page request:
132
+ Expected route: /payload/pageable/server-driven-pagination/continuationtoken/request-header-response-body?bar=bar
133
+
134
+ Expected request header:
135
+ token=page2
136
+ foo=foo
137
+
138
+ Expected response body:
139
+ ```json
140
+ { "pets": [
141
+ { "id": "3", "name": "bird" },
142
+ { "id": "4", "name": "fish" }
143
+ ]
144
+ }
145
+ ```
146
+ """)
147
+ @route("/request-header-response-body")
148
+ @list
149
+ op requestHeaderResponseBody(@continuationToken @header token?: string, ...HeaderAndQuery): {
150
+ @pageItems
151
+ pets: Pet[];
152
+
153
+ @continuationToken nextToken?: string;
154
+ };
155
+
156
+ @scenario
157
+ @scenarioDoc("""
158
+ Test case for using continuation token as pagination. Continuation token is passed in the request query and response header.
159
+
160
+ Two requests need to be tested.
161
+
162
+ 1. Initial request:
163
+ Expected route: /payload/pageable/server-driven-pagination/continuationtoken/request-query-response-header?bar=bar
164
+
165
+ Expected request header:
166
+ foo=foo
167
+
168
+ Expected response body:
169
+ ```json
170
+ { "pets": [
171
+ { "id": "1", "name": "dog" },
172
+ { "id": "2", "name": "cat" }
173
+ ]
174
+ }
175
+ ```
176
+
177
+ Expected response header:
178
+ next-token=page2
179
+
180
+ 2. Next page request:
181
+ Expected route: /payload/pageable/server-driven-pagination/continuationtoken/request-query-response-header?bar=bar&token=page2
182
+
183
+ Expected request header:
184
+ foo=foo
185
+
186
+ Expected response body:
187
+ ```json
188
+ { "pets": [
189
+ { "id": "3", "name": "bird" },
190
+ { "id": "4", "name": "fish" }
191
+ ]
192
+ }
193
+ ```
194
+ """)
195
+ @route("/request-query-response-header")
196
+ @list
197
+ op requestQueryResponseHeader(@continuationToken @query token?: string, ...HeaderAndQuery): {
198
+ @pageItems
199
+ pets: Pet[];
200
+
201
+ @continuationToken @header nextToken?: string;
202
+ };
203
+
204
+ @scenario
205
+ @scenarioDoc("""
206
+ Test case for using continuation token as pagination. Continuation token is passed in the request header and response header.
207
+
208
+ Two requests need to be tested.
209
+ 1. Initial request:
210
+ Expected route: /payload/pageable/server-driven-pagination/continuationtoken/request-header-response-header?bar=bar
211
+
212
+ Expected request header:
213
+ foo=foo
214
+
215
+ Expected response body:
216
+ ```json
217
+ { "pets": [
218
+ { "id": "1", "name": "dog" },
219
+ { "id": "2", "name": "cat" }
220
+ ]
221
+ }
222
+ ```
223
+
224
+ Expected response header:
225
+ next-token=page2
226
+
227
+ 2. Next page request:
228
+ Expected route: /payload/pageable/server-driven-pagination/continuationtoken/request-header-response-header?bar=bar
229
+
230
+ Expected request header:
231
+ token=page2
232
+ foo=foo
233
+
234
+ Expected response body:
235
+ ```json
236
+ { "pets": [
237
+ { "id": "3", "name": "bird" },
238
+ { "id": "4", "name": "fish" }
239
+ ]
240
+ }
241
+ ```
242
+ """)
243
+ @route("/request-header-response-header")
244
+ @list
245
+ op requestHeaderResponseHeader(@continuationToken @header token?: string, ...HeaderAndQuery): {
246
+ @pageItems
247
+ pets: Pet[];
248
+
249
+ @continuationToken @header nextToken?: string;
250
+ };
251
+ }
252
+ }
@@ -0,0 +1,138 @@
1
+ import {
2
+ json,
3
+ MockRequest,
4
+ passOnSuccess,
5
+ ScenarioMockApi,
6
+ ValidationError,
7
+ } from "@typespec/spec-api";
8
+
9
+ export const Scenarios: Record<string, ScenarioMockApi> = {};
10
+
11
+ const FirstPage = [
12
+ { id: "1", name: "dog" },
13
+ { id: "2", name: "cat" },
14
+ ];
15
+
16
+ const SecondPage = [
17
+ { id: "3", name: "bird" },
18
+ { id: "4", name: "fish" },
19
+ ];
20
+
21
+ const FirstResponseTokenInBody = {
22
+ status: 200,
23
+ body: json({
24
+ pets: FirstPage,
25
+ nextToken: "page2",
26
+ }),
27
+ };
28
+
29
+ const SecondResponse = {
30
+ status: 200,
31
+ body: json({
32
+ pets: SecondPage,
33
+ }),
34
+ };
35
+
36
+ const FirstResponseTokenInHeader = {
37
+ status: 200,
38
+ body: json({
39
+ pets: FirstPage,
40
+ }),
41
+ headers: {
42
+ "next-token": "page2",
43
+ foo: "foo",
44
+ },
45
+ };
46
+
47
+ const RequestTokenInQuery = {
48
+ query: { token: "page2", bar: "bar" },
49
+ headers: { foo: "foo" },
50
+ };
51
+
52
+ const RequestTokenInHeader = { headers: { token: "page2", foo: "foo" }, query: { bar: "bar" } };
53
+
54
+ function createTests(reqInfo: "query" | "header", resInfo: "body" | "header") {
55
+ const uri = `/payload/pageable/server-driven-pagination/continuationtoken/request-${reqInfo}-response-${resInfo}`;
56
+ function createHandler() {
57
+ return (req: MockRequest) => {
58
+ req.expect.containsHeader("foo", "foo");
59
+ req.expect.containsQueryParam("bar", "bar");
60
+ const token = reqInfo === "header" ? req.headers?.token : req.query?.token;
61
+ switch (token) {
62
+ case undefined:
63
+ return resInfo === "header" ? FirstResponseTokenInHeader : FirstResponseTokenInBody;
64
+ case "page2":
65
+ return SecondResponse;
66
+ default:
67
+ throw new ValidationError(
68
+ "Unsupported continuation token",
69
+ `"undefined" | "page2"`,
70
+ token,
71
+ );
72
+ }
73
+ };
74
+ }
75
+
76
+ return passOnSuccess([
77
+ {
78
+ uri: uri,
79
+ method: "get",
80
+ request: { headers: { foo: "foo" }, query: { bar: "bar" } },
81
+ response: resInfo === "header" ? FirstResponseTokenInHeader : FirstResponseTokenInBody,
82
+ handler: createHandler(),
83
+ kind: "MockApiDefinition",
84
+ },
85
+ {
86
+ uri: uri,
87
+ method: "get",
88
+ request: reqInfo === "header" ? RequestTokenInHeader : RequestTokenInQuery,
89
+ response: SecondResponse,
90
+ handler: createHandler(),
91
+ kind: "MockApiDefinition",
92
+ },
93
+ ]);
94
+ }
95
+
96
+ Scenarios.Payload_Pageable_ServerDrivenPagination_link = passOnSuccess([
97
+ {
98
+ uri: "/payload/pageable/server-driven-pagination/link",
99
+ method: "get",
100
+ request: {},
101
+ response: {
102
+ status: 200,
103
+ // TODO: need better way to handle baseUrl
104
+ // body: json({
105
+ // pets: FirstPage,
106
+ // next: "/payload/pageable/server-driven-pagination/link/nextPage",
107
+ // }),
108
+ },
109
+ handler: (req: MockRequest) => {
110
+ return {
111
+ status: 200,
112
+ body: json({
113
+ pets: FirstPage,
114
+ next: `${req.baseUrl}/payload/pageable/server-driven-pagination/link/nextPage`,
115
+ }),
116
+ };
117
+ },
118
+ kind: "MockApiDefinition",
119
+ },
120
+ {
121
+ uri: "/payload/pageable/server-driven-pagination/link/nextPage",
122
+ method: "get",
123
+ request: {},
124
+ response: SecondResponse,
125
+ kind: "MockApiDefinition",
126
+ },
127
+ ]);
128
+
129
+ Scenarios.Payload_Pageable_ServerDrivenPagination_ContinuationToken_requestQueryResponseBody =
130
+ createTests("query", "body");
131
+
132
+ Scenarios.Payload_Pageable_ServerDrivenPagination_ContinuationToken_requestHeaderResponseBody =
133
+ createTests("header", "body");
134
+
135
+ Scenarios.Payload_Pageable_ServerDrivenPagination_ContinuationToken_requestQueryResponseHeader =
136
+ createTests("query", "header");
137
+ Scenarios.Payload_Pageable_ServerDrivenPagination_ContinuationToken_requestHeaderResponseHeader =
138
+ createTests("header", "header");
@@ -139,10 +139,7 @@ function createServerTests(uri: string, data?: any) {
139
139
  uri,
140
140
  method: "put",
141
141
  request: {
142
- body: data,
143
- headers: {
144
- "content-type": "application/xml",
145
- },
142
+ body: xml(data),
146
143
  },
147
144
  handler: (req: MockRequest) => {
148
145
  req.expect.containsHeader("content-type", "application/xml");
@@ -0,0 +1,82 @@
1
+ import "@typespec/http";
2
+ import "@typespec/spector";
3
+
4
+ using Http;
5
+ using Spector;
6
+
7
+ /**
8
+ * Test for range of status code.
9
+ */
10
+ @scenarioService("/response/status-code-range")
11
+ namespace Response.StatusCodeRange;
12
+
13
+ @scenario
14
+ @scenarioDoc("""
15
+ Test case for range of status code in error response.
16
+
17
+ Verify that the result of the API is an error/exception in client, and the error response can be de-serialized to ErrorInRange model (instead of DefaultError model).
18
+
19
+ Expected status code 494 and response body:
20
+ ```json
21
+ {
22
+ "code": "request-header-too-large",
23
+ "message": "Request header too large"
24
+ }
25
+ ```
26
+ """)
27
+ @route("/error-response-status-code-in-range")
28
+ @get
29
+ op errorResponseStatusCodeInRange(): NoContentResponse | ErrorInRange | DefaultError;
30
+
31
+ @scenario
32
+ @scenarioDoc("""
33
+ Test case for range of status code in error response.
34
+
35
+ Verify that the result of the API is an error/exception in client, and the error response can be de-serialized to NotFoundError model (instead of Standard4XXError model).
36
+
37
+ Expected status code 404 and response body:
38
+ ```json
39
+ {
40
+ "code": "not-found",
41
+ "resourceId": "resource1"
42
+ }
43
+ ```
44
+ """)
45
+ @route("/error-response-status-code-404")
46
+ @get
47
+ op errorResponseStatusCode404(): NoContentResponse | NotFoundError | Standard4XXError;
48
+
49
+ @error
50
+ model NotFoundError {
51
+ @statusCode
52
+ _: 404;
53
+
54
+ code: string;
55
+ resourceId: string;
56
+ }
57
+
58
+ @error
59
+ model ErrorInRange {
60
+ @minValue(494)
61
+ @maxValue(499)
62
+ @statusCode
63
+ _: int32;
64
+
65
+ code: string;
66
+ message: string;
67
+ }
68
+
69
+ @error
70
+ model Standard4XXError {
71
+ @minValue(400)
72
+ @maxValue(499)
73
+ @statusCode
74
+ _: int32;
75
+
76
+ code: string;
77
+ }
78
+
79
+ @error
80
+ model DefaultError {
81
+ code: string;
82
+ }
@@ -0,0 +1,31 @@
1
+ import { json, passOnCode, ScenarioMockApi } from "@typespec/spec-api";
2
+
3
+ export const Scenarios: Record<string, ScenarioMockApi> = {};
4
+
5
+ Scenarios.Response_StatusCodeRange_errorResponseStatusCodeInRange = passOnCode(494, {
6
+ uri: "/response/status-code-range/error-response-status-code-in-range",
7
+ method: "get",
8
+ request: {},
9
+ response: {
10
+ status: 494,
11
+ body: json({
12
+ code: "request-header-too-large",
13
+ message: "Request header too large",
14
+ }),
15
+ },
16
+ kind: "MockApiDefinition",
17
+ });
18
+
19
+ Scenarios.Response_StatusCodeRange_errorResponseStatusCode404 = passOnCode(404, {
20
+ uri: "/response/status-code-range/error-response-status-code-404",
21
+ method: "get",
22
+ request: {},
23
+ response: {
24
+ status: 404,
25
+ body: json({
26
+ code: "not-found",
27
+ resourceId: "resource1",
28
+ }),
29
+ },
30
+ kind: "MockApiDefinition",
31
+ });