Skip to content

Commit a458581

Browse files
committed
refs #4912 fixed handling form data parameters, added support for query arguments as objects if lax parsing options are enabled
1 parent 98c7c28 commit a458581

File tree

4 files changed

+388
-112
lines changed

4 files changed

+388
-112
lines changed

examples/test/qlib/Swagger/Swagger.qtest

Lines changed: 161 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1265,8 +1265,6 @@ public class SwaggerTest inherits QUnit::Test {
12651265
assertTrue(loadyaml(my_make_yaml(base + {"parameters": p})));
12661266
p = base.parameters + {"a": {"name": "a", "in": "query", "type": "boolean"}};
12671267
assertTrue(loadyaml(my_make_yaml(base + {"parameters": p})));
1268-
p = base.parameters + {"a": {"name": "a", "in": "query", "type": "file"}};
1269-
assertTrue(loadyaml(my_make_yaml(base + {"parameters": p})));
12701268
p = base.parameters + {"a": {"name": "a", "in": "query", "type": "integer"}};
12711269
assertTrue(loadyaml(my_make_yaml(base + {"parameters": p})));
12721270
p = base.parameters + {"a": {"name": "a", "in": "query", "type": "number"}};
@@ -1333,22 +1331,24 @@ public class SwaggerTest inherits QUnit::Test {
13331331

13341332
# default checks
13351333

1334+
p = base.parameters + {"a": {"name": "a", "in": "formData", "type": "file"}};
1335+
assertTrue(loadyaml(my_make_yaml(base + {"parameters": p})));
1336+
13361337
# TODO
1337-
/*p = base.parameters + {"a": {"name": "a", "in": "query", "type": "array", "items": {"type": "string"}}};
1338+
/*
1339+
p = base.parameters + {"a": {"name": "a", "in": "query", "type": "array", "items": {"type": "string"}}};
13381340
assertTrue(loadyaml(my_make_yaml(base + {"parameters": p})));
13391341
p = base.parameters + {"a": {"name": "a", "in": "query", "type": "array", "items": {"type": "string"}, "default": 5}};
1340-
assertThrows("INVALID-FIELD-TYPE", "default", loadyaml, my_make_yaml(base + {"parameters": p}));*/
1342+
assertThrows("INVALID-FIELD-TYPE", "default", loadyaml, my_make_yaml(base + {"parameters": p}));
1343+
*/
13411344

13421345
p = base.parameters + {"a": {"name": "a", "in": "query", "type": "boolean", "default": "true"}};
13431346
assertTrue(loadyaml(my_make_yaml(base + {"parameters": p})));
13441347
p = base.parameters + {"a": {"name": "a", "in": "query", "type": "boolean", "default": 5}};
13451348
assertThrows("INVALID-FIELD-TYPE", "default", loadyaml, my_make_yaml(base + {"parameters": p}));
13461349

1347-
# TODO
1348-
/*p = base.parameters + {"a": {"name": "a", "in": "query", "type": "file"}};
1349-
assertTrue(loadyaml(my_make_yaml(base + {"parameters": p})));
13501350
p = base.parameters + {"a": {"name": "a", "in": "query", "type": "file"}};
1351-
assertThrows("INVALID-FIELD-TYPE", "default", loadyaml, my_make_yaml(base + {"parameters": p}));*/
1351+
assertThrows("INVALID-FIELD-VALUE", "invalid .* type", loadyaml, my_make_yaml(base + {"parameters": p}));
13521352

13531353
p = base.parameters + {"a": {"name": "a", "in": "query", "type": "integer", "default": 5}};
13541354
assertTrue(loadyaml(my_make_yaml(base + {"parameters": p})));
@@ -2159,7 +2159,7 @@ public class SwaggerTest inherits QUnit::Test {
21592159
)
21602160
),
21612161
);
2162-
b.paths."/api/b2517" += (
2162+
b.paths."/api/b2517" += {
21632163
"post": (
21642164
"responses": (
21652165
"200": ("description": "success",),
@@ -2177,7 +2177,46 @@ public class SwaggerTest inherits QUnit::Test {
21772177
},
21782178
)
21792179
),
2180-
);
2180+
};
2181+
b.paths."/api/unix-time" += {
2182+
"get": {
2183+
"responses": {
2184+
"200": {"description": "success",},
2185+
},
2186+
#"produces": (MimeTypeJson,),
2187+
"parameters": (
2188+
{
2189+
"in": "query",
2190+
"name": "t",
2191+
"type": "integer",
2192+
"format": "unix-time",
2193+
},
2194+
)
2195+
},
2196+
"post": {
2197+
"responses": {
2198+
"200": {
2199+
"description": "success",
2200+
"schema": {
2201+
"type": "integer",
2202+
"format": "unix-time",
2203+
}
2204+
},
2205+
},
2206+
"consumes": (MimeTypeJson,),
2207+
"produces": (MimeTypeJson,),
2208+
"parameters": (
2209+
{
2210+
"in": "body",
2211+
"name": "t",
2212+
"schema": {
2213+
"type": "integer",
2214+
"format": "unix-time",
2215+
},
2216+
},
2217+
)
2218+
},
2219+
};
21812220

