blob: 96b73febdd75a9572cfd72ea18c516d11126fff7 [file] [log] [blame]
/*******************************************************************************
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
******************************************************************************/
package org.apache.olingo.odata2.core;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.fail;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.anyBoolean;
import static org.mockito.Matchers.anyString;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import java.io.InputStream;
import java.util.Arrays;
import org.apache.olingo.odata2.api.ODataService;
import org.apache.olingo.odata2.api.ODataServiceFactory;
import org.apache.olingo.odata2.api.batch.BatchHandler;
import org.apache.olingo.odata2.api.commons.HttpStatusCodes;
import org.apache.olingo.odata2.api.commons.ODataHttpMethod;
import org.apache.olingo.odata2.api.edm.EdmException;
import org.apache.olingo.odata2.api.exception.ODataBadRequestException;
import org.apache.olingo.odata2.api.exception.ODataException;
import org.apache.olingo.odata2.api.exception.ODataMethodNotAllowedException;
import org.apache.olingo.odata2.api.processor.ODataProcessor;
import org.apache.olingo.odata2.api.processor.ODataResponse;
import org.apache.olingo.odata2.api.processor.part.BatchProcessor;
import org.apache.olingo.odata2.api.processor.part.EntityComplexPropertyProcessor;
import org.apache.olingo.odata2.api.processor.part.EntityLinkProcessor;
import org.apache.olingo.odata2.api.processor.part.EntityLinksProcessor;
import org.apache.olingo.odata2.api.processor.part.EntityMediaProcessor;
import org.apache.olingo.odata2.api.processor.part.EntityProcessor;
import org.apache.olingo.odata2.api.processor.part.EntitySetProcessor;
import org.apache.olingo.odata2.api.processor.part.EntitySimplePropertyProcessor;
import org.apache.olingo.odata2.api.processor.part.EntitySimplePropertyValueProcessor;
import org.apache.olingo.odata2.api.processor.part.FunctionImportProcessor;
import org.apache.olingo.odata2.api.processor.part.FunctionImportValueProcessor;
import org.apache.olingo.odata2.api.processor.part.MetadataProcessor;
import org.apache.olingo.odata2.api.processor.part.ServiceDocumentProcessor;
import org.apache.olingo.odata2.core.uri.UriInfoImpl;
import org.apache.olingo.odata2.core.uri.UriType;
import org.apache.olingo.odata2.testutil.fit.BaseTest;
import org.junit.Test;
import org.mockito.Matchers;
import org.mockito.Mockito;
import org.mockito.invocation.InvocationOnMock;
import org.mockito.stubbing.Answer;
/**
* Tests for request dispatching according to URI type and HTTP method.
*
*/
public class DispatcherTest extends BaseTest {
public static ODataService getMockService() throws ODataException {
ServiceDocumentProcessor serviceDocument = mock(ServiceDocumentProcessor.class);
when(serviceDocument.readServiceDocument(any(UriInfoImpl.class), anyString())).thenAnswer(getAnswer());
EntitySetProcessor entitySet = mock(EntitySetProcessor.class);
when(entitySet.readEntitySet(any(UriInfoImpl.class), anyString())).thenAnswer(getAnswer());
when(entitySet.countEntitySet(any(UriInfoImpl.class), anyString())).thenAnswer(getAnswer());
when(entitySet.createEntity(any(UriInfoImpl.class), any(InputStream.class), anyString(), anyString())).thenAnswer(
getAnswer());
EntityProcessor entity = mock(EntityProcessor.class);
when(entity.readEntity(any(UriInfoImpl.class), anyString())).thenAnswer(getAnswer());
when(entity.existsEntity(any(UriInfoImpl.class), anyString())).thenAnswer(getAnswer());
when(entity.deleteEntity(any(UriInfoImpl.class), anyString())).thenAnswer(getAnswer());
when(entity.updateEntity(any(UriInfoImpl.class), any(InputStream.class), anyString(), anyBoolean(), anyString()))
.thenAnswer(getAnswer());
EntityComplexPropertyProcessor entityComplexProperty = mock(EntityComplexPropertyProcessor.class);
when(entityComplexProperty.readEntityComplexProperty(any(UriInfoImpl.class), anyString())).thenAnswer(getAnswer());
when(
entityComplexProperty.updateEntityComplexProperty(any(UriInfoImpl.class), any(InputStream.class), anyString(),
anyBoolean(), anyString())).thenAnswer(getAnswer());
EntitySimplePropertyProcessor entitySimpleProperty = mock(EntitySimplePropertyProcessor.class);
when(entitySimpleProperty.readEntitySimpleProperty(any(UriInfoImpl.class), anyString())).thenAnswer(getAnswer());
when(
entitySimpleProperty.updateEntitySimpleProperty(any(UriInfoImpl.class), any(InputStream.class), anyString(),
anyString())).thenAnswer(getAnswer());
EntitySimplePropertyValueProcessor entitySimplePropertyValue = mock(EntitySimplePropertyValueProcessor.class);
when(entitySimplePropertyValue.readEntitySimplePropertyValue(any(UriInfoImpl.class), anyString())).thenAnswer(
getAnswer());
when(entitySimplePropertyValue.deleteEntitySimplePropertyValue(any(UriInfoImpl.class), anyString())).thenAnswer(
getAnswer());
when(
entitySimplePropertyValue.updateEntitySimplePropertyValue(any(UriInfoImpl.class), any(InputStream.class),
anyString(), anyString())).thenAnswer(getAnswer());
EntityLinkProcessor entityLink = mock(EntityLinkProcessor.class);
when(entityLink.readEntityLink(any(UriInfoImpl.class), anyString())).thenAnswer(getAnswer());
when(entityLink.existsEntityLink(any(UriInfoImpl.class), anyString())).thenAnswer(getAnswer());
when(entityLink.deleteEntityLink(any(UriInfoImpl.class), anyString())).thenAnswer(getAnswer());
when(entityLink.updateEntityLink(any(UriInfoImpl.class), any(InputStream.class), anyString(), anyString()))
.thenAnswer(getAnswer());
EntityLinksProcessor entityLinks = mock(EntityLinksProcessor.class);
when(entityLinks.readEntityLinks(any(UriInfoImpl.class), anyString())).thenAnswer(getAnswer());
when(entityLinks.countEntityLinks(any(UriInfoImpl.class), anyString())).thenAnswer(getAnswer());
when(entityLinks.createEntityLink(any(UriInfoImpl.class), any(InputStream.class), anyString(), anyString()))
.thenAnswer(getAnswer());
MetadataProcessor metadata = mock(MetadataProcessor.class);
when(metadata.readMetadata(any(UriInfoImpl.class), anyString())).thenAnswer(getAnswer());
BatchProcessor batch = mock(BatchProcessor.class);
when(batch.executeBatch(any(BatchHandler.class), anyString(), any(InputStream.class))).thenAnswer(getAnswer());
FunctionImportProcessor functionImport = mock(FunctionImportProcessor.class);
when(functionImport.executeFunctionImport(any(UriInfoImpl.class), anyString())).thenAnswer(getAnswer());
FunctionImportValueProcessor functionImportValue = mock(FunctionImportValueProcessor.class);
when(functionImportValue.executeFunctionImportValue(any(UriInfoImpl.class), anyString())).thenAnswer(getAnswer());
EntityMediaProcessor entityMedia = mock(EntityMediaProcessor.class);
when(entityMedia.readEntityMedia(any(UriInfoImpl.class), anyString())).thenAnswer(getAnswer());
when(entityMedia.deleteEntityMedia(any(UriInfoImpl.class), anyString())).thenAnswer(getAnswer());
when(entityMedia.updateEntityMedia(any(UriInfoImpl.class), any(InputStream.class), anyString(), anyString()))
.thenAnswer(getAnswer());
ODataService service = mock(ODataService.class);
when(service.getServiceDocumentProcessor()).thenReturn(serviceDocument);
when(service.getEntitySetProcessor()).thenReturn(entitySet);
when(service.getEntityProcessor()).thenReturn(entity);
when(service.getEntityComplexPropertyProcessor()).thenReturn(entityComplexProperty);
when(service.getEntitySimplePropertyProcessor()).thenReturn(entitySimpleProperty);
when(service.getEntitySimplePropertyValueProcessor()).thenReturn(entitySimplePropertyValue);
when(service.getEntityLinkProcessor()).thenReturn(entityLink);
when(service.getEntityLinksProcessor()).thenReturn(entityLinks);
when(service.getMetadataProcessor()).thenReturn(metadata);
when(service.getBatchProcessor()).thenReturn(batch);
when(service.getFunctionImportProcessor()).thenReturn(functionImport);
when(service.getFunctionImportValueProcessor()).thenReturn(functionImportValue);
when(service.getEntityMediaProcessor()).thenReturn(entityMedia);
return service;
}
private static Answer<ODataResponse> getAnswer() {
return new Answer<ODataResponse>() {
@Override
public ODataResponse answer(final InvocationOnMock invocation) {
return mockResponse(invocation.getMethod().getName());
}
};
}
private static ODataResponse mockResponse(final String value) {
ODataResponse response = mock(ODataResponse.class);
when(response.getStatus()).thenReturn(HttpStatusCodes.PAYMENT_REQUIRED);
when(response.getEntity()).thenReturn(value);
return response;
}
private static UriInfoImpl mockUriInfo(final UriType uriType, final boolean isValue) throws EdmException {
UriInfoImpl uriInfo = mock(UriInfoImpl.class);
when(uriInfo.getUriType()).thenReturn(uriType);
when(uriInfo.isValue()).thenReturn(isValue);
return uriInfo;
}
private static void checkDispatch(final ODataHttpMethod method, final UriType uriType, final boolean isValue,
final String expectedMethodName) throws ODataException {
ODataServiceFactory factory = mock(ODataServiceFactory.class);
final ODataResponse response = new Dispatcher(factory, getMockService())
.dispatch(method, mockUriInfo(uriType, isValue), null, "application/xml", "*/*");
assertEquals(expectedMethodName, response.getEntity());
}
private static void
checkDispatch(final ODataHttpMethod method, final UriType uriType, final String expectedMethodName)
throws ODataException {
checkDispatch(method, uriType, false, expectedMethodName);
}
private static void wrongDispatch(final ODataHttpMethod method, final UriType uriType) {
try {
checkDispatch(method, uriType, null);
fail("Expected ODataException not thrown");
} catch (ODataMethodNotAllowedException e) {
assertNotNull(e);
} catch (ODataException e) {
fail("Expected ODataMethodNotAllowedException not thrown");
}
}
private static void notSupportedDispatch(final ODataHttpMethod method, final UriType uriType) {
try {
checkDispatch(method, uriType, null);
fail("Expected ODataException not thrown");
} catch (ODataBadRequestException e) {
assertNotNull(e);
} catch (ODataException e) {
fail("Expected ODataBadRequestException not thrown");
}
}
@Test
public void dispatch() throws Exception {
checkDispatch(ODataHttpMethod.GET, UriType.URI0, "readServiceDocument");
checkDispatch(ODataHttpMethod.GET, UriType.URI1, "readEntitySet");
checkDispatch(ODataHttpMethod.POST, UriType.URI1, "createEntity");
checkDispatch(ODataHttpMethod.GET, UriType.URI2, "readEntity");
checkDispatch(ODataHttpMethod.PUT, UriType.URI2, "updateEntity");
checkDispatch(ODataHttpMethod.DELETE, UriType.URI2, "deleteEntity");
checkDispatch(ODataHttpMethod.PATCH, UriType.URI2, "updateEntity");
checkDispatch(ODataHttpMethod.MERGE, UriType.URI2, "updateEntity");
checkDispatch(ODataHttpMethod.GET, UriType.URI3, "readEntityComplexProperty");
checkDispatch(ODataHttpMethod.PUT, UriType.URI3, "updateEntityComplexProperty");
checkDispatch(ODataHttpMethod.PATCH, UriType.URI3, "updateEntityComplexProperty");
checkDispatch(ODataHttpMethod.MERGE, UriType.URI3, "updateEntityComplexProperty");
checkDispatch(ODataHttpMethod.GET, UriType.URI4, "readEntitySimpleProperty");
checkDispatch(ODataHttpMethod.PUT, UriType.URI4, "updateEntitySimpleProperty");
checkDispatch(ODataHttpMethod.PATCH, UriType.URI4, "updateEntitySimpleProperty");
checkDispatch(ODataHttpMethod.MERGE, UriType.URI4, "updateEntitySimpleProperty");
checkDispatch(ODataHttpMethod.GET, UriType.URI4, true, "readEntitySimplePropertyValue");
checkDispatch(ODataHttpMethod.PUT, UriType.URI4, true, "updateEntitySimplePropertyValue");
checkDispatch(ODataHttpMethod.DELETE, UriType.URI4, true, "deleteEntitySimplePropertyValue");
checkDispatch(ODataHttpMethod.PATCH, UriType.URI4, true, "updateEntitySimplePropertyValue");
checkDispatch(ODataHttpMethod.MERGE, UriType.URI4, true, "updateEntitySimplePropertyValue");
checkDispatch(ODataHttpMethod.GET, UriType.URI5, "readEntitySimpleProperty");
checkDispatch(ODataHttpMethod.PUT, UriType.URI5, "updateEntitySimpleProperty");
checkDispatch(ODataHttpMethod.PATCH, UriType.URI5, "updateEntitySimpleProperty");
checkDispatch(ODataHttpMethod.MERGE, UriType.URI5, "updateEntitySimpleProperty");
checkDispatch(ODataHttpMethod.GET, UriType.URI5, true, "readEntitySimplePropertyValue");
checkDispatch(ODataHttpMethod.PUT, UriType.URI5, true, "updateEntitySimplePropertyValue");
checkDispatch(ODataHttpMethod.DELETE, UriType.URI5, true, "deleteEntitySimplePropertyValue");
checkDispatch(ODataHttpMethod.PATCH, UriType.URI5, true, "updateEntitySimplePropertyValue");
checkDispatch(ODataHttpMethod.MERGE, UriType.URI5, true, "updateEntitySimplePropertyValue");
checkDispatch(ODataHttpMethod.GET, UriType.URI6A, "readEntity");
checkDispatch(ODataHttpMethod.GET, UriType.URI6B, "readEntitySet");
checkDispatch(ODataHttpMethod.POST, UriType.URI6B, "createEntity");
checkDispatch(ODataHttpMethod.GET, UriType.URI7A, "readEntityLink");
checkDispatch(ODataHttpMethod.PUT, UriType.URI7A, "updateEntityLink");
checkDispatch(ODataHttpMethod.DELETE, UriType.URI7A, "deleteEntityLink");
checkDispatch(ODataHttpMethod.PATCH, UriType.URI7A, "updateEntityLink");
checkDispatch(ODataHttpMethod.MERGE, UriType.URI7A, "updateEntityLink");
checkDispatch(ODataHttpMethod.GET, UriType.URI7B, "readEntityLinks");
checkDispatch(ODataHttpMethod.POST, UriType.URI7B, "createEntityLink");
checkDispatch(ODataHttpMethod.GET, UriType.URI8, "readMetadata");
checkDispatch(ODataHttpMethod.POST, UriType.URI9, "executeBatch");
checkDispatch(ODataHttpMethod.GET, UriType.URI10, "executeFunctionImport");
checkDispatch(ODataHttpMethod.GET, UriType.URI10a, "executeFunctionImport");
checkDispatch(ODataHttpMethod.GET, UriType.URI11, "executeFunctionImport");
checkDispatch(ODataHttpMethod.GET, UriType.URI12, "executeFunctionImport");
checkDispatch(ODataHttpMethod.GET, UriType.URI13, "executeFunctionImport");
checkDispatch(ODataHttpMethod.GET, UriType.URI14, "executeFunctionImport");
checkDispatch(ODataHttpMethod.GET, UriType.URI14, true, "executeFunctionImportValue");
checkDispatch(ODataHttpMethod.GET, UriType.URI15, "countEntitySet");
checkDispatch(ODataHttpMethod.GET, UriType.URI16, "existsEntity");
checkDispatch(ODataHttpMethod.GET, UriType.URI17, "readEntityMedia");
checkDispatch(ODataHttpMethod.PUT, UriType.URI17, "updateEntityMedia");
checkDispatch(ODataHttpMethod.DELETE, UriType.URI17, "deleteEntityMedia");
checkDispatch(ODataHttpMethod.GET, UriType.URI50A, "existsEntityLink");
checkDispatch(ODataHttpMethod.GET, UriType.URI50B, "countEntityLinks");
}
@Test
public void dispatchNotAllowedCombinations() throws Exception {
wrongDispatch(null, UriType.URI0);
wrongDispatch(ODataHttpMethod.PUT, UriType.URI0);
wrongDispatch(ODataHttpMethod.POST, UriType.URI0);
wrongDispatch(ODataHttpMethod.DELETE, UriType.URI0);
wrongDispatch(ODataHttpMethod.PATCH, UriType.URI0);
wrongDispatch(ODataHttpMethod.MERGE, UriType.URI0);
wrongDispatch(ODataHttpMethod.PUT, UriType.URI1);
wrongDispatch(ODataHttpMethod.DELETE, UriType.URI1);
wrongDispatch(ODataHttpMethod.PATCH, UriType.URI1);
wrongDispatch(ODataHttpMethod.MERGE, UriType.URI1);
wrongDispatch(ODataHttpMethod.POST, UriType.URI2);
wrongDispatch(ODataHttpMethod.POST, UriType.URI3);
wrongDispatch(ODataHttpMethod.DELETE, UriType.URI3);
wrongDispatch(ODataHttpMethod.POST, UriType.URI4);
wrongDispatch(ODataHttpMethod.DELETE, UriType.URI4);
wrongDispatch(ODataHttpMethod.POST, UriType.URI5);
wrongDispatch(ODataHttpMethod.DELETE, UriType.URI5);
wrongDispatch(ODataHttpMethod.POST, UriType.URI6A);
wrongDispatch(ODataHttpMethod.PUT, UriType.URI6B);
wrongDispatch(ODataHttpMethod.DELETE, UriType.URI6B);
wrongDispatch(ODataHttpMethod.PATCH, UriType.URI6B);
wrongDispatch(ODataHttpMethod.MERGE, UriType.URI6B);
wrongDispatch(ODataHttpMethod.POST, UriType.URI7A);
wrongDispatch(ODataHttpMethod.PUT, UriType.URI7B);
wrongDispatch(ODataHttpMethod.DELETE, UriType.URI7B);
wrongDispatch(ODataHttpMethod.PATCH, UriType.URI7B);
wrongDispatch(ODataHttpMethod.MERGE, UriType.URI7B);
wrongDispatch(ODataHttpMethod.PUT, UriType.URI8);
wrongDispatch(ODataHttpMethod.POST, UriType.URI8);
wrongDispatch(ODataHttpMethod.DELETE, UriType.URI8);
wrongDispatch(ODataHttpMethod.PATCH, UriType.URI8);
wrongDispatch(ODataHttpMethod.MERGE, UriType.URI8);
wrongDispatch(ODataHttpMethod.GET, UriType.URI9);
wrongDispatch(ODataHttpMethod.PUT, UriType.URI9);
wrongDispatch(ODataHttpMethod.DELETE, UriType.URI9);
wrongDispatch(ODataHttpMethod.PATCH, UriType.URI9);
wrongDispatch(ODataHttpMethod.MERGE, UriType.URI9);
wrongDispatch(ODataHttpMethod.PUT, UriType.URI15);
wrongDispatch(ODataHttpMethod.POST, UriType.URI15);
wrongDispatch(ODataHttpMethod.DELETE, UriType.URI15);
wrongDispatch(ODataHttpMethod.PATCH, UriType.URI15);
wrongDispatch(ODataHttpMethod.MERGE, UriType.URI15);
wrongDispatch(ODataHttpMethod.PUT, UriType.URI16);
wrongDispatch(ODataHttpMethod.POST, UriType.URI16);
wrongDispatch(ODataHttpMethod.DELETE, UriType.URI16);
wrongDispatch(ODataHttpMethod.PATCH, UriType.URI16);
wrongDispatch(ODataHttpMethod.MERGE, UriType.URI16);
wrongDispatch(ODataHttpMethod.POST, UriType.URI17);
wrongDispatch(ODataHttpMethod.PATCH, UriType.URI17);
wrongDispatch(ODataHttpMethod.MERGE, UriType.URI17);
wrongDispatch(ODataHttpMethod.PUT, UriType.URI50A);
wrongDispatch(ODataHttpMethod.POST, UriType.URI50A);
wrongDispatch(ODataHttpMethod.DELETE, UriType.URI50A);
wrongDispatch(ODataHttpMethod.PATCH, UriType.URI50A);
wrongDispatch(ODataHttpMethod.MERGE, UriType.URI50A);
wrongDispatch(ODataHttpMethod.PUT, UriType.URI50B);
wrongDispatch(ODataHttpMethod.POST, UriType.URI50B);
wrongDispatch(ODataHttpMethod.DELETE, UriType.URI50B);
wrongDispatch(ODataHttpMethod.PATCH, UriType.URI50B);
wrongDispatch(ODataHttpMethod.MERGE, UriType.URI50B);
}
@Test
public void dispatchNotSupportedCombinations() throws Exception {
notSupportedDispatch(ODataHttpMethod.PUT, UriType.URI6A);
notSupportedDispatch(ODataHttpMethod.DELETE, UriType.URI6A);
notSupportedDispatch(ODataHttpMethod.PATCH, UriType.URI6A);
notSupportedDispatch(ODataHttpMethod.MERGE, UriType.URI6A);
}
private static void checkFeature(final UriType uriType, final boolean isValue,
final Class<? extends ODataProcessor> feature) throws ODataException {
ODataServiceFactory factory = mock(ODataServiceFactory.class);
new Dispatcher(factory, getMockService());
assertEquals(feature, Dispatcher.mapUriTypeToProcessorFeature(mockUriInfo(uriType, isValue)));
assertEquals(feature, Dispatcher.mapUriTypeToProcessorFeature(mockUriInfo(uriType, isValue)));
}
@Test
public void processorFeature() throws Exception {
checkFeature(UriType.URI0, false, ServiceDocumentProcessor.class);
checkFeature(UriType.URI1, false, EntitySetProcessor.class);
checkFeature(UriType.URI2, false, EntityProcessor.class);
checkFeature(UriType.URI3, false, EntityComplexPropertyProcessor.class);
checkFeature(UriType.URI4, false, EntitySimplePropertyProcessor.class);
checkFeature(UriType.URI4, true, EntitySimplePropertyValueProcessor.class);
checkFeature(UriType.URI5, false, EntitySimplePropertyProcessor.class);
checkFeature(UriType.URI5, true, EntitySimplePropertyValueProcessor.class);
checkFeature(UriType.URI6A, false, EntityProcessor.class);
checkFeature(UriType.URI6B, false, EntitySetProcessor.class);
checkFeature(UriType.URI7A, false, EntityLinkProcessor.class);
checkFeature(UriType.URI7B, false, EntityLinksProcessor.class);
checkFeature(UriType.URI8, false, MetadataProcessor.class);
checkFeature(UriType.URI9, false, BatchProcessor.class);
checkFeature(UriType.URI10, false, FunctionImportProcessor.class);
checkFeature(UriType.URI11, false, FunctionImportProcessor.class);
checkFeature(UriType.URI12, false, FunctionImportProcessor.class);
checkFeature(UriType.URI13, false, FunctionImportProcessor.class);
checkFeature(UriType.URI14, false, FunctionImportProcessor.class);
checkFeature(UriType.URI14, true, FunctionImportValueProcessor.class);
checkFeature(UriType.URI15, false, EntitySetProcessor.class);
checkFeature(UriType.URI16, false, EntityProcessor.class);
checkFeature(UriType.URI17, false, EntityMediaProcessor.class);
checkFeature(UriType.URI50A, false, EntityLinkProcessor.class);
checkFeature(UriType.URI50B, false, EntityLinksProcessor.class);
}
@Test
public void contentNegotiationDefaultCharset() throws Exception {
negotiateContentTypeCharset("application/xml", "application/xml;charset=utf-8", false);
}
@Test
public void contentNegotiationDefaultCharsetAsDollarFormat() throws Exception {
negotiateContentTypeCharset("application/xml", "application/xml;charset=utf-8", true);
}
@Test
public void contentNegotiationSupportedCharset() throws Exception {
negotiateContentTypeCharset("application/xml;charset=utf-8", "application/xml;charset=utf-8", false);
}
@Test
public void contentNegotiationSupportedCharsetAsDollarFormat() throws Exception {
negotiateContentTypeCharset("application/xml;charset=utf-8", "application/xml;charset=utf-8", true);
}
@SuppressWarnings("unchecked")
private void
negotiateContentTypeCharset(final String requestType, final String supportedType, final boolean asFormat)
throws SecurityException, IllegalArgumentException, NoSuchFieldException, IllegalAccessException,
ODataException {
ODataServiceFactory factory = mock(ODataServiceFactory.class);
ODataService service = Mockito.mock(ODataService.class);
Dispatcher dispatcher = new Dispatcher(factory, service);
UriInfoImpl uriInfo = new UriInfoImpl();
uriInfo.setUriType(UriType.URI1); //
if (asFormat) {
uriInfo.setFormat(requestType);
}
Mockito.when(service.getSupportedContentTypes(Matchers.any(Class.class))).thenReturn(Arrays.asList(supportedType));
EntitySetProcessor processor = Mockito.mock(EntitySetProcessor.class);
ODataResponse response = Mockito.mock(ODataResponse.class);
Mockito.when(response.getContentHeader()).thenReturn(supportedType);
Mockito.when(processor.readEntitySet(uriInfo, supportedType)).thenReturn(response);
Mockito.when(service.getEntitySetProcessor()).thenReturn(processor);
InputStream content = null;
ODataResponse odataResponse =
dispatcher.dispatch(ODataHttpMethod.GET, uriInfo, content, requestType, supportedType);
assertEquals(supportedType, odataResponse.getContentHeader());
}
}