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