9696e697ea0a49cbc6a3d562b7c836bd862904df
[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 org.junit.jupiter.api.BeforeEach;
23 import org.junit.jupiter.api.Test;
24 import org.junit.jupiter.api.extension.ExtendWith;
25 import org.mockito.InjectMocks;
26 import org.mockito.Mock;
27 import org.mockito.junit.jupiter.MockitoExtension;
28 import org.mockito.junit.jupiter.MockitoSettings;
29 import org.mockito.quality.Strictness;
30 import org.onap.aai.schemaservice.service.AuthorizationService;
31 import javax.ws.rs.container.ContainerRequestContext;
32 import javax.ws.rs.core.MediaType;
33 import javax.ws.rs.core.Response;
34 import javax.ws.rs.core.UriInfo;
35 import java.lang.reflect.Method;
36 import java.net.URI;
37 import java.util.Arrays;
38 import java.util.List;
39 import java.util.Optional;
40 import static org.mockito.Mockito.*;
41 import static org.junit.jupiter.api.Assertions.assertEquals;
42 import static org.junit.jupiter.api.Assertions.assertTrue;
43
44 @ExtendWith(MockitoExtension.class)
45 @MockitoSettings(strictness = Strictness.LENIENT)
46 public class OneWaySslAuthorizationTest {
47
48     @Mock
49     private AuthorizationService authorizationService;
50
51     @Mock
52     private ContainerRequestContext containerRequestContext;
53
54     @InjectMocks
55     private OneWaySslAuthorization oneWaySslAuthorization;
56
57     @BeforeEach
58     public void setUp() {
59         lenient().when(authorizationService.checkIfUserAuthorized(anyString())).thenReturn(true);
60     }
61
62     @Test
63     public void testFilterWithValidBasicAuth() throws Exception {
64         String basicAuth = "Basic validToken";
65         List<MediaType> acceptHeaderValues = Arrays.asList(MediaType.APPLICATION_JSON_TYPE);
66
67         when(containerRequestContext.getHeaderString("Authorization")).thenReturn(basicAuth);
68         when(containerRequestContext.getAcceptableMediaTypes()).thenReturn(acceptHeaderValues);
69
70         UriInfo uriInfoMock = mock(UriInfo.class);
71         when(containerRequestContext.getUriInfo()).thenReturn(uriInfoMock);
72         when(uriInfoMock.getRequestUri()).thenReturn(URI.create("http://localhost/some/other/path"));
73         when(uriInfoMock.getPath()).thenReturn("/some/other/path");
74
75         oneWaySslAuthorization.filter(containerRequestContext);
76
77         verify(containerRequestContext, times(0)).abortWith(any());
78     }
79
80     @Test
81     public void testFilterWithInvalidBasicAuth() throws Exception {
82         String basicAuth = "Basic invalidToken";
83         List<MediaType> acceptHeaderValues = Arrays.asList(MediaType.APPLICATION_JSON_TYPE);
84
85         UriInfo uriInfoMock = mock(UriInfo.class);
86         when(containerRequestContext.getUriInfo()).thenReturn(uriInfoMock);
87         when(uriInfoMock.getRequestUri()).thenReturn(URI.create("http://localhost/some/other/path"));
88         when(uriInfoMock.getPath()).thenReturn("/some/other/path");
89
90         when(containerRequestContext.getHeaderString("Authorization")).thenReturn(basicAuth);
91         when(containerRequestContext.getAcceptableMediaTypes()).thenReturn(acceptHeaderValues);
92
93         when(authorizationService.checkIfUserAuthorized("invalidToken")).thenReturn(false);
94
95         oneWaySslAuthorization.filter(containerRequestContext);
96
97         verify(containerRequestContext, times(1)).abortWith(any(Response.class));
98     }
99
100     @Test
101     public void testFilterWithNoAuthorizationHeader() throws Exception {
102         String basicAuth = null;
103         List<MediaType> acceptHeaderValues = Arrays.asList(MediaType.APPLICATION_JSON_TYPE);
104
105         when(containerRequestContext.getHeaderString("Authorization")).thenReturn(basicAuth);
106         when(containerRequestContext.getAcceptableMediaTypes()).thenReturn(acceptHeaderValues);
107
108         UriInfo uriInfoMock = mock(UriInfo.class);
109         when(containerRequestContext.getUriInfo()).thenReturn(uriInfoMock);
110         when(uriInfoMock.getRequestUri()).thenReturn(URI.create("http://localhost/some/other/path"));
111         when(uriInfoMock.getPath()).thenReturn("/some/other/path");
112
113         oneWaySslAuthorization.filter(containerRequestContext);
114
115         verify(containerRequestContext, times(1)).abortWith(any(Response.class));
116     }
117
118     @Test
119     public void testFilterWithInvalidAuthorizationHeaderFormat() throws Exception {
120         String basicAuth = "Bearer invalidToken"; // Header doesn't start with "Basic "
121         List<MediaType> acceptHeaderValues = Arrays.asList(MediaType.APPLICATION_JSON_TYPE);
122
123         when(containerRequestContext.getHeaderString("Authorization")).thenReturn(basicAuth);
124         when(containerRequestContext.getAcceptableMediaTypes()).thenReturn(acceptHeaderValues);
125
126         UriInfo uriInfoMock = mock(UriInfo.class);
127         when(containerRequestContext.getUriInfo()).thenReturn(uriInfoMock);
128         when(uriInfoMock.getRequestUri()).thenReturn(URI.create("http://localhost/some/other/path"));
129         when(uriInfoMock.getPath()).thenReturn("/some/other/path");
130
131         oneWaySslAuthorization.filter(containerRequestContext);
132
133         verify(containerRequestContext, times(1)).abortWith(any(Response.class));
134     }
135
136     @Test
137     public void testFilterForEchoPath() throws Exception {
138         String path = "/util/echo";
139
140         UriInfo uriInfoMock = mock(UriInfo.class);
141         when(containerRequestContext.getUriInfo()).thenReturn(uriInfoMock);
142         when(uriInfoMock.getRequestUri()).thenReturn(URI.create("http://localhost" + path));
143         when(uriInfoMock.getPath()).thenReturn(path);
144
145         oneWaySslAuthorization.filter(containerRequestContext);
146
147         verify(containerRequestContext, times(0)).abortWith(any());
148     }
149
150     @Test
151     public void testErrorResponse() throws Exception {
152         Method errorResponseMethod = OneWaySslAuthorization.class.getDeclaredMethod("errorResponse", String.class, List.class);
153         errorResponseMethod.setAccessible(true);
154
155         String errorCode = "AAI_3300";
156         List<MediaType> acceptHeaderValues = Arrays.asList(MediaType.APPLICATION_JSON_TYPE);
157
158         Object result = errorResponseMethod.invoke(oneWaySslAuthorization, errorCode, acceptHeaderValues);
159
160         assertTrue(result instanceof Optional);
161         Optional<Response> responseOptional = (Optional<Response>) result;
162         assertTrue(responseOptional.isPresent());
163         assertEquals(Response.Status.FORBIDDEN.getStatusCode(), responseOptional.get().getStatus());
164     }
165 }
166