1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.apache.juneau.bean.swagger;
18
19 import static org.apache.juneau.TestUtils.*;
20 import static org.apache.juneau.bean.swagger.SwaggerBuilder.*;
21 import static org.apache.juneau.commons.utils.CollectionUtils.*;
22 import static org.apache.juneau.junit.bct.BctAssertions.*;
23 import static org.junit.jupiter.api.Assertions.*;
24
25 import java.util.*;
26
27 import org.apache.juneau.*;
28 import org.apache.juneau.collections.*;
29 import org.junit.jupiter.api.*;
30
31
32
33
34 class ResponseInfo_Test extends TestBase {
35
36 @Nested class A_basicTests extends TestBase {
37
38 private static final BeanTester<ResponseInfo> TESTER =
39 testBean(
40 bean()
41 .setDescription("a")
42 .setExamples(map("x1", "x2"))
43 .setHeaders(map("x3", headerInfo().setType("x4")))
44 .setSchema(schemaInfo().setType("b"))
45 )
46 .props("description,examples{x1},headers{x3{type}},schema{type}")
47 .vals("a,{x2},{{x4}},{b}")
48 .json("{description:'a',examples:{x1:'x2'},headers:{x3:{type:'x4'}},schema:{type:'b'}}")
49 .string("{'description':'a','examples':{'x1':'x2'},'headers':{'x3':{'type':'x4'}},'schema':{'type':'b'}}".replace('\'', '"'))
50 ;
51
52 @Test void a01_gettersAndSetters() {
53 TESTER.assertGettersAndSetters();
54 }
55
56 @Test void a02_copy() {
57 TESTER.assertCopy();
58 }
59
60 @Test void a03_toJson() {
61 TESTER.assertToJson();
62 }
63
64 @Test void a04_fromJson() {
65 TESTER.assertFromJson();
66 }
67
68 @Test void a05_roundTrip() {
69 TESTER.assertRoundTrip();
70 }
71
72 @Test void a06_toString() {
73 TESTER.assertToString();
74 }
75
76 @Test void a07_keySet() {
77 assertList(TESTER.bean().keySet(), "description", "examples", "headers", "schema");
78 }
79
80 @Test void a08_otherGettersAndSetters() {
81
82
83
84 var x = bean().setHeaders(map(
85 "a1", headerInfo().setType("a2"),
86 "a3", headerInfo().setType("a4")
87 ));
88
89 assertBean(x.getHeader("a1"), "type", "a2");
90 assertBean(x.getHeader("a3"), "type", "a4");
91 }
92
93 @Test void a09_nullParameters() {
94 var x = bean();
95
96 assertThrows(IllegalArgumentException.class, ()->x.getHeader(null));
97 assertThrows(IllegalArgumentException.class, ()->x.addExample(null, "a"));
98 assertThrows(IllegalArgumentException.class, ()->x.addExample("a", null));
99 assertThrows(IllegalArgumentException.class, ()->x.addHeader(null, headerInfo()));
100 assertThrows(IllegalArgumentException.class, ()->x.addHeader("a", null));
101 }
102
103 @Test void a10_addMethods() {
104 var x = bean().addExample("a1", "a2").addHeader("a3", headerInfo().setDescription("a4"));
105 assertNotNull(x);
106 assertNotNull(x.getExamples());
107 assertNotNull(x.getHeaders());
108 }
109
110 @Test void a11_asMap() {
111 assertBean(
112 bean()
113 .setDescription("a")
114 .set("x1", "x1a")
115 .asMap(),
116 "description,x1",
117 "a,x1a"
118 );
119 }
120
121 @Test void a12_extraKeys() {
122 var x = bean().set("x1", "x1a").set("x2", "x2a");
123 assertList(x.extraKeys(), "x1", "x2");
124 assertEmpty(bean().extraKeys());
125 }
126
127 @Test void a13_strictMode() {
128 assertThrows(RuntimeException.class, () -> bean().strict().set("foo", "bar"));
129 assertDoesNotThrow(() -> bean().set("foo", "bar"));
130
131 assertFalse(bean().isStrict());
132 assertTrue(bean().strict().isStrict());
133 assertFalse(bean().strict(false).isStrict());
134 }
135
136 @Test void a14_copyFrom() {
137 var x = bean().setDescription("a").setSchema(schemaInfo().setTitle("b")).addHeader("c1", headerInfo()).addExample("d1", "d2");
138 var y = bean().copyFrom(x);
139 assertBean(y, "description,schema{title}", "a,{b}");
140
141 y = bean().setDescription("c").copyFrom(x);
142 assertBean(y, "description,schema{title}", "a,{b}");
143
144 y = bean().setDescription("c").copyFrom(null);
145 assertBean(y, "description", "c");
146
147 assertJson("{}", bean().copyFrom(bean()));
148 }
149
150 @Test void a15_getHeader() {
151
152 var x = bean();
153 assertNull(x.getHeader("nonexistent"));
154
155
156 var y = bean()
157 .setHeaders(map("header1", headerInfo().setType("string")));
158
159 assertNotNull(y.getHeader("header1"));
160 assertEquals("string", y.getHeader("header1").getType());
161 assertNull(y.getHeader("nonexistent"));
162
163
164 assertThrows(IllegalArgumentException.class, () -> y.getHeader(null));
165 }
166 }
167
168 @Nested class B_emptyTests extends TestBase {
169
170 private static final BeanTester<ResponseInfo> TESTER =
171 testBean(bean())
172 .props("description,schema,headers,examples")
173 .vals("<null>,<null>,<null>,<null>")
174 .json("{}")
175 .string("{}")
176 ;
177
178 @Test void b01_gettersAndSetters() {
179 TESTER.assertGettersAndSetters();
180 }
181
182 @Test void b02_copy() {
183 TESTER.assertCopy();
184 }
185
186 @Test void b03_toJson() {
187 TESTER.assertToJson();
188 }
189
190 @Test void b04_fromJson() {
191 TESTER.assertFromJson();
192 }
193
194 @Test void b05_roundTrip() {
195 TESTER.assertRoundTrip();
196 }
197
198 @Test void b06_toString() {
199 TESTER.assertToString();
200 }
201
202 @Test void b07_keySet() {
203 assertEmpty(TESTER.bean().keySet());
204 }
205
206 @Test void b08_nullParameters() {
207 var x = bean();
208 assertThrows(IllegalArgumentException.class, () -> x.get(null, String.class));
209 assertThrows(IllegalArgumentException.class, () -> x.set(null, "value"));
210 }
211 }
212
213 @Nested class C_extraProperties extends TestBase {
214
215 private static final BeanTester<ResponseInfo> TESTER =
216 testBean(
217 bean()
218 .set("description", "a")
219 .set("examples", m("x1", "x2"))
220 .set("headers", m("x3", headerInfo().setType("x4")))
221 .set("schema", schemaInfo().setType("b"))
222 .set("x5", "x5a")
223 .set("x6", null)
224 )
225 .props("description,examples{x1},headers{x3{type}},schema{type},x5,x6")
226 .vals("a,{x2},{{x4}},{b},x5a,<null>")
227 .json("{description:'a',examples:{x1:'x2'},headers:{x3:{type:'x4'}},schema:{type:'b'},x5:'x5a'}")
228 .string("{'description':'a','examples':{'x1':'x2'},'headers':{'x3':{'type':'x4'}},'schema':{'type':'b'},'x5':'x5a'}".replace('\'', '"'))
229 ;
230
231 @Test void c01_gettersAndSetters() {
232 TESTER.assertGettersAndSetters();
233 }
234
235 @Test void c02_copy() {
236 TESTER.assertCopy();
237 }
238
239 @Test void c03_toJson() {
240 TESTER.assertToJson();
241 }
242
243 @Test void c04_fromJson() {
244 TESTER.assertFromJson();
245 }
246
247 @Test void c05_roundTrip() {
248 TESTER.assertRoundTrip();
249 }
250
251 @Test void c06_toString() {
252 TESTER.assertToString();
253 }
254
255 @Test void c07_keySet() {
256 assertList(TESTER.bean().keySet(), "description", "examples", "headers", "schema", "x5", "x6");
257 }
258
259 @Test void c08_get() {
260 assertMapped(
261 TESTER.bean(), (obj,prop) -> obj.get(prop, Object.class),
262 "description,examples{x1},headers{x3{type}},schema{type},x5,x6",
263 "a,{x2},{{x4}},{b},x5a,<null>"
264 );
265 }
266
267 @Test void c09_getTypes() {
268 assertMapped(
269 TESTER.bean(), (obj,prop) -> cns(obj.get(prop, Object.class)),
270 "description,examples,headers,schema,x5,x6",
271 "String,LinkedHashMap,LinkedHashMap,SchemaInfo,String,<null>"
272 );
273 }
274
275 @Test void c10_nullPropertyValue() {
276 assertThrows(IllegalArgumentException.class, ()->bean().get(null));
277 assertThrows(IllegalArgumentException.class, ()->bean().get(null, String.class));
278 assertThrows(IllegalArgumentException.class, ()->bean().set(null, "a"));
279 }
280 }
281
282 @Nested class D_refs extends TestBase {
283
284 @Test void d01_resolveRefs_schema() {
285 var swagger = swagger()
286 .addDefinition("Pet", JsonMap.of("type", "object", "title", "Pet"));
287
288 assertBean(
289 responseInfo().setDescription("Success").setSchema(schemaInfo().setRef("#/definitions/Pet")).resolveRefs(swagger, new ArrayDeque<>(), 10),
290 "description,schema{type,title}",
291 "Success,{object,Pet}"
292 );
293 }
294
295 @Test void d02_resolveRefs_headers() {
296 var swagger = swagger()
297 .addDefinition("MyHeader", JsonMap.of("type", "string", "description", "My Header"));
298
299 assertBean(
300 responseInfo().setDescription("Success").addHeader("X-Custom", headerInfo().setRef("#/definitions/MyHeader")).resolveRefs(swagger, new ArrayDeque<>(), 10),
301 "description,headers{X-Custom{type,description}}",
302 "Success,{{string,My Header}}"
303 );
304 }
305
306 @Test void d03_resolveRefs_maxDepth() {
307 var swagger = swagger()
308 .addDefinition("Pet", JsonMap.of("type", "object", "title", "Pet"));
309
310 assertBean(
311 responseInfo().setDescription("Success").setSchema(schemaInfo().setRef("#/definitions/Pet")).resolveRefs(swagger, new ArrayDeque<>(), 0),
312 "description,schema{ref}",
313 "Success,{#/definitions/Pet}"
314 );
315 }
316 }
317
318
319
320
321
322 private static ResponseInfo bean() {
323 return responseInfo();
324 }
325 }