Skip to content

Commit e95cced

Browse files
http-specs, test case on status code range (#5577)
Currently I only added case for the range in error response. Range can also happen on success response (e.g. 200-299).
1 parent 683f8ee commit e95cced

File tree

4 files changed

+182
-24
lines changed

4 files changed

+182
-24
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
---
2+
changeKind: feature
3+
packages:
4+
- "@typespec/http-specs"
5+
---
6+
7+
Add test case on status code range

Diff for: packages/http-specs/spec-summary.md

+58-24
Original file line numberDiff line numberDiff line change
@@ -2082,6 +2082,40 @@ Expected request body:
20822082
</SimpleModel>
20832083
```
20842084

2085+
### Response_StatusCodeRange_errorResponseStatusCode404
2086+
2087+
- Endpoint: `get /response/status-code-range/error-response-status-code-404`
2088+
2089+
Test case for range of status code in error response.
2090+
2091+
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).
2092+
2093+
Expected status code 404 and response body:
2094+
2095+
```json
2096+
{
2097+
"code": "not-found",
2098+
"resourceId": "resource1"
2099+
}
2100+
```
2101+
2102+
### Response_StatusCodeRange_errorResponseStatusCodeInRange
2103+
2104+
- Endpoint: `get /response/status-code-range/error-response-status-code-in-range`
2105+
2106+
Test case for range of status code in error response.
2107+
2108+
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).
2109+
2110+
Expected status code 494 and response body:
2111+
2112+
```json
2113+
{
2114+
"code": "request-header-too-large",
2115+
"message": "Request header too large"
2116+
}
2117+
```
2118+
20852119
### Routes_fixed
20862120

20872121
- Endpoint: `get /routes/fixed`
@@ -2118,143 +2152,143 @@ Expected path: /routes/path/explicit/a
21182152

21192153
Test label expansion with explode: true when passed an array value.
21202154
Param value: ["a","b"]
2121-
Expected path: /routes/label/explode/array.a.b
2155+
Expected path: /routes/path/label/explode/array.a.b
21222156

21232157
### Routes_PathParameters_LabelExpansion_Explode_primitive
21242158

21252159
- Endpoint: `get /routes/path/label/explode/primitive{.param*}`
21262160

21272161
Test label expansion with explode: true when passed a primitive value.
21282162
Param value: "a"
2129-
Expected path: /routes/label/explode/primitive.a
2163+
Expected path: /routes/path/label/explode/primitive.a
21302164

21312165
### Routes_PathParameters_LabelExpansion_Explode_record
21322166

21332167
- Endpoint: `get /routes/path/label/explode/record{.param*}`
21342168

21352169
Test label expansion with explode: true when passed a record value.
21362170
Param value: {a: 1, b: 2}
2137-
Expected path: /routes/label/explode/record.a=1.b=2
2171+
Expected path: /routes/path/label/explode/record.a=1.b=2
21382172

21392173
### Routes_PathParameters_LabelExpansion_Standard_array
21402174

21412175
- Endpoint: `get /routes/path/label/standard/array{.param}`
21422176

21432177
Test label expansion with explode: false when passed an array value.
21442178
Param value: ["a","b"]
2145-
Expected path: /routes/label/standard/array.a,b
2179+
Expected path: /routes/path/label/standard/array.a,b
21462180

21472181
### Routes_PathParameters_LabelExpansion_Standard_primitive
21482182

21492183
- Endpoint: `get /routes/path/label/standard/primitive{.param}`
21502184

21512185
Test label expansion with explode: false when passed a primitive value.
21522186
Param value: "a"
2153-
Expected path: /routes/label/standard/primitive.a
2187+
Expected path: /routes/path/label/standard/primitive.a
21542188

21552189
### Routes_PathParameters_LabelExpansion_Standard_record
21562190

21572191
- Endpoint: `get /routes/path/label/standard/record{.param}`
21582192

21592193
Test label expansion with explode: false when passed a record value.
21602194
Param value: {a: 1, b: 2}
2161-
Expected path: /routes/label/standard/record.a,1,b,2
2195+
Expected path: /routes/path/label/standard/record.a,1,b,2
21622196

21632197
### Routes_PathParameters_MatrixExpansion_Explode_array
21642198

21652199
- Endpoint: `get /routes/path/matrix/explode/array{;param*}`
21662200

21672201
Test matrix expansion with explode: true when passed an array value.
21682202
Param value: ["a","b"]
2169-
Expected path: /routes/matrix/explode/array;a.b
2203+
Expected path: /routes/path/matrix/explode/array;a.b
21702204

21712205
### Routes_PathParameters_MatrixExpansion_Explode_primitive
21722206

21732207
- Endpoint: `get /routes/path/matrix/explode/primitive{;param*}`
21742208

21752209
Test matrix expansion with explode: true when passed a primitive value.
21762210
Param value: "a"
2177-
Expected path: /routes/matrix/explode/primitive;a
2211+
Expected path: /routes/path/matrix/explode/primitive;a
21782212

21792213
### Routes_PathParameters_MatrixExpansion_Explode_record
21802214

21812215
- Endpoint: `get /routes/path/matrix/explode/record{;param*}`
21822216

21832217
Test matrix expansion with explode: true when passed a record value.
21842218
Param value: {a: 1, b: 2}
2185-
Expected path: /routes/matrix/explode/record;a=1;b=2
2219+
Expected path: /routes/path/matrix/explode/record;a=1;b=2
21862220

21872221
### Routes_PathParameters_MatrixExpansion_Standard_array
21882222

21892223
- Endpoint: `get /routes/path/matrix/standard/array{;param}`
21902224

21912225
Test matrix expansion with explode: false when passed an array value.
21922226
Param value: ["a","b"]
2193-
Expected path: /routes/matrix/standard/array;a,b
2227+
Expected path: /routes/path/matrix/standard/array;a,b
21942228

21952229
### Routes_PathParameters_MatrixExpansion_Standard_primitive
21962230

21972231
- Endpoint: `get /routes/path/matrix/standard/primitive{;param}`
21982232

21992233
Test matrix expansion with explode: false when passed a primitive value.
22002234
Param value: "a"
2201-
Expected path: /routes/matrix/standard/primitive;a
2235+
Expected path: /routes/path/matrix/standard/primitive;a
22022236

22032237
### Routes_PathParameters_MatrixExpansion_Standard_record
22042238

22052239
- Endpoint: `get /routes/path/matrix/standard/record{;param}`
22062240

22072241
Test matrix expansion with explode: false when passed a record value.
22082242
Param value: {a: 1, b: 2}
2209-
Expected path: /routes/matrix/standard/record;a,1,b,2
2243+
Expected path: /routes/path/matrix/standard/record;a,1,b,2
22102244

22112245
### Routes_PathParameters_PathExpansion_Explode_array
22122246

22132247
- Endpoint: `get /routes/path/path/explode/array{/param*}`
22142248

22152249
Test path expansion with explode: true when passed an array value.
22162250
Param value: ["a","b"]
2217-
Expected path: /routes/path/explode/array/a/b
2251+
Expected path: /routes/path/path/explode/array/a/b
22182252

22192253
### Routes_PathParameters_PathExpansion_Explode_primitive
22202254

22212255
- Endpoint: `get /routes/path/path/explode/primitive{/param*}`
22222256

22232257
Test path expansion with explode: true when passed a primitive value.
22242258
Param value: "a"
2225-
Expected path: /routes/path/explode/primitive/a
2259+
Expected path: /routes/path/path/explode/primitive/a
22262260

22272261
### Routes_PathParameters_PathExpansion_Explode_record
22282262

22292263
- Endpoint: `get /routes/path/path/explode/record{/param*}`
22302264

22312265
Test path expansion with explode: true when passed a record value.
22322266
Param value: {a: 1, b: 2}
2233-
Expected path: /routes/path/explode/record/a=1/b=2
2267+
Expected path: /routes/path/path/explode/record/a=1/b=2
22342268

22352269
### Routes_PathParameters_PathExpansion_Standard_array
22362270

22372271
- Endpoint: `get /routes/path/path/standard/array{/param}`
22382272

22392273
Test path expansion with explode: false when passed an array value.
22402274
Param value: ["a","b"]
2241-
Expected path: /routes/path/standard/array/a,b
2275+
Expected path: /routes/path/path/standard/array/a,b
22422276

22432277
### Routes_PathParameters_PathExpansion_Standard_primitive
22442278

22452279
- Endpoint: `get /routes/path/path/standard/primitive{/param}`
22462280

22472281
Test path expansion with explode: false when passed a primitive value.
22482282
Param value: "a"
2249-
Expected path: /routes/path/standard/primitive/a
2283+
Expected path: /routes/path/path/standard/primitive/a
22502284

22512285
### Routes_PathParameters_PathExpansion_Standard_record
22522286

22532287
- Endpoint: `get /routes/path/path/standard/record{/param}`
22542288

22552289
Test path expansion with explode: false when passed a record value.
22562290
Param value: {a: 1, b: 2}
2257-
Expected path: /routes/path/standard/record/a,1,b,2
2291+
Expected path: /routes/path/path/standard/record/a,1,b,2
22582292

22592293
### Routes_PathParameters_ReservedExpansion_annotation
22602294

@@ -2278,47 +2312,47 @@ Expected path: "/routes/path/reserved-expansion/template/foo/bar%20baz"
22782312

22792313
Test simple expansion with explode: true when passed an array value.
22802314
Param value: ["a","b"]
2281-
Expected path: /routes/simple/explode/arraya.b
2315+
Expected path: /routes/path/simple/explode/arraya.b
22822316

22832317
### Routes_PathParameters_SimpleExpansion_Explode_primitive
22842318

22852319
- Endpoint: `get /routes/path/simple/explode/primitive{param*}`
22862320

22872321
Test simple expansion with explode: true when passed a primitive value.
22882322
Param value: "a"
2289-
Expected path: /routes/simple/explode/primitivea
2323+
Expected path: /routes/path/simple/explode/primitivea
22902324

22912325
### Routes_PathParameters_SimpleExpansion_Explode_record
22922326

22932327
- Endpoint: `get /routes/path/simple/explode/record{param*}`
22942328

22952329
Test simple expansion with explode: true when passed a record value.
22962330
Param value: {a: 1, b: 2}
2297-
Expected path: /routes/simple/explode/recorda=1,b=2
2331+
Expected path: /routes/path/simple/explode/recorda=1,b=2
22982332

22992333
### Routes_PathParameters_SimpleExpansion_Standard_array
23002334

23012335
- Endpoint: `get /routes/path/simple/standard/array{param}`
23022336

23032337
Test simple expansion with explode: false when passed an array value.
23042338
Param value: ["a","b"]
2305-
Expected path: /routes/simple/standard/arraya,b
2339+
Expected path: /routes/path/simple/standard/arraya,b
23062340

23072341
### Routes_PathParameters_SimpleExpansion_Standard_primitive
23082342

23092343
- Endpoint: `get /routes/path/simple/standard/primitive{param}`
23102344

23112345
Test simple expansion with explode: false when passed a primitive value.
23122346
Param value: "a"
2313-
Expected path: /routes/simple/standard/primitivea
2347+
Expected path: /routes/path/simple/standard/primitivea
23142348

23152349
### Routes_PathParameters_SimpleExpansion_Standard_record
23162350

23172351
- Endpoint: `get /routes/path/simple/standard/record{param}`
23182352

23192353
Test simple expansion with explode: false when passed a record value.
23202354
Param value: {a: 1, b: 2}
2321-
Expected path: /routes/simple/standard/recorda,1,b,2
2355+
Expected path: /routes/path/simple/standard/recorda,1,b,2
23222356

23232357
### Routes_PathParameters_templateOnly
23242358

Original file line numberDiff line numberDiff line change
@@ -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(): 204 | 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(): 204 | 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+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
import { json, passOnSuccess, ScenarioMockApi } from "@typespec/spec-api";
2+
3+
export const Scenarios: Record<string, ScenarioMockApi> = {};
4+
5+
Scenarios.Response_StatusCodeRange_errorResponseStatusCodeInRange = passOnSuccess({
6+
uri: "/response/status-code-range/error-response-status-code-in-range",
7+
method: "get",
8+
request: {
9+
status: 494,
10+
},
11+
response: {
12+
status: 494,
13+
body: json({
14+
code: "request-header-too-large",
15+
message: "Request header too large",
16+
}),
17+
},
18+
kind: "MockApiDefinition",
19+
});
20+
21+
Scenarios.Response_StatusCodeRange_errorResponseStatusCode404 = passOnSuccess({
22+
uri: "/response/status-code-range/error-response-status-code-404",
23+
method: "get",
24+
request: {
25+
status: 404,
26+
},
27+
response: {
28+
status: 404,
29+
body: json({
30+
code: "not-found",
31+
resourceId: "resource1",
32+
}),
33+
},
34+
kind: "MockApiDefinition",
35+
});

0 commit comments

Comments
 (0)