org.onap migration
[vid.git] / vid-app-common / src / test / java / org / onap / vid / controller / PromiseEcompRequestIdFilterTest.java
1 package org.onap.vid.controller;
2
3 import com.google.common.collect.ImmutableMap;
4 import org.mockito.ArgumentCaptor;
5 import org.mockito.Mockito;
6 import org.mockito.stubbing.Answer;
7 import org.openecomp.portalsdk.core.web.support.UserUtils;
8 import org.onap.vid.controller.filter.PromiseEcompRequestIdFilter;
9 import org.springframework.mock.web.MockHttpServletResponse;
10 import org.testng.annotations.Test;
11
12 import javax.servlet.FilterChain;
13 import javax.servlet.ServletException;
14 import javax.servlet.ServletRequest;
15 import javax.servlet.ServletResponse;
16 import javax.servlet.http.HttpServletRequest;
17 import javax.servlet.http.HttpServletResponse;
18 import java.io.IOException;
19 import java.util.*;
20 import java.util.function.Function;
21
22 import static org.hamcrest.CoreMatchers.is;
23 import static org.hamcrest.MatcherAssert.assertThat;
24 import static org.hamcrest.Matchers.*;
25 import static org.mockito.Matchers.any;
26 import static org.mockito.Matchers.argThat;
27 import static org.openecomp.portalsdk.core.util.SystemProperties.ECOMP_REQUEST_ID;
28
29 @Test
30 public class PromiseEcompRequestIdFilterTest {
31
32     private final String anotherHeader = "ANDREI_RUBLEV";
33     private final String anotherValue = "foo value";
34     private final String mixedCaseHeader = "x-ecomp-REQUESTID";
35
36     @Test
37     public void givenRequestIdHeader_headerValueNotChanged() throws IOException, ServletException {
38
39         final String someTxId = "863850e2-8545-4efd-94b8-afba5f52b3d5";
40
41         final ImmutableMap<String, String> incomingRequestHeaders = ImmutableMap.of(
42                 anotherHeader, anotherValue,
43                 ECOMP_REQUEST_ID, someTxId
44         );
45
46         buildRequestThenRunThroughFilterAndAssertResultRequestHeaders(incomingRequestHeaders, specificTxId(someTxId));
47     }
48
49     @Test
50     public void givenMixedCaseRequestIdHeader_headerValueNotChanged() throws IOException, ServletException {
51
52         final String someTxId = "729bbd8d-b0c2-4809-a794-dcccd9cda2c0";
53
54         final ImmutableMap<String, String> incomingRequestHeaders = ImmutableMap.of(
55                 mixedCaseHeader, someTxId,
56                 anotherHeader, anotherValue
57         );
58
59         buildRequestThenRunThroughFilterAndAssertResultRequestHeaders(incomingRequestHeaders, specificTxId(someTxId));
60     }
61
62     @Test
63     public void givenNoRequestIdHeader_headerValueWasGenerated() throws IOException, ServletException {
64
65         final ImmutableMap<String, String> incomingRequestHeaders = ImmutableMap.of(
66                 anotherHeader, anotherValue
67         );
68
69         buildRequestThenRunThroughFilterAndAssertResultRequestHeaders(incomingRequestHeaders, UserUtils::getRequestId);
70     }
71
72     
73     private void buildRequestThenRunThroughFilterAndAssertResultRequestHeaders(
74             ImmutableMap<String, String> originalRequestHeaders,
75             Function<HttpServletRequest, String> txIdExtractor
76     ) throws IOException, ServletException {
77         HttpServletRequest servletRequest = createMockedHttpServletRequest(originalRequestHeaders);
78         HttpServletResponse servletResponse = createMockedHttpServletResponse();
79
80         final FilterChain capturingFilterChain = Mockito.mock(FilterChain.class);
81
82         //////////////////
83         //
84         // doFilter() is the function under test
85         //
86         new PromiseEcompRequestIdFilter().doFilter(servletRequest, servletResponse, capturingFilterChain);
87         //
88         //////////////////
89
90         final ServletRequest capturedServletRequest = extractCapturedServletRequest(capturingFilterChain);
91         final ServletResponse capturedServletResponse = extractCapturedServletResponse(capturingFilterChain);
92         final String expectedTxId = txIdExtractor.apply((HttpServletRequest) capturedServletRequest);
93
94         assertRequestObjectHeaders(capturedServletRequest, expectedTxId);
95         assertResponseObjectHeaders(capturedServletResponse, expectedTxId);
96     }
97
98
99     private void assertRequestObjectHeaders(ServletRequest request, String expectedTxId) {
100         /*
101         Assert that:
102         - Two headers are in place
103         - Direct value extraction is as expected
104         - UserUtils.getRequestId() returns correct and valid value
105          */
106         final HttpServletRequest httpServletRequest = (HttpServletRequest) request;
107
108         assertThat(Collections.list(httpServletRequest.getHeaderNames()),
109                 containsInAnyOrder(equalToIgnoringCase(ECOMP_REQUEST_ID), equalToIgnoringCase(anotherHeader)));
110
111         assertThat(httpServletRequest.getHeader(anotherHeader), is(anotherValue));
112
113         assertThat(httpServletRequest.getHeader(ECOMP_REQUEST_ID), is(expectedTxId));
114         assertThat(httpServletRequest.getHeader(mixedCaseHeader), is(expectedTxId));
115
116         assertThat(UserUtils.getRequestId(httpServletRequest), is(expectedTxId));
117         assertThat(UserUtils.getRequestId(httpServletRequest), is(not(emptyOrNullString())));
118     }
119
120     private void assertResponseObjectHeaders(ServletResponse response, String txId) {
121         final String REQUEST_ID_HEADER_NAME_IN_RESPONSE = mixedCaseHeader + "-echo";
122         final HttpServletResponse httpServletResponse = (HttpServletResponse) response;
123
124         assertThat("header " + REQUEST_ID_HEADER_NAME_IN_RESPONSE.toLowerCase() + " in response must be provided",
125                 httpServletResponse.getHeader(REQUEST_ID_HEADER_NAME_IN_RESPONSE), is(txId));
126     }
127
128
129
130     private HttpServletRequest createMockedHttpServletRequest(Map<String, String> requestHeaders) {
131         HttpServletRequest servletRequest = Mockito.mock(HttpServletRequest.class);
132         requestHeaders.forEach((k, v) -> {
133             Mockito.when(servletRequest.getHeader(argThat(equalToIgnoringCase(k)))).thenReturn(v);
134             Mockito.when(servletRequest.getHeaders(argThat(equalToIgnoringCase(k)))).then(returnEnumerationAnswer(v));
135         });
136         Mockito.when(servletRequest.getHeaderNames()).then(returnEnumerationAnswer(requestHeaders.keySet()));
137         return servletRequest;
138     }
139
140     private HttpServletResponse createMockedHttpServletResponse() {
141         return new MockHttpServletResponse();
142     }
143
144     private static Answer<Enumeration<String>> returnEnumerationAnswer(String ... items) {
145         return returnEnumerationAnswer(Arrays.asList(items));
146     }
147
148     private static Answer<Enumeration<String>> returnEnumerationAnswer(Collection<String> items) {
149         return invocation -> Collections.enumeration(items);
150     }
151
152     private Function<HttpServletRequest, String> specificTxId(String someTxId) {
153         return r -> someTxId;
154     }
155
156     private ServletRequest extractCapturedServletRequest(FilterChain capturingFilterChain) throws IOException, ServletException {
157         ArgumentCaptor<ServletRequest> captor = ArgumentCaptor.forClass(ServletRequest.class);
158         Mockito.verify(capturingFilterChain).doFilter(captor.capture(), any());
159         return captor.getValue();
160     }
161
162     private ServletResponse extractCapturedServletResponse(FilterChain capturingFilterChain) throws IOException, ServletException {
163         ArgumentCaptor<ServletResponse> captor = ArgumentCaptor.forClass(ServletResponse.class);
164         Mockito.verify(capturingFilterChain).doFilter(any(), captor.capture());
165         return captor.getValue();
166     }
167
168 }