package org.jbehave.core.model;
import java.util.List;
import com.google.gson.Gson;
import org.jbehave.core.annotations.AsJson;
import org.junit.Test;
import static java.util.Arrays.asList;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.equalTo;
import static org.hamcrest.Matchers.not;
public class JsonBehaviour {
@Test
public void shouldMapJsonToType() throws Exception {
// Given
JsonFactory factory = new JsonFactory();
// When
String jsonAsString = "{\"string\":\"11\",\"integer\":22,\"stringList\":[\"1\",\"1\"],\"integerList\":[2,2]}";
MyJsonDto jsonDto = (MyJsonDto) factory.createJson(jsonAsString, MyJsonDto.class);
// Then
assertThat(jsonDto.string, equalTo("11"));
assertThat(jsonDto.integer, equalTo(22));
assertThat(jsonDto.stringList, equalTo(asList("1", "1")));
assertThat(jsonDto.integerList, equalTo(asList(2, 2)));
}
@Test
public void shouldMapListOfJsonsToType() throws Exception {
// Given
JsonFactory factory = new JsonFactory();
// When
String jsonAsString = "{\"string\":\"11\",\"integer\":22,\"stringList\":[\"1\",\"1\"],\"integerList\":[2,2]}";
String listOfJsonsAsString = String.format("[%s, %s]", jsonAsString, jsonAsString);
MyJsonDto[] jsonList = (MyJsonDto[]) factory.createJson(listOfJsonsAsString, MyJsonDto[].class);
// Then
for (MyJsonDto jsonDto : jsonList) {
assertThat(jsonDto.string, equalTo("11"));
assertThat(jsonDto.integer, equalTo(22));
assertThat(jsonDto.stringList, equalTo(asList("1", "1")));
assertThat(jsonDto.integerList, equalTo(asList(2, 2)));
}
}
@Test
public void shouldPutNullsIfValuesOfObjectNotFoundInJson() throws Exception {
// Given
JsonFactory factory = new JsonFactory();
// When
String jsonAsString = "{\"integer\":22,\"stringList\":[\"1\",\"1\"]}";
MyJsonDto jsonDto = (MyJsonDto) factory.createJson(jsonAsString, MyJsonDto.class);
// Then
assertThat(jsonDto.string, equalTo(null));
assertThat(jsonDto.integer, equalTo(22));
assertThat(jsonDto.stringList, equalTo(asList("1", "1")));
assertThat(jsonDto.integerList, equalTo(null));
}
@Test
public void shouldPutAllNullsIfNoJsonArgumentsMatched() {
// Given
JsonFactory factory = new JsonFactory();
// When
String jsonAsString = "{\"string2\":\"11\",\"integer2\":22,\"stringList2\":[\"1\",\"1\"],\"integerList2\":[2,2]}";
MyJsonDto jsonDto = (MyJsonDto) factory.createJson(jsonAsString, MyJsonDto.class);
// Then
assertThat(jsonDto.string, equalTo(null));
assertThat(jsonDto.integer, equalTo(null));
assertThat(jsonDto.stringList, equalTo(null));
assertThat(jsonDto.integerList, equalTo(null));
}
@Test
public void shouldNotBeEqualJsonWithWhitespaces() {
// Given
JsonFactory factory = new JsonFactory();
// When
String jsonAsString = "{ \"string\" : \"11\" , \"integer\" : 22 , \"stringList\" : [ \"1\" , \"1\" ] , "
+ "\"integerList\" : [ 2 , 2 ] }";
MyJsonDto jsonDto = (MyJsonDto) factory.createJson(jsonAsString, MyJsonDto.class);
// Then
assertThat(new Gson().toJson(jsonDto), not(equalTo(jsonAsString)));
}
@Test
public void shouldBeEqualDtosConvertedFromJsonWithWhitespaces() {
// Given
JsonFactory factory = new JsonFactory();
// When
String jsonAsString = "{ \"string\" : \"11\" , \"integer\" : 22 , \"stringList\" : [ \"1\" , \"1\" ] , "
+ "\"integerList\" : [ 2 , 2 ] }";
MyJsonDto convertedJsonDto = (MyJsonDto) factory.createJson(jsonAsString, MyJsonDto.class);
MyJsonDto createdJsonDto = new MyJsonDto("11", 22, asList("1", "1"), asList(2, 2));
// Then
assertThat(createdJsonDto.getString(), equalTo(convertedJsonDto.getString()));
assertThat(createdJsonDto.getInteger(), equalTo(convertedJsonDto.getInteger()));
assertThat(createdJsonDto.getStringList(), equalTo(convertedJsonDto.getStringList()));
assertThat(createdJsonDto.getIntegerList(), equalTo(convertedJsonDto.getIntegerList()));
}
@AsJson
public static class MyJsonDto {
private String string;
private Integer integer;
private List<String> stringList;
private List<Integer> integerList;
public String getString() {
return string;
}
public Integer getInteger() {
return integer;
}
public List<String> getStringList() {
return stringList;
}
public List<Integer> getIntegerList() {
return integerList;
}
public MyJsonDto(String string, Integer integer, List<String> stringList, List<Integer> integerList) {
this.string = string;
this.integer = integer;
this.stringList = stringList;
this.integerList = integerList;
}
}
}