package io.katharsis.dispatcher.controller.resource; import io.katharsis.dispatcher.controller.BaseControllerTest; import io.katharsis.dispatcher.controller.HttpMethod; import io.katharsis.queryParams.QueryParams; import io.katharsis.request.dto.DataBody; import io.katharsis.request.dto.RequestBody; import io.katharsis.request.dto.ResourceRelationships; import io.katharsis.request.path.JsonPath; import io.katharsis.request.path.ResourcePath; import io.katharsis.resource.mock.models.Project; import io.katharsis.resource.mock.models.Task; import io.katharsis.resource.mock.repository.TaskToProjectRepository; import io.katharsis.resource.registry.ResourceRegistry; import io.katharsis.response.BaseResponseContext; import io.katharsis.response.HttpStatus; import io.katharsis.response.ResourceResponseContext; import org.junit.Test; import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.Mockito.mock; public class FieldResourcePostTest extends BaseControllerTest { private static final String REQUEST_TYPE = HttpMethod.POST.name(); @Test public void onValidRequestShouldAcceptIt() { // GIVEN JsonPath jsonPath = pathBuilder.buildPath("tasks/1/project"); ResourceRegistry resourceRegistry = mock(ResourceRegistry.class); FieldResourcePost sut = new FieldResourcePost(resourceRegistry, typeParser, objectMapper); // WHEN boolean result = sut.isAcceptable(jsonPath, REQUEST_TYPE); // THEN assertThat(result).isTrue(); } @Test public void onRelationshipRequestShouldDenyIt() { // GIVEN JsonPath jsonPath = new ResourcePath("tasks/1/relationships/project"); ResourceRegistry resourceRegistry = mock(ResourceRegistry.class); FieldResourcePost sut = new FieldResourcePost(resourceRegistry, typeParser, objectMapper); // WHEN boolean result = sut.isAcceptable(jsonPath, REQUEST_TYPE); // THEN assertThat(result).isFalse(); } @Test public void onNonRelationRequestShouldDenyIt() { // GIVEN JsonPath jsonPath = new ResourcePath("tasks"); ResourceRegistry resourceRegistry = mock(ResourceRegistry.class); FieldResourcePost sut = new FieldResourcePost(resourceRegistry, typeParser, objectMapper); // WHEN boolean result = sut.isAcceptable(jsonPath, REQUEST_TYPE); // THEN assertThat(result).isFalse(); } @Test public void onExistingParentResourceShouldSaveIt() throws Exception { // GIVEN RequestBody newTaskBody = new RequestBody(); DataBody data = new DataBody(); newTaskBody.setData(data); data.setType("tasks"); data.setAttributes(objectMapper.createObjectNode().put("name", "sample task")); data.setRelationships(new ResourceRelationships()); JsonPath taskPath = pathBuilder.buildPath("/tasks"); ResourcePost resourcePost = new ResourcePost(resourceRegistry, typeParser, objectMapper); // WHEN BaseResponseContext taskResponse = resourcePost.handle(taskPath, new QueryParams(), null, newTaskBody); // THEN assertThat(taskResponse.getResponse().getEntity()).isExactlyInstanceOf(Task.class); Long taskId = ((Task) (taskResponse.getResponse().getEntity())).getId(); assertThat(taskId).isNotNull(); /* ------- */ // GIVEN RequestBody newProjectBody = new RequestBody(); data = new DataBody(); newProjectBody.setData(data); data.setType("projects"); data.setAttributes(objectMapper.createObjectNode().put("name", "sample project")); JsonPath projectPath = pathBuilder.buildPath("/tasks/" + taskId + "/project"); FieldResourcePost sut = new FieldResourcePost(resourceRegistry, typeParser, objectMapper); // WHEN ResourceResponseContext projectResponse = sut.handle(projectPath, new QueryParams(), null, newProjectBody); // THEN assertThat(projectResponse.getHttpStatus()).isEqualTo(HttpStatus.CREATED_201); assertThat(projectResponse.getResponse().getEntity()).isExactlyInstanceOf(Project.class); assertThat(((Project) (projectResponse.getResponse().getEntity())).getId()).isNotNull(); assertThat(((Project) (projectResponse.getResponse().getEntity())).getName()).isEqualTo("sample project"); Long projectId = ((Project) (projectResponse.getResponse().getEntity())).getId(); assertThat(projectId).isNotNull(); TaskToProjectRepository taskToProjectRepository = new TaskToProjectRepository(); Project project = taskToProjectRepository.findOneTarget(taskId, "project", REQUEST_PARAMS); assertThat(project.getId()).isEqualTo(projectId); } @Test public void onExistingParentResourceShouldSaveToToMany() throws Exception { // GIVEN RequestBody newTaskBody = new RequestBody(); DataBody data = new DataBody(); newTaskBody.setData(data); data.setType("tasks"); data.setAttributes(objectMapper.createObjectNode().put("name", "sample task")); data.setRelationships(new ResourceRelationships()); JsonPath taskPath = pathBuilder.buildPath("/tasks"); ResourcePost resourcePost = new ResourcePost(resourceRegistry, typeParser, objectMapper); // WHEN BaseResponseContext taskResponse = resourcePost.handle(taskPath, new QueryParams(), null, newTaskBody); // THEN assertThat(taskResponse.getResponse().getEntity()).isExactlyInstanceOf(Task.class); Long taskId = ((Task) (taskResponse.getResponse().getEntity())).getId(); assertThat(taskId).isNotNull(); /* ------- */ // GIVEN RequestBody newProjectBody = new RequestBody(); data = new DataBody(); newProjectBody.setData(data); data.setType("projects"); data.setAttributes(objectMapper.createObjectNode().put("name", "sample project")); JsonPath projectPath = pathBuilder.buildPath("/tasks/" + taskId + "/projects"); FieldResourcePost sut = new FieldResourcePost(resourceRegistry, typeParser, objectMapper); // WHEN ResourceResponseContext projectResponse = sut.handle(projectPath, new QueryParams(), null, newProjectBody); // THEN assertThat(projectResponse.getHttpStatus()).isEqualTo(HttpStatus.CREATED_201); assertThat(projectResponse.getResponse().getEntity()).isExactlyInstanceOf(Project.class); assertThat(((Project) (projectResponse.getResponse().getEntity())).getId()).isNotNull(); assertThat(((Project) (projectResponse.getResponse().getEntity())).getName()).isEqualTo("sample project"); Long projectId = ((Project) (projectResponse.getResponse().getEntity())).getId(); assertThat(projectId).isNotNull(); TaskToProjectRepository taskToProjectRepository = new TaskToProjectRepository(); Project project = taskToProjectRepository.findOneTarget(taskId, "projects", REQUEST_PARAMS); assertThat(project.getId()).isEqualTo(projectId); } }