@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.
- package/CHANGELOG.md +146 -0
- package/README.md +11 -3
- package/dist/specs/encode/bytes/mockapi.js +16 -24
- package/dist/specs/encode/bytes/mockapi.js.map +1 -1
- package/dist/specs/encode/datetime/mockapi.js +2 -2
- package/dist/specs/encode/datetime/mockapi.js.map +1 -1
- package/dist/specs/encode/duration/mockapi.js +2 -2
- package/dist/specs/encode/duration/mockapi.js.map +1 -1
- package/dist/specs/encode/numeric/mockapi.js +2 -2
- package/dist/specs/encode/numeric/mockapi.js.map +1 -1
- package/dist/specs/helper.d.ts +2 -2
- package/dist/specs/helper.d.ts.map +1 -1
- package/dist/specs/parameters/basic/mockapi.d.ts.map +1 -1
- package/dist/specs/parameters/basic/mockapi.js +3 -3
- package/dist/specs/parameters/basic/mockapi.js.map +1 -1
- package/dist/specs/parameters/body-optionality/mockapi.d.ts.map +1 -1
- package/dist/specs/parameters/body-optionality/mockapi.js +4 -4
- package/dist/specs/parameters/body-optionality/mockapi.js.map +1 -1
- package/dist/specs/parameters/collection-format/mockapi.js +4 -15
- package/dist/specs/parameters/collection-format/mockapi.js.map +1 -1
- package/dist/specs/parameters/path/mockapi.d.ts.map +1 -0
- package/dist/specs/parameters/path/mockapi.js +29 -0
- package/dist/specs/parameters/path/mockapi.js.map +1 -0
- package/dist/specs/parameters/spread/mockapi.d.ts.map +1 -1
- package/dist/specs/parameters/spread/mockapi.js +19 -19
- package/dist/specs/parameters/spread/mockapi.js.map +1 -1
- package/dist/specs/payload/json-merge-patch/mockapi.js +4 -4
- package/dist/specs/payload/json-merge-patch/mockapi.js.map +1 -1
- package/dist/specs/payload/media-type/mockapi.js +2 -2
- package/dist/specs/payload/media-type/mockapi.js.map +1 -1
- package/dist/specs/payload/multipart/mockapi.d.ts.map +1 -1
- package/dist/specs/payload/multipart/mockapi.js +42 -60
- package/dist/specs/payload/multipart/mockapi.js.map +1 -1
- package/dist/specs/payload/pageable/mockapi.d.ts +3 -0
- package/dist/specs/payload/pageable/mockapi.d.ts.map +1 -0
- package/dist/specs/payload/pageable/mockapi.js +115 -0
- package/dist/specs/payload/pageable/mockapi.js.map +1 -0
- package/dist/specs/payload/xml/mockapi.js +1 -4
- package/dist/specs/payload/xml/mockapi.js.map +1 -1
- package/dist/specs/response/status-code-range/mockapi.d.ts +3 -0
- package/dist/specs/response/status-code-range/mockapi.d.ts.map +1 -0
- package/dist/specs/response/status-code-range/mockapi.js +29 -0
- package/dist/specs/response/status-code-range/mockapi.js.map +1 -0
- package/dist/specs/routes/mockapi.js +25 -25
- package/dist/specs/routes/mockapi.js.map +1 -1
- package/dist/specs/serialization/encoded-name/json/mockapi.js +1 -1
- package/dist/specs/serialization/encoded-name/json/mockapi.js.map +1 -1
- package/dist/specs/server/versions/not-versioned/mockapi.js +1 -1
- package/dist/specs/server/versions/not-versioned/mockapi.js.map +1 -1
- package/dist/specs/server/versions/versioned/mockapi.js +8 -12
- package/dist/specs/server/versions/versioned/mockapi.js.map +1 -1
- package/dist/specs/special-words/mockapi.d.ts.map +1 -1
- package/dist/specs/special-words/mockapi.js +6 -6
- package/dist/specs/special-words/mockapi.js.map +1 -1
- package/dist/specs/streaming/jsonl/mockapi.d.ts +3 -0
- package/dist/specs/streaming/jsonl/mockapi.d.ts.map +1 -0
- package/dist/specs/streaming/jsonl/mockapi.js +30 -0
- package/dist/specs/streaming/jsonl/mockapi.js.map +1 -0
- package/dist/specs/type/array/mockapi.js +1 -1
- package/dist/specs/type/array/mockapi.js.map +1 -1
- package/dist/specs/type/dictionary/mockapi.js +1 -1
- package/dist/specs/type/dictionary/mockapi.js.map +1 -1
- package/dist/specs/type/enum/extensible/mockapi.js +1 -1
- package/dist/specs/type/enum/extensible/mockapi.js.map +1 -1
- package/dist/specs/type/enum/fixed/mockapi.js +2 -2
- package/dist/specs/type/enum/fixed/mockapi.js.map +1 -1
- package/dist/specs/type/model/empty/mockapi.js +2 -2
- package/dist/specs/type/model/empty/mockapi.js.map +1 -1
- package/dist/specs/type/model/inheritance/enum-discriminator/mockapi.js +1 -1
- package/dist/specs/type/model/inheritance/enum-discriminator/mockapi.js.map +1 -1
- package/dist/specs/type/model/inheritance/nested-discriminator/mockapi.js +2 -2
- package/dist/specs/type/model/inheritance/nested-discriminator/mockapi.js.map +1 -1
- package/dist/specs/type/model/inheritance/not-discriminated/mockapi.js +2 -2
- package/dist/specs/type/model/inheritance/not-discriminated/mockapi.js.map +1 -1
- package/dist/specs/type/model/inheritance/recursive/mockapi.js +1 -1
- package/dist/specs/type/model/inheritance/recursive/mockapi.js.map +1 -1
- package/dist/specs/type/model/inheritance/single-discriminator/mockapi.js +2 -2
- package/dist/specs/type/model/inheritance/single-discriminator/mockapi.js.map +1 -1
- package/dist/specs/type/model/usage/mockapi.js +4 -4
- package/dist/specs/type/model/usage/mockapi.js.map +1 -1
- package/dist/specs/type/model/visibility/mockapi.js +9 -10
- package/dist/specs/type/model/visibility/mockapi.js.map +1 -1
- package/dist/specs/type/property/additional-properties/mockapi.js +9 -6
- package/dist/specs/type/property/additional-properties/mockapi.js.map +1 -1
- package/dist/specs/type/property/nullable/mockapi.js +2 -6
- package/dist/specs/type/property/nullable/mockapi.js.map +1 -1
- package/dist/specs/type/property/optionality/mockapi.js +1 -1
- package/dist/specs/type/property/optionality/mockapi.js.map +1 -1
- package/dist/specs/type/property/value-types/mockapi.js +3 -3
- package/dist/specs/type/property/value-types/mockapi.js.map +1 -1
- package/dist/specs/type/scalar/mockapi.js +9 -9
- package/dist/specs/type/scalar/mockapi.js.map +1 -1
- package/dist/specs/type/union/mockapi.js +2 -2
- package/dist/specs/type/union/mockapi.js.map +1 -1
- package/dist/specs/versioning/added/mockapi.js +6 -6
- package/dist/specs/versioning/added/mockapi.js.map +1 -1
- package/dist/specs/versioning/madeOptional/mockapi.js +2 -2
- package/dist/specs/versioning/madeOptional/mockapi.js.map +1 -1
- package/dist/specs/versioning/removed/mockapi.js +46 -2
- package/dist/specs/versioning/removed/mockapi.js.map +1 -1
- package/dist/specs/versioning/renamedFrom/mockapi.js +5 -5
- package/dist/specs/versioning/renamedFrom/mockapi.js.map +1 -1
- package/dist/specs/versioning/returnTypeChangedFrom/mockapi.js +1 -1
- package/dist/specs/versioning/returnTypeChangedFrom/mockapi.js.map +1 -1
- package/dist/specs/versioning/typeChangedFrom/mockapi.js +3 -3
- package/dist/specs/versioning/typeChangedFrom/mockapi.js.map +1 -1
- package/package.json +23 -17
- package/spec-summary.md +393 -175
- package/specs/encode/bytes/main.tsp +28 -20
- package/specs/encode/bytes/mockapi.ts +13 -31
- package/specs/encode/datetime/main.tsp +2 -7
- package/specs/encode/datetime/mockapi.ts +2 -2
- package/specs/encode/duration/main.tsp +2 -7
- package/specs/encode/duration/mockapi.ts +2 -2
- package/specs/encode/numeric/mockapi.ts +2 -2
- package/specs/parameters/basic/mockapi.ts +3 -3
- package/specs/parameters/body-optionality/mockapi.ts +4 -4
- package/specs/parameters/collection-format/main.tsp +5 -25
- package/specs/parameters/collection-format/mockapi.ts +4 -16
- package/specs/parameters/path/main.tsp +48 -0
- package/specs/parameters/path/mockapi.ts +34 -0
- package/specs/parameters/spread/mockapi.ts +19 -19
- package/specs/payload/json-merge-patch/main.tsp +2 -2
- package/specs/payload/json-merge-patch/mockapi.ts +4 -4
- package/specs/payload/media-type/mockapi.ts +2 -2
- package/specs/payload/multipart/main.tsp +34 -32
- package/specs/payload/multipart/mockapi.ts +42 -59
- package/specs/payload/pageable/main.tsp +252 -0
- package/specs/payload/pageable/mockapi.ts +138 -0
- package/specs/payload/xml/mockapi.ts +1 -4
- package/specs/response/status-code-range/main.tsp +82 -0
- package/specs/response/status-code-range/mockapi.ts +31 -0
- package/specs/routes/main.tsp +48 -48
- package/specs/routes/mockapi.ts +25 -25
- package/specs/serialization/encoded-name/json/main.tsp +1 -1
- package/specs/serialization/encoded-name/json/mockapi.ts +1 -1
- package/specs/server/endpoint/not-defined/main.tsp +1 -3
- package/specs/server/path/multiple/main.tsp +3 -5
- package/specs/server/versions/not-versioned/mockapi.ts +1 -1
- package/specs/server/versions/versioned/main.tsp +1 -1
- package/specs/server/versions/versioned/mockapi.ts +6 -12
- package/specs/special-headers/conditional-request/main.tsp +1 -1
- package/specs/special-headers/repeatability/main.tsp +2 -2
- package/specs/special-words/main.tsp +6 -6
- package/specs/special-words/mockapi.ts +6 -6
- package/specs/streaming/jsonl/main.tsp +33 -0
- package/specs/streaming/jsonl/mockapi.ts +32 -0
- package/specs/type/array/mockapi.ts +1 -1
- package/specs/type/dictionary/mockapi.ts +1 -1
- package/specs/type/enum/extensible/main.tsp +18 -2
- package/specs/type/enum/extensible/mockapi.ts +1 -1
- package/specs/type/enum/fixed/main.tsp +15 -3
- package/specs/type/enum/fixed/mockapi.ts +2 -2
- package/specs/type/model/empty/mockapi.ts +2 -2
- package/specs/type/model/inheritance/enum-discriminator/mockapi.ts +1 -1
- package/specs/type/model/inheritance/nested-discriminator/mockapi.ts +2 -2
- package/specs/type/model/inheritance/not-discriminated/mockapi.ts +2 -2
- package/specs/type/model/inheritance/recursive/mockapi.ts +1 -1
- package/specs/type/model/inheritance/single-discriminator/mockapi.ts +2 -2
- package/specs/type/model/usage/mockapi.ts +4 -4
- package/specs/type/model/visibility/main.tsp +17 -21
- package/specs/type/model/visibility/mockapi.ts +9 -10
- package/specs/type/property/additional-properties/main.tsp +17 -17
- package/specs/type/property/additional-properties/mockapi.ts +10 -10
- package/specs/type/property/nullable/mockapi.ts +7 -8
- package/specs/type/property/optionality/mockapi.ts +1 -1
- package/specs/type/property/value-types/mockapi.ts +3 -3
- package/specs/type/scalar/main.tsp +58 -9
- package/specs/type/scalar/mockapi.ts +9 -9
- package/specs/type/union/mockapi.ts +2 -2
- package/specs/versioning/added/mockapi.ts +6 -6
- package/specs/versioning/madeOptional/mockapi.ts +2 -2
- package/specs/versioning/removed/main.tsp +65 -3
- package/specs/versioning/removed/mockapi.ts +49 -2
- package/specs/versioning/renamedFrom/mockapi.ts +5 -5
- package/specs/versioning/returnTypeChangedFrom/main.tsp +17 -2
- package/specs/versioning/returnTypeChangedFrom/mockapi.ts +1 -1
- package/specs/versioning/typeChangedFrom/mockapi.ts +3 -3
- package/temp/.tsbuildinfo +1 -1
- package/tspconfig.yaml +0 -2
- package/dist/specs/type/model/templated/mockapi.d.ts.map +0 -1
- package/dist/specs/type/model/templated/mockapi.js +0 -63
- package/dist/specs/type/model/templated/mockapi.js.map +0 -1
- package/specs/type/model/templated/main.tsp +0 -130
- package/specs/type/model/templated/mockapi.ts +0 -66
- /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
|
+
});
|