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