package io.katharsis.dispatcher;
import io.katharsis.dispatcher.controller.collection.CollectionGet;
import io.katharsis.dispatcher.registry.ControllerRegistry;
import io.katharsis.errorhandling.ErrorResponse;
import io.katharsis.errorhandling.mapper.ExceptionMapperRegistryTest;
import io.katharsis.locator.SampleJsonServiceLocator;
import io.katharsis.queryParams.QueryParams;
import io.katharsis.repository.RepositoryMethodParameterProvider;
import io.katharsis.request.dto.RequestBody;
import io.katharsis.request.path.JsonPath;
import io.katharsis.request.path.PathBuilder;
import io.katharsis.resource.field.ResourceFieldNameTransformer;
import io.katharsis.resource.information.ResourceInformationBuilder;
import io.katharsis.resource.registry.ResourceRegistry;
import io.katharsis.resource.registry.ResourceRegistryBuilder;
import io.katharsis.resource.registry.ResourceRegistryBuilderTest;
import io.katharsis.resource.registry.ResourceRegistryTest;
import io.katharsis.response.BaseResponseContext;
import io.katharsis.response.HttpStatus;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.ExpectedException;
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.Mockito.any;
import static org.mockito.Mockito.anyString;
import static org.mockito.Mockito.eq;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
public class RequestDispatcherTest {
private ResourceRegistry resourceRegistry;
@Rule
public ExpectedException expectedException = ExpectedException.none();
@Before
public void prepare() {
ResourceInformationBuilder resourceInformationBuilder = new ResourceInformationBuilder(
new ResourceFieldNameTransformer());
ResourceRegistryBuilder registryBuilder = new ResourceRegistryBuilder(new SampleJsonServiceLocator(),
resourceInformationBuilder);
resourceRegistry = registryBuilder
.build(ResourceRegistryBuilderTest.TEST_MODELS_PACKAGE, ResourceRegistryTest.TEST_MODELS_URL);
}
@Test
public void onGivenPathAndRequestTypeControllerShouldHandleRequest() throws Exception {
// GIVEN
String path = "/tasks/";
String requestType = "GET";
PathBuilder pathBuilder = new PathBuilder(resourceRegistry);
ControllerRegistry controllerRegistry = new ControllerRegistry(null);
CollectionGet collectionGet = mock(CollectionGet.class);
controllerRegistry.addController(collectionGet);
RequestDispatcher sut = new RequestDispatcher(controllerRegistry, null);
// WHEN
when(collectionGet.isAcceptable(any(JsonPath.class), eq(requestType))).thenCallRealMethod();
JsonPath jsonPath = pathBuilder.buildPath(path);
sut.dispatchRequest(jsonPath, requestType, new QueryParams(), null, null);
// THEN
verify(collectionGet, times(1)).handle(any(JsonPath.class), any(QueryParams.class), any(RepositoryMethodParameterProvider.class), any(RequestBody.class));
}
@Test
public void shouldMapExceptionToErrorResponseIfMapperIsAvailable() throws Exception {
ControllerRegistry controllerRegistry = mock(ControllerRegistry.class);
//noinspection unchecked
when(controllerRegistry.getController(any(JsonPath.class), anyString())).thenThrow(IllegalStateException.class);
RequestDispatcher requestDispatcher = new RequestDispatcher(controllerRegistry,
ExceptionMapperRegistryTest.exceptionMapperRegistry);
BaseResponseContext response = requestDispatcher.dispatchRequest(null, null, null, null, null);
assertThat(response)
.isNotNull()
.isExactlyInstanceOf(ErrorResponse.class);
ErrorResponse errorResponse = (ErrorResponse) response;
assertThat(errorResponse.getHttpStatus()).isEqualTo(HttpStatus.BAD_REQUEST_400);
}
@Test
public void shouldThrowExceptionAsIsIfMapperIsNotAvailable() throws Exception {
ControllerRegistry controllerRegistry = mock(ControllerRegistry.class);
//noinspection unchecked
when(controllerRegistry.getController(any(JsonPath.class), anyString())).thenThrow(ArithmeticException.class);
RequestDispatcher requestDispatcher = new RequestDispatcher(controllerRegistry,
ExceptionMapperRegistryTest.exceptionMapperRegistry);
expectedException.expect(ArithmeticException.class);
BaseResponseContext response = requestDispatcher.dispatchRequest(null, null, null, null, null);
}
}