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