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