/*
* SoapUI, Copyright (C) 2004-2016 SmartBear Software
*
* Licensed under the EUPL, Version 1.1 or - as soon as they will be approved by the European Commission - subsequent
* versions of the EUPL (the "Licence");
* You may not use this work except in compliance with the Licence.
* You may obtain a copy of the Licence at:
*
* http://ec.europa.eu/idabc/eupl
*
* Unless required by applicable law or agreed to in writing, software distributed under the Licence is
* distributed on an "AS IS" basis, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
* express or implied. See the Licence for the specific language governing permissions and limitations
* under the Licence.
*/
package com.eviware.soapui.impl.wsdl.submit.filters;
import com.eviware.soapui.SoapUI;
import com.eviware.soapui.impl.support.AbstractHttpRequest;
import com.eviware.soapui.impl.support.http.HttpRequest;
import com.eviware.soapui.impl.wsdl.support.AbstractTestCaseRunner;
import com.eviware.soapui.impl.wsdl.testcase.WsdlTestRunContext;
import com.eviware.soapui.model.iface.SubmitContext;
import com.eviware.soapui.support.types.StringToStringsMap;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Ignore;
import org.junit.Test;
import org.mockito.ArgumentCaptor;
import org.mockito.Mockito;
import org.mockito.internal.verification.Times;
/**
* Created by ole on 27/05/14.
*/
public class GlobalHttpHeadersRequestFilterTest {
GlobalHttpHeadersRequestFilter globalHttpHeadersRequestFilter;
@Before
public void setUp() {
globalHttpHeadersRequestFilter = new GlobalHttpHeadersRequestFilter();
SoapUI.initDefaultCore();
}
@Test
public void addsNothingByDefault() {
StringToStringsMap requestHeaders = new StringToStringsMap();
SubmitContext context = mockContext();
AbstractHttpRequest<?> request = mockRequest(requestHeaders);
globalHttpHeadersRequestFilter.filterAbstractHttpRequest(context, request);
Mockito.verifyZeroInteractions(request);
}
@Test
public void addsSpecifiedHeadersWithAndWithoutCaching() {
System.setProperty(GlobalHttpHeadersRequestFilter.HEADER_SYSTEM_PROPERTY_PREFIX + "User-Agent", "Testing");
StringToStringsMap value = invokeFilterWithHeaders(new StringToStringsMap());
Assert.assertEquals("Testing", value.get("User-Agent").get(0));
System.setProperty(GlobalHttpHeadersRequestFilter.HEADER_SYSTEM_PROPERTY_PREFIX + "User.Agent", "Testing");
value = invokeFilterWithHeaders(new StringToStringsMap());
// should be the same as the first since headers are cached
Assert.assertEquals("Testing", value.get("User-Agent").get(0));
// disable caching and run again
System.setProperty(GlobalHttpHeadersRequestFilter.CACHE_HEADERS_SYSTEM_PROPERTY, "false");
System.setProperty(GlobalHttpHeadersRequestFilter.HEADER_SYSTEM_PROPERTY_PREFIX + "User.Agent", "Testing");
value = invokeFilterWithHeaders(new StringToStringsMap());
Assert.assertEquals("Testing", value.get("User.Agent").get(0));
Assert.assertEquals("Testing", value.get("User-Agent").get(0));
System.clearProperty(GlobalHttpHeadersRequestFilter.HEADER_SYSTEM_PROPERTY_PREFIX + "User-Agent");
System.clearProperty(GlobalHttpHeadersRequestFilter.HEADER_SYSTEM_PROPERTY_PREFIX + "User.Agent");
}
@Test
public void addMultipleHeadersWithSameName() {
GlobalHttpHeadersRequestFilter.addGlobalHeader("User-Agent", "Testing");
GlobalHttpHeadersRequestFilter.addGlobalHeader("User-Agent", "Testing2");
StringToStringsMap value = invokeFilterWithHeaders(new StringToStringsMap());
Assert.assertEquals("Testing", value.get("User-Agent").get(0));
Assert.assertEquals("Testing2", value.get("User-Agent").get(1));
GlobalHttpHeadersRequestFilter.removeGlobalHeader( "User-Agent", null );
}
@Test
public void replaceOrAddSpecifiedHeaders() {
System.setProperty(GlobalHttpHeadersRequestFilter.REPLACE_HEADERS_SYSTEM_PROPERTY, "true");
System.setProperty(GlobalHttpHeadersRequestFilter.HEADER_SYSTEM_PROPERTY_PREFIX + "User-Agent", "Testing Replace");
StringToStringsMap requestHeaders = new StringToStringsMap();
requestHeaders.put("User-Agent", "Testing");
StringToStringsMap value = invokeFilterWithHeaders(requestHeaders);
Assert.assertEquals("Testing Replace", value.get("User-Agent").get(0));
Assert.assertEquals(1, value.size());
System.setProperty(GlobalHttpHeadersRequestFilter.REPLACE_HEADERS_SYSTEM_PROPERTY, "false");
requestHeaders = new StringToStringsMap();
requestHeaders.put("User-Agent", "Testing");
value = invokeFilterWithHeaders(requestHeaders);
Assert.assertEquals("Testing", value.get("User-Agent").get(0));
Assert.assertEquals("Testing Replace", value.get("User-Agent").get(1));
Assert.assertEquals(2, value.get("User-Agent").size());
System.clearProperty(GlobalHttpHeadersRequestFilter.HEADER_SYSTEM_PROPERTY_PREFIX + "User-Agent");
}
@Test
@Ignore
public void addHeaderWithPropertyExpansion() {
System.setProperty(GlobalHttpHeadersRequestFilter.HEADER_SYSTEM_PROPERTY_PREFIX + "User-Agent", "Testing Replace.${currentStepIndex}.${currentStepRunIndex}");
AbstractTestCaseRunner runner = Mockito.mock(AbstractTestCaseRunner.class);
Mockito.when(runner.getResultCount()).thenReturn(4);
WsdlTestRunContext context = mockContext();
Mockito.when(context.getTestRunner()).thenReturn(runner);
Mockito.when(context.getCurrentStepIndex()).thenReturn(3);
AbstractHttpRequest<?> request = mockRequest(new StringToStringsMap());
globalHttpHeadersRequestFilter.filterAbstractHttpRequest(context, request);
ArgumentCaptor<StringToStringsMap> headers = ArgumentCaptor.forClass(StringToStringsMap.class);
Mockito.verify(request).setRequestHeaders(headers.capture());
Assert.assertEquals("Testing Replace.3.4", headers.getAllValues().get(0).get("User-Agent").get(0));
System.clearProperty(GlobalHttpHeadersRequestFilter.HEADER_SYSTEM_PROPERTY_PREFIX + "User-Agent");
}
@Test
public void addAndRemoveHeader() {
System.setProperty(GlobalHttpHeadersRequestFilter.HEADER_SYSTEM_PROPERTY_PREFIX + "User-Agent", "Testing");
WsdlTestRunContext context = mockContext();
AbstractHttpRequest<?> request = mockRequest(new StringToStringsMap());
globalHttpHeadersRequestFilter.filterAbstractHttpRequest(context, request);
globalHttpHeadersRequestFilter.afterAbstractHttpResponse(context, request);
ArgumentCaptor<StringToStringsMap> headers = ArgumentCaptor.forClass(StringToStringsMap.class);
Mockito.verify(request, new Times(2)).setRequestHeaders(headers.capture());
// first headers should contain the added header
Assert.assertEquals("Testing", headers.getAllValues().get(0).get("User-Agent").get(0));
// and the second should contain nothing
Assert.assertEquals(0, headers.getAllValues().get(1).size());
System.clearProperty(GlobalHttpHeadersRequestFilter.HEADER_SYSTEM_PROPERTY_PREFIX + "User-Agent");
}
@Test
public void complementAndRemoveHeader() {
System.setProperty(GlobalHttpHeadersRequestFilter.HEADER_SYSTEM_PROPERTY_PREFIX + "User-Agent", "Testing");
WsdlTestRunContext context = mockContext();
StringToStringsMap requestHeaders = new StringToStringsMap();
requestHeaders.add("User-Agent", "Existing header");
AbstractHttpRequest<?> request = mockRequest(requestHeaders);
globalHttpHeadersRequestFilter.filterAbstractHttpRequest(context, request);
globalHttpHeadersRequestFilter.afterAbstractHttpResponse(context, request);
ArgumentCaptor<StringToStringsMap> headers = ArgumentCaptor.forClass(StringToStringsMap.class);
Mockito.verify(request, new Times(2)).setRequestHeaders(headers.capture());
// check that the headers has been added
Assert.assertEquals("Existing header", headers.getAllValues().get(0).get("User-Agent").get(0));
Assert.assertEquals("Testing", headers.getAllValues().get(0).get("User-Agent").get(1));
// and removed
Assert.assertEquals(1, headers.getAllValues().get(1).size());
Assert.assertEquals("Existing header", headers.getAllValues().get(1).get("User-Agent").get(0));
System.clearProperty(GlobalHttpHeadersRequestFilter.HEADER_SYSTEM_PROPERTY_PREFIX + "User-Agent");
}
@Test
public void replaceAndRemoveHeader() {
System.setProperty(GlobalHttpHeadersRequestFilter.HEADER_SYSTEM_PROPERTY_PREFIX + "User-Agent", "Testing");
System.setProperty(GlobalHttpHeadersRequestFilter.REPLACE_HEADERS_SYSTEM_PROPERTY, "true");
WsdlTestRunContext context = mockContext();
StringToStringsMap requestHeaders = new StringToStringsMap();
requestHeaders.add("User-Agent", "Existing header");
AbstractHttpRequest<?> request = mockRequest(requestHeaders);
globalHttpHeadersRequestFilter.filterAbstractHttpRequest(context, request);
globalHttpHeadersRequestFilter.afterAbstractHttpResponse(context, request);
ArgumentCaptor<StringToStringsMap> headers = ArgumentCaptor.forClass(StringToStringsMap.class);
Mockito.verify(request, new Times(2)).setRequestHeaders(headers.capture());
// check that the header has been added
Assert.assertEquals("Testing", headers.getAllValues().get(0).get("User-Agent").get(0));
Assert.assertEquals(1, headers.getAllValues().get(0).size());
// and removed
Assert.assertEquals(1, headers.getAllValues().get(1).size());
Assert.assertEquals("Existing header", headers.getAllValues().get(1).get("User-Agent").get(0));
System.clearProperty(GlobalHttpHeadersRequestFilter.HEADER_SYSTEM_PROPERTY_PREFIX + "User-Agent");
}
private StringToStringsMap invokeFilterWithHeaders(StringToStringsMap requestHeaders) {
SubmitContext context = mockContext();
AbstractHttpRequest<?> request = mockRequest(requestHeaders);
globalHttpHeadersRequestFilter.filterAbstractHttpRequest(context, request);
ArgumentCaptor<StringToStringsMap> headers = ArgumentCaptor.forClass(StringToStringsMap.class);
Mockito.verify(request).setRequestHeaders(headers.capture());
return headers.getValue();
}
private WsdlTestRunContext mockContext() {
return Mockito.mock(WsdlTestRunContext.class);
}
private AbstractHttpRequest<?> mockRequest(StringToStringsMap requestHeaders) {
AbstractHttpRequest<?> request = Mockito.mock(HttpRequest.class);
Mockito.when(request.getRequestHeaders()).thenReturn(requestHeaders);
return request;
}
}