package io.katharsis.request.dto;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.junit.Test;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import static org.assertj.core.api.Assertions.assertThat;
public class RequestBodyTest {
private final ObjectMapper objectMapper = new ObjectMapper();
@Test
public void onPostDataWithSingleLinkageShouldMapToObject() throws Exception {
// GIVEN
String body = "{\"data\": {\"type\": \"tasks\", \"attributes\": {\"name\": \"asdasd\"}, \"relationships\": {\"project\": " +
"{\"data\": {\"type\": \"projects\", \"id\": \"123\"}}}}}";
// WHEN
RequestBody result = objectMapper.readValue(body, RequestBody.class);
// THEN
assertThat(result).isNotNull();
assertThat(result.getData()).isNotNull();
assertThat(result.getData()).isExactlyInstanceOf(DataBody.class);
DataBody data = result.getSingleData();
assertThat(data.getType()).isEqualTo("tasks");
assertThat(data.getAttributes()).isNotNull();
assertThat(getList(data.getAttributes().fieldNames())).containsOnly("name");
assertThat(data.getAttributes().get("name").asText()).isEqualTo("asdasd");
assertThat(data.getRelationships()).isNotNull();
assertThat(data.getRelationships().getAdditionalProperties()).containsOnlyKeys("project");
assertThat(data.getRelationships().getAdditionalProperties().get("project")).isInstanceOf(LinkageData.class);
assertThat(((LinkageData) (data.getRelationships().getAdditionalProperties().get("project")))
.getType()).isEqualTo("projects");
assertThat(((LinkageData) (data.getRelationships().getAdditionalProperties().get("project")))
.getId()).isEqualTo("123");
}
@Test
public void onPostDataWithNullLinkageShouldMapToObject() throws Exception {
// GIVEN
String body = "{\"data\": {\"type\": \"tasks\", \"attributes\": {\"name\": \"asdasd\"}, \"relationships\": " +
"{\"project\": {\"data\": null }}}}";
// WHEN
RequestBody result = objectMapper.readValue(body, RequestBody.class);
// THEN
assertThat(result).isNotNull();
assertThat(result.getData()).isNotNull();
assertThat(result.getData()).isExactlyInstanceOf(DataBody.class);
DataBody data = result.getSingleData();
assertThat(data.getType()).isEqualTo("tasks");
assertThat(data.getAttributes()).isNotNull();
assertThat(getList(data.getAttributes().fieldNames())).containsOnly("name");
assertThat(data.getAttributes().get("name").asText()).isEqualTo("asdasd");
assertThat(data.getRelationships()).isNotNull();
assertThat(data.getRelationships().getAdditionalProperties()).containsOnlyKeys("project");
assertThat(data.getRelationships().getAdditionalProperties().get("project")).isNull();
}
@Test
public void onPostDataWithListOfLinkageShouldMapToObject() throws Exception {
// GIVEN
String body = "{\"data\": {\"type\": \"tasks\", \"attributes\": {\"name\": \"asdasd\"}, \"relationships\": {\"project\":" +
" {\"data\": [{\"type\": \"projects\", \"id\": \"123\"}]}}}}";
// WHEN
RequestBody result = objectMapper.readValue(body, RequestBody.class);
// THEN
assertThat(result).isNotNull();
assertThat(result.getData()).isNotNull();
assertThat(result.getData()).isExactlyInstanceOf(DataBody.class);
DataBody data = result.getSingleData();
assertThat(data.getType()).isEqualTo("tasks");
assertThat(data.getAttributes()).isNotNull();
assertThat(getList(data.getAttributes().fieldNames())).containsOnly("name");
assertThat(data.getAttributes().get("name").asText()).isEqualTo("asdasd");
assertThat(data.getRelationships()).isNotNull();
assertThat(data.getRelationships().getAdditionalProperties()).containsOnlyKeys("project");
assertThat(data.getRelationships().getAdditionalProperties().get("project")).isInstanceOf(Iterable.class);
//noinspection unchecked
assertThat(((Iterable<LinkageData>) (data.getRelationships().getAdditionalProperties().get("project"))))
.hasSize(1);
//noinspection unchecked
assertThat(((Iterable<LinkageData>) (data.getRelationships().getAdditionalProperties().get("project")))
.iterator().next()).isInstanceOf(LinkageData.class);
//noinspection unchecked
assertThat(((Iterable<LinkageData>) (data.getRelationships().getAdditionalProperties().get("project")))
.iterator().next().getType()).isEqualTo("projects");
//noinspection unchecked
assertThat(((Iterable<LinkageData>) (data.getRelationships().getAdditionalProperties().get("project")))
.iterator().next().getId()).isEqualTo("123");
}
@Test
public void onPostDataWithLifstOfLinkageShouldMapToObject() throws Exception {
// GIVEN
String body = "{\"data\": {\"type\": \"tasks\", \"attributes\": {\"name\": \"asdasd\"}, " +
"\"relationships\": {\"project\": {\"data\": []}}}}";
// WHEN
RequestBody result = objectMapper.readValue(body, RequestBody.class);
// THEN
assertThat(result).isNotNull();
assertThat(result.getData()).isNotNull();
assertThat(result.getData()).isExactlyInstanceOf(DataBody.class);
DataBody data = result.getSingleData();
assertThat(data.getType()).isEqualTo("tasks");
assertThat(data.getAttributes()).isNotNull();
assertThat(getList(data.getAttributes().fieldNames())).containsOnly("name");
assertThat(data.getAttributes().get("name").asText()).isEqualTo("asdasd");
assertThat(data.getRelationships()).isNotNull();
assertThat(data.getRelationships().getAdditionalProperties()).containsOnlyKeys("project");
assertThat(data.getRelationships().getAdditionalProperties().get("project")).isInstanceOf(Iterable.class);
//noinspection unchecked
assertThat(((Iterable<LinkageData>) (data.getRelationships().getAdditionalProperties().get("project"))))
.hasSize(0);
}
private List<String> getList(Iterator<String> iter) {
List<String> copy = new LinkedList<>();
while (iter.hasNext())
copy.add(iter.next());
return copy;
}
}