package io.monokkel.core; import io.monokkel.domain.PageData; import io.monokkel.exceptions.ParseException; import org.junit.Test; import java.util.List; import java.util.Map; import static com.google.common.collect.ImmutableMap.of; import static com.google.common.collect.Lists.newArrayList; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; public class JsonTransformerTest extends JsonSupportTest<JsonTransformer> { @Override protected JsonTransformer createJsonParser() { final List<String> fromPath = newArrayList("from"); return new JsonTransformer(of("fromData", fromPath), newArrayList("paging")); } @Test public void parse_withExampleContent_expectFieldContentToBeRetrieved() throws ParseException { final String expectedContent = "{\"id\":\"10154342691895026\",\"name\":\"Magne Nielsen\"}"; final String fieldToRetrieve = "from"; final List<String> fieldPath = newArrayList(fieldToRetrieve); final String expectedField = "outputField"; JsonTransformer jsonTransformer = new JsonTransformer(of(expectedField, fieldPath), newArrayList("paging")); Long timestamp = -1L; String url = ""; String response = createJSONFaceBookPost(); final PageData parse = jsonTransformer.parse(url, response, timestamp); final String outputField = getFieldFromOutputContent(expectedField, parse); assertEquals(expectedContent, outputField); } @Test public void parse_withExampleContent_expectLongContent() throws ParseException { final Long expectedContent = 1L; final List<String> fieldPath = newArrayList("comments", "data", "0", "like_count"); final String expectedField = "outputField"; JsonTransformer jsonTransformer = new JsonTransformer(of(expectedField, fieldPath), newArrayList("paging")); Long timestamp = -1L; String url = ""; String response = createJSONFaceBookPost(); final PageData parse = jsonTransformer.parse(url, response, timestamp); final Long outputField = getFieldFromOutputContent(expectedField, parse, Long.class); assertEquals(expectedContent, outputField); } @Test public void parse_withExampleContent_expectBooleanContent() throws ParseException { final List<String> fieldPath = newArrayList("comments", "data", "0", "user_likes"); final String expectedField = "outputField"; JsonTransformer jsonTransformer = new JsonTransformer(of(expectedField, fieldPath), newArrayList("paging")); Long timestamp = -1L; String url = ""; String response = createJSONFaceBookPost(); final PageData parse = jsonTransformer.parse(url, response, timestamp); final Boolean outputField = getFieldFromOutputContent(expectedField, parse, Boolean.class); assertFalse(outputField); } @SuppressWarnings("unchecked") private <T> T getFieldFromOutputContent(String expectedField, PageData parse, Class<T> clazz) { final Map transformed = parse.getTransformed(); return (T) transformed.get(expectedField); } private String getFieldFromOutputContent(String expectedField, PageData parse) { return getFieldFromOutputContent(expectedField, parse, String.class); } @Test public void parse_withExampleContent_expectFieldToBeRetirevedWithoutWrapping() throws ParseException { final String expectedContent = "Magne Nielsen"; final String fieldToRetrieve = "name"; JsonTransformer jsonTransformer = new JsonTransformer(of("listMap", newArrayList("from", (fieldToRetrieve))), newArrayList("paging")); Long timestamp = -1L; String url = ""; String response = createJSONFaceBookPost(); final PageData parse = jsonTransformer.parse(url, response, timestamp); final String actualContent = getFieldFromOutputContent("listMap", parse); assertEquals(expectedContent, actualContent); } @Test public void parse_withExampleContent_expectNestedFieldToBeRetrievedAndSerializedAsJson() throws ParseException { final String expectedContent = "{\"location\":\"ARØY\",\"name\":\"ARØY-JAM\",\"start_time\":\"2014-07-12\",\"timezone\":\"Europe\\/Oslo\",\"id\":\"270220003150613\"}"; final String expectedField = "content"; JsonTransformer jsonTransformer = new JsonTransformer(of(expectedField, newArrayList("to", "data", "0")), newArrayList("paging")); Long timestamp = -1L; String url = ""; String response = createJSONFaceBookPost(); final PageData parse = jsonTransformer.parse(url, response, timestamp); final String actualContent = getFieldFromOutputContent(expectedField, parse); assertEquals(expectedContent, actualContent); } @Test public void parse_withExampleContent_expectNestedFieldArrayToBeRetrievedAndSerializedAsJson() throws ParseException { final String expectedContent = "{\"actions\":[{\"name\":\"Comment\",\"link\":\"https:\\/\\/www.facebook.com\\/270220003150613\\/posts\\/299282336911046\"},{\"name\":\"Like\",\"link\":\"https:\\/\\/www.facebook.com\\/270220003150613\\/posts\\/299282336911046\"}]}"; JsonTransformer jsonTransformer = new JsonTransformer(of("content", newArrayList("actions")), newArrayList("paging")); Long timestamp = -1L; String url = ""; String response = createJSONFaceBookPost(); final PageData parse = jsonTransformer.parse(url, response, timestamp); final String actualContent = getFieldFromOutputContent("content", parse); assertEquals(expectedContent, actualContent); } @Test public void parse_withSimpleExampleContentAndPathWithIndex_expectObjectToBeFoundInFirstIndex() throws ParseException { final String expectedContent = "{\"element\":\"element\"}"; JsonTransformer jsonTransformer = new JsonTransformer(of("content", newArrayList("list", "0")), newArrayList("paging")); Long timestamp = -1L; String url = ""; String response = "{\"data\":{\"field\":\"This is a field\" },\"list\":[ {\"element\":\"element\"}]}"; final PageData parse = jsonTransformer.parse(url, response, timestamp); final String actualContent = getFieldFromOutputContent("content", parse); assertEquals(expectedContent, actualContent); } @Test public void parse_withSimpleExampleContentAndPathWithWrongIndex_expectExtractedContentToBeEmpty() throws ParseException { final String expectedContent = ""; JsonTransformer jsonTransformer = new JsonTransformer(of("content", newArrayList("list", "1")), newArrayList("paging")); Long timestamp = -1L; String url = ""; String response = "{\"data\":{\"field\":\"This is a field\" },\"list\":[ {\"element\":\"element\"}]}"; final PageData parse = jsonTransformer.parse(url, response, timestamp); final String actualContent = getFieldFromOutputContent("content", parse); assertEquals(expectedContent, actualContent); } @Test public void parse_withSimpleExampleContentAndPathToList_expectExtractedListToBeNamedAndWrappedInAObject() throws ParseException { final String expectedContent = "{\"list\":[{\"element\":\"element\"}]}"; JsonTransformer jsonTransformer = new JsonTransformer(of("content", newArrayList("list")), newArrayList("paging")); Long timestamp = -1L; String url = ""; String response = "{\"data\":{\"field\":\"This is a field\" },\"list\":[ {\"element\":\"element\"}]}"; final PageData parse = jsonTransformer.parse(url, response, timestamp); final String actualContent = getFieldFromOutputContent("content", parse); assertEquals(expectedContent, actualContent); } protected JsonTransformer createJsonParserWithUrlExtract(List<String> fieldsToFindNextUrl) { return new JsonTransformer(of("content", newArrayList("list")), fieldsToFindNextUrl); } }