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);
}
}