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 java.net.*;
24  
25  import org.apache.juneau.*;
26  import org.junit.jupiter.api.*;
27  
28  /**
29   * Testcase for {@link ExternalDocumentation}.
30   */
31  class ExternalDocumentation_Test extends TestBase {
32  
33  	@Nested class A_basicTests extends TestBase {
34  
35  		private static final BeanTester<ExternalDocumentation> TESTER =
36  			testBean(
37  				bean()
38  					.setDescription("a")
39  					.setUrl(URI.create("b"))
40  			)
41  			.props("description,url")
42  			.vals("a,b")
43  			.json("{description:'a',url:'b'}")
44  			.string("{'description':'a','url':'b'}".replace('\'','"'))
45  		;
46  
47  		@Test void a01_gettersAndSetters() {
48  			TESTER.assertGettersAndSetters();
49  		}
50  
51  		@Test void a02_copy() {
52  			TESTER.assertCopy();
53  		}
54  
55  		@Test void a03_toJson() {
56  			TESTER.assertToJson();
57  		}
58  
59  		@Test void a04_fromJson() {
60  			TESTER.assertFromJson();
61  		}
62  
63  		@Test void a05_roundTrip() {
64  			TESTER.assertRoundTrip();
65  		}
66  
67  		@Test void a06_toString() {
68  			TESTER.assertToString();
69  		}
70  
71  		@Test void a07_keySet() {
72  			assertList(TESTER.bean().keySet(), "description", "url");
73  		}
74  
75  		@Test void a08_nullParameters() {
76  			var x = bean();
77  			assertThrows(IllegalArgumentException.class, () -> x.get(null, String.class));
78  			assertThrows(IllegalArgumentException.class, () -> x.set(null, "value"));
79  		}
80  	}
81  
82  	@Nested class B_emptyTests extends TestBase {
83  
84  		private static final BeanTester<ExternalDocumentation> TESTER =
85  			testBean(bean())
86  			.props("url,description")
87  			.vals("<null>,<null>")
88  			.json("{}")
89  			.string("{}")
90  		;
91  
92  		@Test void b01_gettersAndSetters() {
93  			TESTER.assertGettersAndSetters();
94  		}
95  
96  		@Test void b02_copy() {
97  			TESTER.assertCopy();
98  		}
99  
100 		@Test void b03_toJson() {
101 			TESTER.assertToJson();
102 		}
103 
104 		@Test void b04_fromJson() {
105 			TESTER.assertFromJson();
106 		}
107 
108 		@Test void b05_roundTrip() {
109 			TESTER.assertRoundTrip();
110 		}
111 
112 		@Test void b06_toString() {
113 			TESTER.assertToString();
114 		}
115 
116 		@Test void b07_keySet() {
117 			assertEmpty(TESTER.bean().keySet());
118 		}
119 	}
120 
121 	@Nested class C_extraProperties extends TestBase {
122 		private static final BeanTester<ExternalDocumentation> TESTER =
123 			testBean(
124 				bean()
125 					.set("description", "a")
126 					.set("url", URI.create("b"))
127 					.set("x1", "x1a")
128 					.set("x2", null)
129 			)
130 			.props("description,url,x1,x2")
131 			.vals("a,b,x1a,<null>")
132 			.json("{description:'a',url:'b',x1:'x1a'}")
133 			.string("{'description':'a','url':'b','x1':'x1a'}".replace('\'', '"'))
134 		;
135 
136 		@Test void c01_gettersAndSetters() {
137 			TESTER.assertGettersAndSetters();
138 		}
139 
140 		@Test void c02_copy() {
141 			TESTER.assertCopy();
142 		}
143 
144 		@Test void c03_toJson() {
145 			TESTER.assertToJson();
146 		}
147 
148 		@Test void c04_fromJson() {
149 			TESTER.assertFromJson();
150 		}
151 
152 		@Test void c05_roundTrip() {
153 			TESTER.assertRoundTrip();
154 		}
155 
156 		@Test void c06_toString() {
157 			TESTER.assertToString();
158 		}
159 
160 		@Test void c07_keySet() {
161 			assertList(TESTER.bean().keySet(), "description", "url", "x1", "x2");
162 		}
163 
164 		@Test void c08_get() {
165 			assertMapped(
166 				TESTER.bean(), (obj,prop) -> obj.get(prop, Object.class),
167 				"description,url,x1,x2",
168 				"a,b,x1a,<null>"
169 			);
170 		}
171 
172 		@Test void c09_getTypes() {
173 			assertMapped(
174 				TESTER.bean(), (obj,prop) -> simpleClassNameOf(obj.get(prop, Object.class)),
175 				"description,url,x1,x2",
176 				"String,URI,String,<null>"
177 			);
178 		}
179 
180 		@Test void c10_nullPropertyValue() {
181 			assertThrows(IllegalArgumentException.class, ()->bean().get(null));
182 			assertThrows(IllegalArgumentException.class, ()->bean().get(null, String.class));
183 			assertThrows(IllegalArgumentException.class, ()->bean().set(null, "a"));
184 		}
185 	}
186 
187 	@Nested class D_additionalMethods extends TestBase {
188 
189 		@Test void d01_asMap() {
190 			assertBean(
191 				bean()
192 					.setDescription("a")
193 					.set("x1", "x1a")
194 					.asMap(),
195 				"description,x1",
196 				"a,x1a"
197 			);
198 		}
199 
200 		@Test void d02_extraKeys() {
201 			var x = bean().set("x1", "x1a").set("x2", "x2a");
202 			assertList(x.extraKeys(), "x1", "x2");
203 			assertEmpty(bean().extraKeys());
204 		}
205 	}
206 
207 	@Nested class E_strictMode extends TestBase {
208 
209 		@Test void e01_strictModeSetThrowsException() {
210 			var x = bean().strict();
211 			assertThrows(RuntimeException.class, () -> x.set("foo", "bar"));
212 		}
213 
214 		@Test void e02_nonStrictModeAllowsSet() {
215 			var x = bean(); // not strict
216 			assertDoesNotThrow(() -> x.set("foo", "bar"));
217 		}
218 
219 		@Test void e03_strictModeToggle() {
220 			var x = bean();
221 			assertFalse(x.isStrict());
222 			x.strict();
223 			assertTrue(x.isStrict());
224 			x.strict(false);
225 			assertFalse(x.isStrict());
226 		}
227 	}
228 
229 	//---------------------------------------------------------------------------------------------
230 	// Helper methods
231 	//---------------------------------------------------------------------------------------------
232 
233 	private static ExternalDocumentation bean() {
234 		return externalDocumentation();
235 	}
236 }