21822221
remove b.parameters.a.type;
21832222

@@ -2596,6 +2635,114 @@ public class SwaggerTest inherits QUnit::Test {
25962635
assertThrows("SCHEMA-VALIDATION-ERROR", \so.parseResponse(), ("post", "/v2/api/b2507", 200,
25972636
"\"string\"", {"content-type": MimeTypeJson}));
25982637
}
2638+
2639+
h = so.processRequest("get", "/v1/api/unix-time?t=2024-09-30T12:35:52", NOTHING, NOTHING, MimeTypeJson);
2640+
assertEq("/v1/api/unix-time?t=1727692552", h.uri_path);
2641+
assertNothing(h.body);
2642+
assertNothing(h.content);
2643+
#printf("h: %y\n", h);
2644+
2645+
{
2646+
hash hdr = ("content-type": h.content);
2647+
hash<RestRequestServerInfo> sh = so.parseRequest("get", h.uri_path, h.body, \hdr);
2648+
on_error printf("sh: %N\n", sh);
2649+
assertEq("/api/unix-time", sh.path);
2650+
assertEq(2024-09-30T12:35:52, sh.query.t);
2651+
assertNothing(sh.body);
2652+
}
2653+
2654+
h = so.processRequest("post", "/v1/api/unix-time", 2024-09-30T12:35:52, NOTHING, MimeTypeJson);
2655+
assertEq("/v1/api/unix-time", h.uri_path);
2656+
assertEq("1727692552", h.body);
2657+
assertEq(MimeTypeJson, h.content);
2658+
#printf("h: %y\n", h);
2659+
2660+
{
2661+
hash<auto> hdr = ("content-type": h.content);
2662+
hash<RestRequestServerInfo> sh = so.parseRequest("post", h.uri_path, h.body, \hdr);
2663+
on_error printf("sh: %N\n", sh);
2664+
assertEq("/api/unix-time", sh.path);
2665+
assertEq(2024-09-30T12:35:52, sh.body);
2666+
}
2667+
2668+
{
2669+
hash<HttpResponseInfo> res = so.processResponse("post", "/api/unix-time", 200, 2024-09-30T12:35:52, NOTHING, MimeTypeJson);
2670+
{
2671+
on_error printf("res: %N\n", res);
2672+
assertEq(200, res."code");
2673+
assertEq(MimeTypeJson, res.hdr."Content-Type");
2674+
assertEq("1727692552", res.body);
2675+
}
2676+
2677+
hash<RestResponseClientInfo> cres = so.parseResponse("post", "/api/unix-time", res."code", res.body, res.hdr);
2678+
assertEq(200, cres."code");
2679+
assertEq(MimeTypeJson, cres.hdr."Content-Type");
2680+
assertEq(2024-09-30T12:35:52, cres.body);
2681+
}
2682+
}
2683+
2684+
{
2685+
hash b += ValidSwaggerSchema;
2686+
b.paths."/api/query-object" += {
2687+
"get": {
2688+
"responses": {
2689+
"200": {
2690+
"description": "success",
2691+
"schema": {
2692+
"type": "string",
2693+
}
2694+
},
2695+
},
2696+
"produces": (MimeTypeJson,),
2697+
"parameters": (
2698+
{
2699+
"in": "query",
2700+
"name": "obj",
2701+
"type": "object",
2702+
},
2703+
)
2704+
},
2705+
};
2706+
2707+
SwaggerSchema so("", b, {
2708+
"parse_flags": LM_ACCEPT_QUERY_OBJECTS,
2709+
});
2710+
2711+
hash<auto> hdr;
2712+
hash<RestRequestServerInfo> sh = so.parseRequest("get", "api/query-object?a=1&b=2", NOTHING, \hdr);
2713+
{
2714+
on_error printf("sh: %N\n", sh);
2715+
assertEq({"a": "1", "b": "2"}, sh.query.obj);
2716+
assertNothing(sh.body);
2717+
}
2718+
2719+
hash<RestRequestClientInfo> req = so.processRequest("get", "api/query-object?a=1&b=2", NOTHING,
2720+
NOTHING, MimeTypeJson);
2721+
{
2722+
on_error printf("req: %N\n", req);
2723+
assertEq("/api/query-object?a=1&b=2", req.uri_path);
2724+
assertEq(MimeTypeJson, req.response_content[0]);
2725+
}
2726+
2727+
hash<RestResponseClientInfo> rsh = so.parseResponse("get", "api/query-object?a=1&b=2", 200, "\"OK\"",
2728+
{"content-type": MimeTypeJson});
2729+
{
2730+
on_error printf("rsh: %N\n", rsh);
2731+
assertEq(200, rsh.code);
2732+
assertEq(MimeTypeJson, rsh.hdr."content-type");
2733+
assertEq("OK", rsh.body);
2734+
assertThrows("SCHEMA-VALIDATION-ERROR", \so.parseResponse(), ("post", "/v2/api/b2507", 200,
2735+
"\"string\"", {"content-type": MimeTypeJson}));
2736+
}
2737+
2738+
{
2739+
hash<HttpResponseInfo> res = so.processResponse("get", "api/query-object?a=1&b=2", 200, "OK", NOTHING,
2740+
MimeTypeJson);
2741+
on_error printf("res: %N\n", res);
2742+
assertEq(200, res."code");
2743+
assertEq(MimeTypeJson, res.hdr."Content-Type");
2744+
assertEq("\"OK\"", res.body);
2745+
}
25992746
}
26002747

