View Javadoc
1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one or more
3    * contributor license agreements.  See the NOTICE file distributed with
4    * this work for additional information regarding copyright ownership.
5    * The ASF licenses this file to You under the Apache License, Version 2.0
6    * (the "License"); you may not use this file except in compliance with
7    * the License.  You may obtain a copy of the License at
8    *
9    *      http://www.apache.org/licenses/LICENSE-2.0
10   *
11   * Unless required by applicable law or agreed to in writing, software
12   * distributed under the License is distributed on an "AS IS" BASIS,
13   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14   * See the License for the specific language governing permissions and
15   * limitations under the License.
16   */
17  package org.apache.juneau.bean.openapi3;
18  
19  import static org.apache.juneau.TestUtils.*;
20  import static org.apache.juneau.bean.openapi3.OpenApiBuilder.*;
21  import static org.junit.jupiter.api.Assertions.*;
22  
23  import org.apache.juneau.*;
24  import org.junit.jupiter.api.*;
25  
26  /**
27   * Testcase for {@link Components}.
28   */
29  class Components_Test extends TestBase {
30  
31  	@Nested class A_basicTests extends TestBase {
32  
33  		private static final BeanTester<Components> TESTER =
34  			testBean(
35  				bean()
36  					.setCallbacks(map("a1", callback()))
37  					.setExamples(map("b1", example().setSummary("b2")))
38  					.setHeaders(map("c1", headerInfo(schemaInfo("c2"))))
39  					.setLinks(map("d1", link().setOperationId("d2")))
40  					.setParameters(map("e1", parameter("e2", "e3")))
41  					.setRequestBodies(map("f1", requestBodyInfo().setDescription("f2")))
42  					.setResponses(map("g1", response("g2")))
43  					.setSchemas(map("h1", schemaInfo().setType("h2")))
44  					.setSecuritySchemes(map("i1", securitySchemeInfo("i2")))
45  			)
46  			.props("callbacks{a1},examples{b1{summary}},headers{c1{schema{type}}},links{d1{operationId}},parameters{e1{in,name}},requestBodies{f1{description}},responses{g1{description}},schemas{h1{type}},securitySchemes{i1{type}}")
47  			.vals("{{}},{{b2}},{{{c2}}},{{d2}},{{e2,e3}},{{f2}},{{g2}},{{h2}},{{i2}}")
48  			.json("{callbacks:{a1:{}},examples:{b1:{summary:'b2'}},headers:{c1:{schema:{type:'c2'}}},links:{d1:{operationId:'d2'}},parameters:{e1:{'in':'e2',name:'e3'}},requestBodies:{f1:{description:'f2'}},responses:{g1:{description:'g2'}},schemas:{h1:{type:'h2'}},securitySchemes:{i1:{type:'i2'}}}")
49  			.string("{'callbacks':{'a1':{}},'examples':{'b1':{'summary':'b2'}},'headers':{'c1':{'schema':{'type':'c2'}}},'links':{'d1':{'operationId':'d2'}},'parameters':{'e1':{'in':'e2','name':'e3'}},'requestBodies':{'f1':{'description':'f2'}},'responses':{'g1':{'description':'g2'}},'schemas':{'h1':{'type':'h2'}},'securitySchemes':{'i1':{'type':'i2'}}}".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(), "callbacks", "examples", "headers", "links", "parameters", "requestBodies", "responses", "schemas", "securitySchemes");
78  		}
79  
80  		@Test void a08_nullParameters() {
81  			var x = bean();
82  			assertThrows(IllegalArgumentException.class, () -> x.get(null, String.class));
83  			assertThrows(IllegalArgumentException.class, () -> x.set(null, "value"));
84  		}
85  
86  		@Test void a09_asMap() {
87  			assertBean(
88  				bean()
89  					.setSchemas(map("a1", schemaInfo("a2")))
90  					.set("x1", "x1a")
91  					.asMap(),
92  				"schemas{a1{type}},x1",
93  				"{{a2}},x1a"
94  			);
95  		}
96  
97  		@Test void a10_extraKeys() {
98  			var x = bean().set("x1", "x1a").set("x2", "x2a");
99  			assertList(x.extraKeys(), "x1", "x2");
100 			assertEmpty(bean().extraKeys());
101 		}
102 
103 		@Test void a11_strictMode() {
104 			assertThrows(RuntimeException.class, () -> bean().strict().set("foo", "bar"));
105 
106 			assertFalse(bean().isStrict());
107 			assertTrue(bean().strict().isStrict());
108 			assertFalse(bean().strict(false).isStrict());
109 
110 			assertDoesNotThrow(() -> bean().set("foo", "bar"));
111 		}
112 	}
113 
114 	@Nested class B_emptyTests extends TestBase {
115 
116 		private static final BeanTester<Components> TESTER =
117 			testBean(bean())
118 			.props("schemas,responses,parameters,examples,requestBodies,headers,securitySchemes,links,callbacks")
119 			.vals("<null>,<null>,<null>,<null>,<null>,<null>,<null>,<null>,<null>")
120 			.json("{}")
121 			.string("{}")
122 		;
123 
124 		@Test void b01_gettersAndSetters() {
125 			TESTER.assertGettersAndSetters();
126 		}
127 
128 		@Test void b02_copy() {
129 			TESTER.assertCopy();
130 		}
131 
132 		@Test void b03_toJson() {
133 			TESTER.assertToJson();
134 		}
135 
136 		@Test void b04_fromJson() {
137 			TESTER.assertFromJson();
138 		}
139 
140 		@Test void b05_roundTrip() {
141 			TESTER.assertRoundTrip();
142 		}
143 
144 		@Test void b06_toString() {
145 			TESTER.assertToString();
146 		}
147 
148 		@Test void b07_keySet() {
149 			assertEmpty(TESTER.bean().keySet());
150 		}
151 	}
152 
153 	@Nested class C_extraProperties extends TestBase {
154 		private static final BeanTester<Components> TESTER =
155 			testBean(
156 				bean()
157 					.set("callbacks", map("a1", callback()))
158 					.set("examples", map("b1", example().setSummary("b2")))
159 					.set("headers", map("c1", headerInfo(schemaInfo("c2"))))
160 					.set("links", map("d1", link().setOperationId("d2")))
161 					.set("parameters", map("e1", parameter("e2", "e3")))
162 					.set("requestBodies", map("f1", requestBodyInfo().setDescription("f2")))
163 					.set("responses", map("g1", response("g2")))
164 					.set("schemas", map("h1", schemaInfo().setType("h2")))
165 					.set("securitySchemes", map("i1", securitySchemeInfo("i2")))
166 					.set("x1", "x1a")
167 					.set("x2", null)
168 			)
169 			.props("callbacks{a1},examples{b1{summary}},headers{c1{schema{type}}},links{d1{operationId}},parameters{e1{in,name}},requestBodies{f1{description}},responses{g1{description}},schemas{h1{type}},securitySchemes{i1{type}},x1,x2")
170 			.vals("{{}},{{b2}},{{{c2}}},{{d2}},{{e2,e3}},{{f2}},{{g2}},{{h2}},{{i2}},x1a,<null>")
171 			.json("{callbacks:{a1:{}},examples:{b1:{summary:'b2'}},headers:{c1:{schema:{type:'c2'}}},links:{d1:{operationId:'d2'}},parameters:{e1:{'in':'e2',name:'e3'}},requestBodies:{f1:{description:'f2'}},responses:{g1:{description:'g2'}},schemas:{h1:{type:'h2'}},securitySchemes:{i1:{type:'i2'}},x1:'x1a'}")
172 			.string("{'callbacks':{'a1':{}},'examples':{'b1':{'summary':'b2'}},'headers':{'c1':{'schema':{'type':'c2'}}},'links':{'d1':{'operationId':'d2'}},'parameters':{'e1':{'in':'e2','name':'e3'}},'requestBodies':{'f1':{'description':'f2'}},'responses':{'g1':{'description':'g2'}},'schemas':{'h1':{'type':'h2'}},'securitySchemes':{'i1':{'type':'i2'}},'x1':'x1a'}".replace('\'','"'))
173 		;
174 
175 		@Test void c01_gettersAndSetters() {
176 			TESTER.assertGettersAndSetters();
177 		}
178 
179 		@Test void c02_copy() {
180 			TESTER.assertCopy();
181 		}
182 
183 		@Test void c03_toJson() {
184 			TESTER.assertToJson();
185 		}
186 
187 		@Test void c04_fromJson() {
188 			TESTER.assertFromJson();
189 		}
190 
191 		@Test void c05_roundTrip() {
192 			TESTER.assertRoundTrip();
193 		}
194 
195 		@Test void c06_toString() {
196 			TESTER.assertToString();
197 		}
198 
199 		@Test void c07_keySet() {
200 			assertList(TESTER.bean().keySet(), "callbacks", "examples", "headers", "links", "parameters", "requestBodies", "responses", "schemas", "securitySchemes", "x1", "x2");
201 		}
202 
203 		@Test void c08_get() {
204 			assertMapped(
205 				TESTER.bean(), (obj,prop) -> obj.get(prop, Object.class),
206 				"callbacks{a1},examples{b1{summary}},headers{c1{schema{type}}},links{d1{operationId}},parameters{e1{in,name}},requestBodies{f1{description}},responses{g1{description}},schemas{h1{type}},securitySchemes{i1{type}},x1,x2",
207 				"{{}},{{b2}},{{{c2}}},{{d2}},{{e2,e3}},{{f2}},{{g2}},{{h2}},{{i2}},x1a,<null>"
208 			);
209 		}
210 
211 		@Test void c09_getTypes() {
212 			assertMapped(
213 				TESTER.bean(), (obj,prop) -> simpleClassNameOf(obj.get(prop, Object.class)),
214 				"callbacks,examples,headers,links,parameters,requestBodies,responses,schemas,securitySchemes,x1,x2",
215 				"LinkedHashMap,LinkedHashMap,LinkedHashMap,LinkedHashMap,LinkedHashMap,LinkedHashMap,LinkedHashMap,LinkedHashMap,LinkedHashMap,String,<null>"
216 			);
217 		}
218 
219 		@Test void c10_nullPropertyValue() {
220 			assertThrows(IllegalArgumentException.class, ()->bean().get(null));
221 			assertThrows(IllegalArgumentException.class, ()->bean().get(null, String.class));
222 			assertThrows(IllegalArgumentException.class, ()->bean().set(null, "a"));
223 		}
224 	}
225 
226 	//---------------------------------------------------------------------------------------------
227 	// Helper methods
228 	//---------------------------------------------------------------------------------------------
229 
230 	private static Components bean() {
231 		return components();
232 	}
233 }