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.rest.annotation;
18  
19  import static org.apache.juneau.TestUtils.*;
20  import static org.junit.jupiter.api.Assertions.*;
21  
22  import org.apache.juneau.*;
23  import org.apache.juneau.annotation.*;
24  import org.apache.juneau.commons.lang.*;
25  import org.apache.juneau.http.annotation.*;
26  import org.apache.juneau.rest.mock.*;
27  import org.junit.jupiter.api.*;
28  
29  class ResponseHeader_Test extends TestBase {
30  
31  	//------------------------------------------------------------------------------------------------------------------
32  	// @Header on method parameters
33  	//------------------------------------------------------------------------------------------------------------------
34  
35  	@Rest
36  	public static class A {
37  		@RestGet
38  		public void a(Value<A1> h) {
39  			h.set(new A1());
40  		}
41  		@RestGet
42  		public void b(@Header(name="Foo") Value<String> h) {
43  			h.set("foo");
44  		}
45  		@RestGet
46  		public void c(@Header(name="Bar") Value<A1> h) {
47  			h.set(new A1());
48  		}
49  	}
50  
51  	@Header(name="Foo")
52  	public static class A1 {
53  		@Override
54  		public String toString() {return "foo";}
55  	}
56  
57  	@Test void a01_methodParameters() throws Exception {
58  		var a = MockRestClient.build(A.class);
59  		a.get("/a")
60  			.run()
61  			.assertStatus(200)
62  			.assertHeader("Foo").is("foo");
63  		a.get("/b")
64  			.run()
65  			.assertStatus(200)
66  			.assertHeader("Foo").is("foo");
67  		a.get("/c")
68  			.run()
69  			.assertStatus(200)
70  			.assertHeader("Bar").is("foo");
71  	}
72  
73  	//------------------------------------------------------------------------------------------------------------------
74  	// @Header swagger on POJOs
75  	//------------------------------------------------------------------------------------------------------------------
76  
77  	@Rest
78  	public static class B {
79  
80  		@Header(
81  			name="H"
82  		)
83  		@Schema(
84  			description="a",
85  			type="string"
86  		)
87  		public static class B1 {}
88  		@RestGet
89  		public void a(Value<B1> h) { /* no-op */ }
90  
91  		@Header(
92  			name="H",
93  			schema=@Schema(description="a",type="string")
94  		)
95  		public static class B2 {}
96  		@RestGet
97  		public void b(Value<B2> h) { /* no-op */ }
98  
99  		@Header(
100 			name="H",
101 			schema=@Schema(description="b",type="number")
102 		)
103 		@Schema(
104 			description="a",
105 			type="string"
106 		)
107 		public static class B3 {}
108 		@RestGet
109 		public void c(Value<B3> h) { /* no-op */ }
110 
111 		@Header(name="H") @StatusCode(100)
112 		public static class B4 {}
113 		@RestGet
114 		public void d(Value<B4> h) { /* no-op */ }
115 
116 		@Header(name="H") @StatusCode({100,101})
117 		public static class B5 {}
118 		@RestGet
119 		public void e(Value<B5> h) { /* no-op */ }
120 
121 		@Header(name="H") @Schema(description="a")
122 		public static class B6 {}
123 		@RestGet
124 		public void f(Value<B6> h) { /* no-op */ }
125 
126 		@Header("H")
127 		public static class B7 {}
128 		@RestGet
129 		public void g(Value<B7> h) { /* no-op */ }
130 	}
131 
132 	@Test void b01_swagger_onPojo() {
133 		org.apache.juneau.bean.swagger.Swagger s = getSwagger(B.class);
134 
135 		var x = s.getResponseInfo("/a","get",200).getHeader("H");
136 		assertEquals("a", x.getDescription());
137 		assertEquals("string", x.getType());
138 
139 		x = s.getResponseInfo("/b","get",200).getHeader("H");
140 		assertEquals("a", x.getDescription());
141 		assertEquals("string", x.getType());
142 
143 		x = s.getResponseInfo("/c","get",200).getHeader("H");
144 		assertEquals("b", x.getDescription());
145 		assertEquals("number", x.getType());
146 
147 		x = s.getResponseInfo("/d","get",100).getHeader("H");
148 		assertNotNull(x);
149 
150 		var x2 = s.getOperation("/e","get");
151 		assertNotNull(x2.getResponse(100).getHeader("H"));
152 		assertNotNull(x2.getResponse(101).getHeader("H"));
153 
154 		x = s.getResponseInfo("/f","get",200).getHeader("H");
155 		assertEquals("a", x.getDescription());
156 
157 		x = s.getResponseInfo("/g","get",200).getHeader("H");
158 		assertNotNull(x);
159 	}
160 
161 	//------------------------------------------------------------------------------------------------------------------
162 	// @Header swagger on method parameters
163 	//------------------------------------------------------------------------------------------------------------------
164 
165 	@Rest
166 	public static class C {
167 
168 		public static class C1 {}
169 		@RestGet
170 		public void a(
171 			@Header(
172 				name="H"
173 			)
174 			@Schema(
175 				description="a",
176 				type="string"
177 			)
178 			Value<C1> h) { /* no-op */ }
179 
180 		public static class C2 {}
181 		@RestGet
182 		public void b(
183 			@Header(
184 				name="H",
185 				schema=@Schema(description="a",type="string")
186 			)
187 			Value<C2> h) { /* no-op */ }
188 
189 		public static class C3 {}
190 		@RestGet
191 		public void c(
192 			@Header(
193 				name="H",
194 				schema=@Schema(description="b",type="number")
195 			)
196 			@Schema(
197 				description="a",
198 				type="string"
199 			)
200 			Value<C3> h) { /* no-op */ }
201 
202 		public static class C4 {}
203 		@RestGet
204 		public void d(@Header(name="H") @StatusCode(100) Value<C4> h) { /* no-op */ }
205 
206 		public static class C5 {}
207 		@RestGet
208 		public void e(@Header(name="H") @StatusCode({100,101}) Value<C5> h) { /* no-op */ }
209 
210 		public static class C6 {}
211 		@RestGet
212 		public void f(@Header(name="H") @Schema(description="a") Value<C6> h) { /* no-op */ }
213 
214 		public static class C7 {}
215 		@RestGet
216 		public void g(@Header("H") Value<C7> h) { /* no-op */ }
217 	}
218 
219 	@Test void c01_swagger_onMethodParameters() {
220 		org.apache.juneau.bean.swagger.Swagger sc = getSwagger(C.class);
221 
222 		var x = sc.getResponseInfo("/a","get",200).getHeader("H");
223 		assertEquals("a", x.getDescription());
224 		assertEquals("string", x.getType());
225 
226 		x = sc.getResponseInfo("/b","get",200).getHeader("H");
227 		assertEquals("a", x.getDescription());
228 		assertEquals("string", x.getType());
229 
230 		x = sc.getResponseInfo("/c","get",200).getHeader("H");
231 		assertEquals("b", x.getDescription());
232 		assertEquals("number", x.getType());
233 
234 		x = sc.getResponseInfo("/d","get",100).getHeader("H");
235 		assertNotNull(x);
236 
237 		var x2 = sc.getOperation("/e","get");
238 		assertNotNull(x2.getResponse(100).getHeader("H"));
239 		assertNotNull(x2.getResponse(101).getHeader("H"));
240 
241 		x = sc.getResponseInfo("/f","get",200).getHeader("H");
242 		assertEquals("a", x.getDescription());
243 
244 		x = sc.getResponseInfo("/g","get",200).getHeader("H");
245 		assertNotNull(x);
246 	}
247 }