26012748
{
@@ -2657,13 +2804,13 @@ public class SwaggerTest inherits QUnit::Test {
26572804
{
26582805
string uri = "/pet/findByTags?tags=tag1;tags=tag2";
26592806
hash<RestRequestClientInfo> req = so.processRequest("GET", uri);
2660-
assertEq(uri, req.uri_path);
2807+
assertEq("/v2" + uri, req.uri_path);
26612808
}
26622809

26632810
{
26642811
string uri = "/pet/findByTags?tags=tag1&tags=tag2";
26652812
hash<RestRequestClientInfo> req = so.processRequest("GET", uri);
2666-
assertEq(uri, req.uri_path);
2813+
assertEq("/v2" + uri, req.uri_path);
26672814
}
26682815

26692816
{
@@ -2781,7 +2928,8 @@ public class SwaggerTest inherits QUnit::Test {
27812928
assertEq(MimeTypeJson, res.hdr."Content-Type");
27822929

27832930
body.shipDate = 200;
2784-
assertThrows("SCHEMA-VALIDATION-ERROR", "shipDate", \so.processResponse(), ("post", "/store/order", 200, body, NOTHING, MimeTypeJson));
2931+
assertThrows("SCHEMA-VALIDATION-ERROR", "shipDate", \so.processResponse(), ("post", "/store/order", 200,
2932+
body, NOTHING, MimeTypeJson));
27852933
}
27862934
}
27872935

examples/test/qlib/Swagger/SwaggerDataProvider.qtest

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
%requires ../../../../qlib/Util.qm
1818
%requires ../../../../qlib/Mime.qm
1919
%requires ../../../../qlib/QUnit.qm
20+
%requires ../../../../qlib/FsUtil.qm
2021
%requires ../../../../qlib/Logger.qm
2122
%requires ../../../../qlib/DataProvider
2223
%requires ../../../../qlib/HttpServerUtil.qm
@@ -30,6 +31,7 @@
3031

3132
public class SwaggerDataProviderTest inherits QUnit::Test {
3233
constructor() : Test("SwaggerDataProviderTest", "1.0") {
34+
addTestCase("compat test", \compatTest());
3335
addTestCase("swagger data provider test", \testSwaggerDataProvider());
3436
set_return_value(main());
3537
}
@@ -43,6 +45,65 @@ public class SwaggerDataProviderTest inherits QUnit::Test {
4345
%endif
4446
}
4547

48+
compatTest() {
49+
hash<auto> schema = {
50+
"swagger": "2.0",
51+
"info": {
52+
"title": "test",
53+
"version": "1.0"
54+
},
55+
"paths": {
56+
"/api/query-object": {
57+
"get": {
58+
"responses": {
59+
"200": {
60+
"description": "success",
61+
"schema": {
62+
"type": "string",
63+
}
64+
},
65+
},
66+
"produces": (MimeTypeJson,),
67+
"parameters": (
68+
{
69+
"in": "query",
70+
"name": "obj",
71+
"type": "object",
72+
},
73+
)
74+
},
75+
},
76+
},
77+
};
78+
79+
TmpFile file("swagger-data-provider-test-", "yaml");
80+
file.file.write(make_yaml(schema));
81+
SwaggerDataProvider prov({
82+
"schema": file.path,
83+
"lax_parsing": True,
84+
});
85+
assertEq("test", prov.getName());
86+
87+
{
88+
AbstractDataProvider p0 = prov.getChildProviderPath("api/query-object/GET");
89+
AbstractDataProviderType req = p0.getRequestType();
90+
AbstractDataField q = req.getField("query");
91+
assertEq(NT_HASH, q.getType().getBaseTypeCode());
92+
assertEq(NT_HASH, q.getType().getField("obj").getType().getBaseTypeCode());
93+
94+
hash<auto> obj = {
95+
"a": 1,
96+
"b": 2,
97+
};
98+
auto v = req.acceptsValue({
99+
"query": {
100+
"obj": obj,
101+
},
102+
});
103+
assertEq(obj, v.query.obj);
104+
}
105+
}
106+
46107
testSwaggerDataProvider() {
47108
checkModules();
48109

0 commit comments

Comments
 (0)