package uk.ac.ox.zoo.seeg.abraid.mp.common.web;
import com.fasterxml.jackson.core.type.TypeReference;
import org.joda.time.DateTime;
import org.joda.time.format.DateTimeFormat;
import org.junit.Test;
import java.io.IOException;
import java.util.List;
import static com.googlecode.catchexception.CatchException.catchException;
import static com.googlecode.catchexception.CatchException.caughtException;
import static org.assertj.core.api.Assertions.assertThat;
/**
* Tests the JSON parser.
* As we are using an established library (Jackson), the parsing itself needs minimal testing.
*
* Copyright (c) 2014 University of Oxford
*/
public class JsonParserTest {
@Test
public void parseSuccessful() throws IOException {
// Arrange
String json = "{ \"name\": \"Boris Becker\", \"age\": 46, \"dateOfBirth\": \"1967-11-22\" }";
JsonParser parser = new JsonParser();
// Act
JsonParserTestPerson person = parser.parse(json, JsonParserTestPerson.class);
// Assert
assertThat(person.getName()).isEqualTo("Boris Becker");
assertThat(person.getAge()).isEqualTo(46);
DateTime expected = new DateTime("1967-11-22");
assertThat(person.getDateOfBirth().getMillis()).isEqualTo(expected.getMillis());
}
@Test
public void parseInvalidDataType() {
// Arrange
String json = "{ \"name\": \"Boris Becker\", \"age\": \"Invalid\" }";
JsonParser parser = new JsonParser();
// Act
catchException(parser).parse(json, JsonParserTestPerson.class);
// Assert
assertThat(caughtException()).isInstanceOf(JsonParserException.class);
}
@Test
public void parseInvalidJsonFormat() {
// Arrange
String json = "{ \"name\" Boris Becker, \"age\" 46 }";
JsonParser parser = new JsonParser();
// Act
catchException(parser).parse(json, JsonParserTestPerson.class);
// Assert
assertThat(caughtException()).isInstanceOf(JsonParserException.class);
}
@Test
public void parseIntoTypeReference() {
// Arrange
String json = "[ { \"name\": \"Boris Becker\", \"age\": 46 }, { \"name\": \"Pete Sampras\", \"age\": 42 } ]";
JsonParser parser = new JsonParser();
// Act
List<JsonParserTestPerson> people = parser.parse(json, new TypeReference<List<JsonParserTestPerson>>() { });
// Assert
assertThat(people).hasSize(2);
assertThat(people.get(0).getName()).isEqualTo("Boris Becker");
assertThat(people.get(0).getAge()).isEqualTo(46);
assertThat(people.get(1).getName()).isEqualTo("Pete Sampras");
assertThat(people.get(1).getAge()).isEqualTo(42);
}
@Test
public void parseIntoTypeReferenceInvalidJsonFormat() {
// Arrange
String json = "[ { \"name\": \"Boris Becker\", \"age\" 46 }, { \"name\": \"Pete Sampras\", \"age\": 42 } ]";
JsonParser parser = new JsonParser();
// Act
catchException(parser).parse(json, new TypeReference<List<JsonParserTestPerson>>() { });
// Assert
assertThat(caughtException()).isInstanceOf(JsonParserException.class);
}
@Test
public void parseUsingISO8601DateFormat() {
// Arrange
String json = "{ \"name\": \"Boris Becker\", \"age\": 46, \"dateOfBirth\": \"1967-11-22T11:22:33+0400\" }";
JsonParser parser = new JsonParser();
// Act
JsonParserTestPerson person = parser.parse(json, JsonParserTestPerson.class);
// Assert
assertThat(person.getName()).isEqualTo("Boris Becker");
assertThat(person.getAge()).isEqualTo(46);
DateTime expected = new DateTime("1967-11-22T11:22:33+0400");
assertThat(person.getDateOfBirth().getMillis()).isEqualTo(expected.getMillis());
}
@Test
public void parseUsingSpecifiedDateFormat() {
// Arrange
String json = "{ \"name\": \"Boris Becker\", \"age\": 46, \"dateOfBirth\": \"1967-11-22 11:22:33+0400\" }";
final String dateTimeFormatString = "yyyy-MM-dd HH:mm:ssZ";
JsonParser parser = new JsonParser(DateTimeFormat.forPattern(dateTimeFormatString));
// Act
JsonParserTestPerson person = parser.parse(json, JsonParserTestPerson.class);
// Assert
assertThat(person.getName()).isEqualTo("Boris Becker");
assertThat(person.getAge()).isEqualTo(46);
DateTime expected = new DateTime("1967-11-22T11:22:33+0400");
assertThat(person.getDateOfBirth().getMillis()).isEqualTo(expected.getMillis());
}
}