2 * ============LICENSE_START=======================================================
4 * ================================================================================
5 * Copyright © 2025 Deutsche Telekom. All rights reserved.
6 * ================================================================================
7 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
11 * http://www.apache.org/licenses/LICENSE-2.0
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
18 * ============LICENSE_END=========================================================
20 package org.onap.aai.schemaservice.interceptors.pre;
22 import static org.mockito.Mockito.*;
23 import static org.junit.jupiter.api.Assertions.*;
24 import org.junit.jupiter.api.BeforeEach;
25 import org.junit.jupiter.api.Test;
26 import org.junit.jupiter.api.extension.ExtendWith;
27 import org.mockito.InjectMocks;
28 import org.mockito.Mock;
29 import org.mockito.junit.jupiter.MockitoExtension;
30 import org.mockito.junit.jupiter.MockitoSettings;
31 import org.mockito.quality.Strictness;
32 import org.onap.aai.restcore.MediaType;
33 import org.onap.aai.schemaservice.interceptors.AAIHeaderProperties;
34 import org.onap.logging.filter.base.Constants;
35 import org.onap.logging.ref.slf4j.ONAPLogConstants;
36 import javax.ws.rs.container.ContainerRequestContext;
37 import javax.ws.rs.core.MultivaluedHashMap;
38 import javax.ws.rs.core.MultivaluedMap;
39 import javax.ws.rs.core.Response;
40 import java.io.IOException;
41 import java.lang.reflect.Method;
42 import java.util.ArrayList;
43 import java.util.List;
44 import java.util.Optional;
46 @ExtendWith(MockitoExtension.class)
47 @MockitoSettings(strictness = Strictness.LENIENT)
48 public class HeaderValidationTest {
51 private HeaderValidation headerValidation;
54 private ContainerRequestContext requestContext;
56 private MultivaluedMap<String, String> headers;
60 headers = new MultivaluedHashMap<>();
61 when(requestContext.getHeaders()).thenReturn(headers);
65 public void testGetPartnerName_withEmptyPartnerName() {
66 when(requestContext.getHeaderString("X-ONAP-PartnerName")).thenReturn("");
67 when(requestContext.getHeaderString("X-FromAppId")).thenReturn("testAppId");
69 String partnerName = headerValidation.getPartnerName(requestContext);
71 assertEquals("testAppId", partnerName);
75 public void testGetPartnerName_withNullPartnerNameAndFromAppId() {
76 // Mock behavior of getHeaderString to return null for both PARTNER_NAME and FROM_APP_ID
77 when(requestContext.getHeaderString("X-ONAP-PartnerName")).thenReturn(null);
78 when(requestContext.getHeaderString("X-FromAppId")).thenReturn("testAppId");
80 String partnerName = headerValidation.getPartnerName(requestContext);
82 assertEquals("testAppId", partnerName);
86 public void testGetPartnerName_withMissingPartnerNameAndFromAppId() {
87 // Mock behavior of getHeaderString to return null for both PARTNER_NAME and FROM_APP_ID
88 when(requestContext.getHeaderString("X-ONAP-PartnerName")).thenReturn(null);
90 String partnerName = headerValidation.getPartnerName(requestContext);
92 assertNull(partnerName);
96 public void testGetRequestId_withValidRequestId() {
97 // Mock behavior of getHeaderString to return a valid request ID
98 when(requestContext.getHeaderString("X-ONAP-RequestID")).thenReturn("testRequestId");
100 String requestId = headerValidation.getRequestId(requestContext);
102 assertEquals("testRequestId", requestId);
106 public void testFilter_withMissingPartnerName() throws IOException {
107 // Mock behavior for missing PartnerName header
108 when(requestContext.getHeaderString("X-ONAP-PartnerName")).thenReturn("");
109 when(requestContext.getHeaderString("X-FromAppId")).thenReturn("testAppId");
110 when(requestContext.getHeaderString("X-ONAP-RequestId")).thenReturn("testRequestId");
112 headerValidation.filter(requestContext);
114 // Verify that the method calls abortWith due to the missing partner name
115 verify(requestContext).abortWith(argThat(response -> response.getStatus() == 400));
119 void testGetRequestId_ClearsExistingHeaders() {
121 String expectedRequestId = "test-request-id";
122 headers.put(ONAPLogConstants.Headers.REQUEST_ID, new ArrayList<>());
123 headers.put(Constants.HttpHeaders.TRANSACTION_ID, new ArrayList<>());
124 headers.put(Constants.HttpHeaders.HEADER_REQUEST_ID, new ArrayList<>());
125 headers.put(Constants.HttpHeaders.ECOMP_REQUEST_ID, new ArrayList<>());
127 when(requestContext.getHeaderString(ONAPLogConstants.Headers.REQUEST_ID))
128 .thenReturn(expectedRequestId);
130 String actualRequestId = headerValidation.getRequestId(requestContext);
132 assertEquals(expectedRequestId, actualRequestId);
133 verify(requestContext, atLeastOnce()).getHeaders();
134 assertTrue(headers.get(ONAPLogConstants.Headers.REQUEST_ID).isEmpty());
135 assertTrue(headers.get(Constants.HttpHeaders.TRANSACTION_ID).contains(expectedRequestId));
136 assertTrue(headers.get(Constants.HttpHeaders.HEADER_REQUEST_ID).isEmpty());
137 assertTrue(headers.get(Constants.HttpHeaders.ECOMP_REQUEST_ID).isEmpty());
141 void testGetRequestId_WhenEcompRequestIdExists() {
142 String expectedRequestId = "ecomp-123";
143 when(requestContext.getHeaderString(ONAPLogConstants.Headers.REQUEST_ID))
145 when(requestContext.getHeaderString(Constants.HttpHeaders.HEADER_REQUEST_ID))
147 when(requestContext.getHeaderString(Constants.HttpHeaders.TRANSACTION_ID))
149 when(requestContext.getHeaderString(Constants.HttpHeaders.ECOMP_REQUEST_ID))
150 .thenReturn(expectedRequestId);
152 String result = headerValidation.getRequestId(requestContext);
154 assertEquals(expectedRequestId, result);
158 void whenPartnerNameHasValidComponents_shouldReturnFirstComponent() {
159 when(requestContext.getHeaderString(ONAPLogConstants.Headers.PARTNER_NAME)).thenReturn("TEST.COMPONENT");
161 String result = headerValidation.getPartnerName(requestContext);
163 assertEquals("TEST.COMPONENT", result);
167 void whenPartnerNameStartsWithAAI_shouldUseFromAppId() {
168 when(requestContext.getHeaderString(ONAPLogConstants.Headers.PARTNER_NAME)).thenReturn("AAI.COMPONENT");
170 String result = headerValidation.getPartnerName(requestContext);
172 assertEquals("AAI.COMPONENT", result);
176 void shouldClearAndUpdateHeaders() {
177 List<String> oldValues = new ArrayList<>();
178 oldValues.add("OLD-VALUE");
179 headers.put(ONAPLogConstants.Headers.PARTNER_NAME, oldValues);
180 headers.put(AAIHeaderProperties.FROM_APP_ID, oldValues);
182 when(requestContext.getHeaderString(ONAPLogConstants.Headers.PARTNER_NAME)).thenReturn("NEW-SOT");
184 String result = headerValidation.getPartnerName(requestContext);
186 assertEquals("NEW-SOT", result);
187 assertEquals("NEW-SOT", headers.getFirst(AAIHeaderProperties.FROM_APP_ID));
192 public void testGetRequestId_withValidHeaderRequestId() {
193 when(requestContext.getHeaderString(ONAPLogConstants.Headers.REQUEST_ID)).thenReturn("");
194 when(requestContext.getHeaderString(Constants.HttpHeaders.HEADER_REQUEST_ID)).thenReturn("validHeaderRequestId");
196 String result = headerValidation.getRequestId(requestContext);
198 assertEquals("validHeaderRequestId",result);
202 public void testGetRequestIdNull_withValidTransactionId() {
203 when(requestContext.getHeaderString(ONAPLogConstants.Headers.REQUEST_ID)).thenReturn(null);
204 when(requestContext.getHeaderString(Constants.HttpHeaders.HEADER_REQUEST_ID)).thenReturn(null);
205 when(requestContext.getHeaderString(Constants.HttpHeaders.TRANSACTION_ID)).thenReturn("validTransactionId");
207 String result = headerValidation.getRequestId(requestContext);
209 assertEquals("validTransactionId",result);
213 public void testGetRequestIdEmpty_withValidTransactionId() {
214 when(requestContext.getHeaderString(ONAPLogConstants.Headers.REQUEST_ID)).thenReturn("");
215 when(requestContext.getHeaderString(Constants.HttpHeaders.HEADER_REQUEST_ID)).thenReturn("");
216 when(requestContext.getHeaderString(Constants.HttpHeaders.TRANSACTION_ID)).thenReturn("validTransactionId");
218 String result = headerValidation.getRequestId(requestContext);
220 assertEquals("validTransactionId",result);
224 public void testGetRequestId_withValidEcompRequestId() {
226 when(requestContext.getHeaderString(ONAPLogConstants.Headers.REQUEST_ID)).thenReturn(null);
227 when(requestContext.getHeaderString(Constants.HttpHeaders.HEADER_REQUEST_ID)).thenReturn(null);
228 when(requestContext.getHeaderString(Constants.HttpHeaders.TRANSACTION_ID)).thenReturn(null);
229 when(requestContext.getHeaderString(Constants.HttpHeaders.ECOMP_REQUEST_ID)).thenReturn("validEcompRequestId");
231 String result = headerValidation.getRequestId(requestContext);
233 assertEquals("validEcompRequestId",result);
237 public void testGetRequestId_withValidEcompRequestIdAfterEmptyTransactionId() {
238 when(requestContext.getHeaderString(ONAPLogConstants.Headers.REQUEST_ID)).thenReturn(null);
239 when(requestContext.getHeaderString(Constants.HttpHeaders.HEADER_REQUEST_ID)).thenReturn(null);
240 when(requestContext.getHeaderString(Constants.HttpHeaders.TRANSACTION_ID)).thenReturn("");
241 when(requestContext.getHeaderString(Constants.HttpHeaders.ECOMP_REQUEST_ID)).thenReturn("validEcompRequestId");
243 String result = headerValidation.getRequestId(requestContext);
245 assertEquals("validEcompRequestId",result);
249 public void testGetRequestId_withMultipleHeadersValid() {
250 when(requestContext.getHeaderString(ONAPLogConstants.Headers.REQUEST_ID)).thenReturn("validRequestId");
251 when(requestContext.getHeaderString(Constants.HttpHeaders.HEADER_REQUEST_ID)).thenReturn("anotherRequestId");
253 String result = headerValidation.getRequestId(requestContext);
254 assertEquals("validRequestId", result, "Expected validRequestId to be returned as it's the first non-null value");
258 public void testGetPartnerName_withNullPartnerNameAndNullFromAppId() {
259 when(requestContext.getHeaderString(ONAPLogConstants.Headers.PARTNER_NAME)).thenReturn(null);
260 when(requestContext.getHeaderString(AAIHeaderProperties.FROM_APP_ID)).thenReturn(null);
262 String partnerName = headerValidation.getPartnerName(requestContext);
263 assertNull(partnerName, "Expected null partner name when both PARTNER_NAME and FROM_APP_ID are null");
267 public void testGetPartnerName_withNonEmptyPartnerName() {
268 when(requestContext.getHeaderString(ONAPLogConstants.Headers.PARTNER_NAME)).thenReturn("partnerName");
269 when(requestContext.getHeaderString(AAIHeaderProperties.FROM_APP_ID)).thenReturn("testAppId");
270 String partnerName = headerValidation.getPartnerName(requestContext);
272 assertEquals("partnerName", partnerName, "Expected partner name to be used directly when PARTNER_NAME is not empty");
276 public void testGetPartnerName_withNullPartnerNameAndNonEmptyFromAppId() {
277 when(requestContext.getHeaderString(ONAPLogConstants.Headers.PARTNER_NAME)).thenReturn(null);
278 when(requestContext.getHeaderString(AAIHeaderProperties.FROM_APP_ID)).thenReturn("testAppId");
280 String partnerName = headerValidation.getPartnerName(requestContext);
281 assertEquals("testAppId", partnerName, "Expected partner name to fall back to FROM_APP_ID when PARTNER_NAME is null");
285 public void testGetPartnerName_withEmptyFromAppId() {
286 when(requestContext.getHeaderString(ONAPLogConstants.Headers.PARTNER_NAME)).thenReturn("validPartnerName");
287 when(requestContext.getHeaderString(AAIHeaderProperties.FROM_APP_ID)).thenReturn("");
288 String partnerName = headerValidation.getPartnerName(requestContext);
290 assertEquals("validPartnerName", partnerName, "Expected valid PARTNER_NAME to be used even when FROM_APP_ID is empty");
294 public void testGetPartnerName_withValidPartnerNameWithDot() {
295 when(requestContext.getHeaderString(ONAPLogConstants.Headers.PARTNER_NAME)).thenReturn("TEST.COMPONENT");
296 when(requestContext.getHeaderString(AAIHeaderProperties.FROM_APP_ID)).thenReturn("testAppId");
298 String partnerName = headerValidation.getPartnerName(requestContext);
300 assertEquals("TEST.COMPONENT", partnerName, "Expected partner name to return 'TEST.COMPONENT' when PARTNER_NAME is valid");
303 public void testValidateHeaderValuePresence_usingReflection() throws Exception {
305 Method method = HeaderValidation.class.getDeclaredMethod("validateHeaderValuePresence", String.class, String.class, List.class);
306 method.setAccessible(true);
307 String value = "testValue";
308 String errorCode = "AAI_4009";
309 List<MediaType> acceptHeaderValues = List.of(MediaType.APPLICATION_JSON_TYPE);
310 Optional<Response> result = (Optional<Response>) method.invoke(headerValidation, value, errorCode, acceptHeaderValues);
311 assertNotNull(result);