684fdc132a882fd7144a1c42b0889446629b52c8
[aai/schema-service.git] /
1 /**
2  * ============LICENSE_START=======================================================
3  * org.onap.aai
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
10  *
11  *    http://www.apache.org/licenses/LICENSE-2.0
12  *
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=========================================================
19  */
20 package org.onap.aai.schemaservice.interceptors.pre;
21
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;
45
46 @ExtendWith(MockitoExtension.class)
47 @MockitoSettings(strictness = Strictness.LENIENT)
48 public class HeaderValidationTest {
49
50     @InjectMocks
51     private HeaderValidation headerValidation;
52
53     @Mock
54     private ContainerRequestContext requestContext;
55
56     private MultivaluedMap<String, String> headers;
57
58     @BeforeEach
59     public void setUp() {
60         headers = new MultivaluedHashMap<>();
61         when(requestContext.getHeaders()).thenReturn(headers);
62     }
63
64     @Test
65     public void testGetPartnerName_withEmptyPartnerName() {
66         when(requestContext.getHeaderString("X-ONAP-PartnerName")).thenReturn("");
67         when(requestContext.getHeaderString("X-FromAppId")).thenReturn("testAppId");
68
69         String partnerName = headerValidation.getPartnerName(requestContext);
70
71         assertEquals("testAppId", partnerName);
72     }
73
74     @Test
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");
79
80         String partnerName = headerValidation.getPartnerName(requestContext);
81
82         assertEquals("testAppId", partnerName);
83     }
84
85     @Test
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);
89
90         String partnerName = headerValidation.getPartnerName(requestContext);
91
92         assertNull(partnerName);
93     }
94
95     @Test
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");
99
100         String requestId = headerValidation.getRequestId(requestContext);
101
102         assertEquals("testRequestId", requestId);
103     }
104
105     @Test
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");
111
112         headerValidation.filter(requestContext);
113
114         // Verify that the method calls abortWith due to the missing partner name
115         verify(requestContext).abortWith(argThat(response -> response.getStatus() == 400));
116     }
117
118     @Test
119     void testGetRequestId_ClearsExistingHeaders() {
120         // Arrange
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<>());
126
127         when(requestContext.getHeaderString(ONAPLogConstants.Headers.REQUEST_ID))
128             .thenReturn(expectedRequestId);
129
130         String actualRequestId = headerValidation.getRequestId(requestContext);
131
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());
138     }
139
140     @Test
141     void testGetRequestId_WhenEcompRequestIdExists() {
142         String expectedRequestId = "ecomp-123";
143         when(requestContext.getHeaderString(ONAPLogConstants.Headers.REQUEST_ID))
144             .thenReturn(null);
145         when(requestContext.getHeaderString(Constants.HttpHeaders.HEADER_REQUEST_ID))
146             .thenReturn(null);
147         when(requestContext.getHeaderString(Constants.HttpHeaders.TRANSACTION_ID))
148             .thenReturn(null);
149         when(requestContext.getHeaderString(Constants.HttpHeaders.ECOMP_REQUEST_ID))
150             .thenReturn(expectedRequestId);
151
152         String result = headerValidation.getRequestId(requestContext);
153
154         assertEquals(expectedRequestId, result);
155     }
156
157     @Test
158     void whenPartnerNameHasValidComponents_shouldReturnFirstComponent() {
159         when(requestContext.getHeaderString(ONAPLogConstants.Headers.PARTNER_NAME)).thenReturn("TEST.COMPONENT");
160
161         String result = headerValidation.getPartnerName(requestContext);
162
163         assertEquals("TEST.COMPONENT", result);
164     }
165
166     @Test
167     void whenPartnerNameStartsWithAAI_shouldUseFromAppId() {
168         when(requestContext.getHeaderString(ONAPLogConstants.Headers.PARTNER_NAME)).thenReturn("AAI.COMPONENT");
169
170         String result = headerValidation.getPartnerName(requestContext);
171
172         assertEquals("AAI.COMPONENT", result);
173     }
174
175     @Test
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);
181
182         when(requestContext.getHeaderString(ONAPLogConstants.Headers.PARTNER_NAME)).thenReturn("NEW-SOT");
183
184         String result = headerValidation.getPartnerName(requestContext);
185
186         assertEquals("NEW-SOT", result);
187         assertEquals("NEW-SOT", headers.getFirst(AAIHeaderProperties.FROM_APP_ID));
188     }
189
190
191     @Test
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");
195
196         String result = headerValidation.getRequestId(requestContext);
197
198         assertEquals("validHeaderRequestId",result);
199     }
200
201     @Test
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");
206
207         String result = headerValidation.getRequestId(requestContext);
208
209         assertEquals("validTransactionId",result);
210     }
211
212     @Test
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");
217
218         String result = headerValidation.getRequestId(requestContext);
219
220         assertEquals("validTransactionId",result);
221     }
222
223     @Test
224     public void testGetRequestId_withValidEcompRequestId() {
225
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");
230
231         String result = headerValidation.getRequestId(requestContext);
232
233         assertEquals("validEcompRequestId",result);
234     }
235
236     @Test
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");
242
243         String result = headerValidation.getRequestId(requestContext);
244
245         assertEquals("validEcompRequestId",result);
246     }
247
248     @Test
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");
252
253         String result = headerValidation.getRequestId(requestContext);
254         assertEquals("validRequestId", result, "Expected validRequestId to be returned as it's the first non-null value");
255
256     }
257     @Test
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);
261
262         String partnerName = headerValidation.getPartnerName(requestContext);
263         assertNull(partnerName, "Expected null partner name when both PARTNER_NAME and FROM_APP_ID are null");
264     }
265
266     @Test
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);
271
272         assertEquals("partnerName", partnerName, "Expected partner name to be used directly when PARTNER_NAME is not empty");
273     }
274
275     @Test
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");
279
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");
282     }
283
284     @Test
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);
289
290         assertEquals("validPartnerName", partnerName, "Expected valid PARTNER_NAME to be used even when FROM_APP_ID is empty");
291     }
292
293     @Test
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");
297
298         String partnerName = headerValidation.getPartnerName(requestContext);
299
300         assertEquals("TEST.COMPONENT", partnerName, "Expected partner name to return 'TEST.COMPONENT' when PARTNER_NAME is valid");
301     }
302     @Test
303     public void testValidateHeaderValuePresence_usingReflection() throws Exception {
304
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);
312     }
313
314
315 }