package io.katharsis.jackson; import io.katharsis.queryParams.DefaultQueryParamsParser; import io.katharsis.queryParams.QueryParams; import io.katharsis.queryParams.QueryParamsBuilder; import io.katharsis.request.path.JsonPath; import io.katharsis.request.path.PathBuilder; import io.katharsis.resource.mock.models.OtherPojo; import io.katharsis.resource.mock.models.Pojo; import io.katharsis.resource.mock.models.Project; import io.katharsis.resource.mock.models.Task; import io.katharsis.resource.mock.models.User; import io.katharsis.response.Container; import io.katharsis.response.JsonApiResponse; import io.katharsis.response.LinksInformation; import io.katharsis.response.MetaInformation; import io.katharsis.response.ResourceResponseContext; import org.junit.Test; import java.util.Collections; import java.util.Set; import static net.javacrumbs.jsonunit.fluent.JsonFluentAssert.assertThatJson; public class ContainerSerializerTest extends BaseSerializerTest { @Test public void onSimpleObjectShouldIncludeType() throws Exception { // GIVEN Project project = new Project(); // WHEN String result = sut.writeValueAsString(new Container(project, testResponse)); // THEN assertThatJson(result).node("type").isEqualTo("projects"); } @Test public void onSimpleObjectShouldIncludeStringId() throws Exception { // GIVEN Project project = new Project(); project.setId(1L); // WHEN String result = sut.writeValueAsString(new Container(project, testResponse)); // THEN assertThatJson(result).node("id").isEqualTo("\"1\""); } @Test public void onSimpleObjectShouldIncludeAttributes() throws Exception { // GIVEN User user = new User(); user.setName("name"); user.setMetaInformation(new MetaInformation() { public long getCount() { return 42; } }); user.setLinksInformation(new LinksInformation() { public String getSpaceBubble() { return "value"; } }); // WHEN String result = sut.writeValueAsString(new Container(user, testResponse)); // THEN assertThatJson(result).node("attributes.name").isEqualTo("name"); assertThatJson(result).node("attributes.metaInformation").isAbsent(); assertThatJson(result).node("attributes.linksInformation").isAbsent(); } @Test public void onSimpleObjectWithNullValueShouldNotIncludeAttributes() throws Exception { // GIVEN Project project = new Project(); // WHEN String result = sut.writeValueAsString(new Container(project, testResponse)); // THEN assertThatJson(result).node("attributes.name").isAbsent(); } @Test public void onIncludedFieldsInParamsShouldContainIncludedList() throws Exception { // GIVEN Project project = new Project(); project.setName("name"); project.setDescription("description"); QueryParamsBuilder queryParamsBuilder = new QueryParamsBuilder(new DefaultQueryParamsParser()); QueryParams queryParams = queryParamsBuilder.buildQueryParams( Collections.singletonMap("fields[projects]", Collections.singleton("name"))); JsonPath jsonPath = new PathBuilder(resourceRegistry).buildPath("/projects"); // WHEN String result = sut.writeValueAsString(new Container(project, new ResourceResponseContext(new JsonApiResponse(), jsonPath, queryParams))); // THEN assertThatJson(result).node("attributes.name").isEqualTo("name"); assertThatJson(result).node("attributes.description").isAbsent(); } @Test public void onIncludedRelationshipInParamsShouldContainIncludedList() throws Exception { // GIVEN Task task = new Task(); task.setName("some name"); Project project = new Project(); project.setId(1L); task.setProject(project); QueryParamsBuilder queryParamsBuilder = new QueryParamsBuilder(new DefaultQueryParamsParser()); QueryParams queryParams = queryParamsBuilder.buildQueryParams( Collections.singletonMap("fields[tasks]", Collections.singleton("project"))); JsonPath jsonPath = new PathBuilder(resourceRegistry).buildPath("/tasks"); // WHEN String result = sut.writeValueAsString(new Container(task, new ResourceResponseContext(new JsonApiResponse(), jsonPath, queryParams))); // THEN assertThatJson(result).node("relationships.project").isPresent(); assertThatJson(result).node("attributes.name").isAbsent(); } @Test public void onIncludedAttributesInOtherResourceShouldNotContainFields() throws Exception { // GIVEN Task task = new Task(); task.setName("some name"); Project project = new Project(); project.setId(1L); task.setProject(project); QueryParamsBuilder queryParamsBuilder = new QueryParamsBuilder(new DefaultQueryParamsParser()); QueryParams queryParams = queryParamsBuilder.buildQueryParams( Collections.singletonMap("fields[projects]", Collections.singleton("name"))); JsonPath jsonPath = new PathBuilder(resourceRegistry).buildPath("/tasks"); // WHEN String result = sut.writeValueAsString(new Container(task, new ResourceResponseContext(new JsonApiResponse(), jsonPath, queryParams))); // THEN assertThatJson(result).node("relationships.project").isAbsent(); assertThatJson(result).node("attributes.name").isAbsent(); } @Test public void onNestedAttributesShouldSerializeCorrectly() throws Exception { // GIVEN Pojo pojo = new Pojo(); pojo.setOtherPojo(new OtherPojo() .setValue("some value")); QueryParamsBuilder queryParamsBuilder = new QueryParamsBuilder(new DefaultQueryParamsParser()); QueryParams queryParams = queryParamsBuilder.buildQueryParams(Collections.<String, Set<String>>emptyMap()); JsonPath jsonPath = new PathBuilder(resourceRegistry).buildPath("/pojo"); // WHEN String result = sut.writeValueAsString(new Container(pojo, new ResourceResponseContext(new JsonApiResponse(), jsonPath, queryParams))); // THEN assertThatJson(result).node("attributes.other-pojo.value").isEqualTo("some value"); } @Test public void onMetaInformationShouldSerializeCorrectly() throws Exception { // GIVEN Task task = new Task(); task.setMetaInformation(new MetaInformation() { public String name = "value"; }); QueryParamsBuilder queryParamsBuilder = new QueryParamsBuilder(new DefaultQueryParamsParser()); QueryParams queryParams = queryParamsBuilder.buildQueryParams(Collections.<String, Set<String>>emptyMap()); JsonPath jsonPath = new PathBuilder(resourceRegistry).buildPath("/tasks"); // WHEN String result = sut.writeValueAsString(new Container(task, new ResourceResponseContext( new JsonApiResponse(), jsonPath, queryParams))); // THEN assertThatJson(result).node("meta.name").isEqualTo("value"); } @Test public void onLinksInformationShouldSerializeCorrectly() throws Exception { // GIVEN Task task = new Task(); task.setLinksInformation(new LinksInformation() { public String name = "value"; }); QueryParamsBuilder queryParamsBuilder = new QueryParamsBuilder(new DefaultQueryParamsParser()); QueryParams queryParams = queryParamsBuilder.buildQueryParams(Collections.<String, Set<String>>emptyMap()); JsonPath jsonPath = new PathBuilder(resourceRegistry).buildPath("/tasks"); // WHEN String result = sut.writeValueAsString(new Container(task, new ResourceResponseContext(new JsonApiResponse(), jsonPath, queryParams))); // THEN assertThatJson(result).node("links.name").isEqualTo("value"); } @Test public void onNoLinksInformationShouldSerializeWithDefaultLinks() throws Exception { // GIVEN Project project = new Project() .setId(1L); QueryParamsBuilder queryParamsBuilder = new QueryParamsBuilder(new DefaultQueryParamsParser()); QueryParams queryParams = queryParamsBuilder.buildQueryParams(Collections.<String, Set<String>>emptyMap()); JsonPath jsonPath = new PathBuilder(resourceRegistry).buildPath("/projects"); // WHEN String result = sut.writeValueAsString(new Container(project, new ResourceResponseContext(new JsonApiResponse(), jsonPath, queryParams))); // THEN assertThatJson(result).node("links.self").isEqualTo("https://service.local/projects/1"); } }