/*
* Copyright 2016 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package io.restassured.path.json;
import io.restassured.mapper.ObjectDeserializationContext;
import io.restassured.path.json.config.JsonPathConfig;
import io.restassured.path.json.mapping.JsonPathObjectDeserializer;
import io.restassured.path.json.support.Greeting;
import io.restassured.path.json.support.Winner;
import org.apache.commons.lang3.StringUtils;
import org.junit.Test;
import java.util.List;
import java.util.concurrent.atomic.AtomicBoolean;
import static io.restassured.path.json.JsonPath.from;
import static org.hamcrest.Matchers.*;
import static org.junit.Assert.assertThat;
public class JsonPathObjectDeserializationTest {
private static final String GREETING = "{ \"greeting\" : { \n" +
" \"firstName\" : \"John\", \n" +
" \"lastName\" : \"Doe\" \n" +
" }\n" +
"}";
private static final String LOTTO = "{\"lotto\":{\n" +
" \"lottoId\":5,\n" +
" \"winning-numbers\":[2,45,34,23,7,5,3],\n" +
" \"winners\":[{\n" +
" \"winnerId\":23,\n" +
" \"numbers\":[2,45,34,23,3,5]\n" +
" },{\n" +
" \"winnerId\":54,\n" +
" \"numbers\":[52,3,12,11,18,22]\n" +
" }]\n" +
" }\n" +
"}";
@Test public void
json_path_supports_custom_deserializer() {
// Given
final AtomicBoolean customDeserializerUsed = new AtomicBoolean(false);
final JsonPath jsonPath = new JsonPath(GREETING).using(new JsonPathConfig().defaultObjectDeserializer(new JsonPathObjectDeserializer() {
public <T> T deserialize(ObjectDeserializationContext ctx) {
customDeserializerUsed.set(true);
final String json = ctx.getDataToDeserialize().asString();
final Greeting greeting = new Greeting();
greeting.setFirstName(StringUtils.substringBetween(json, "\"firstName\":\"", "\""));
greeting.setLastName(StringUtils.substringBetween(json, "\"lastName\":\"", "\""));
return (T) greeting;
}
}));
// When
final Greeting greeting = jsonPath.getObject("", Greeting.class);
// Then
assertThat(greeting.getFirstName(), equalTo("John"));
assertThat(greeting.getLastName(), equalTo("Doe"));
assertThat(customDeserializerUsed.get(), is(true));
}
@Test public void
json_path_supports_custom_deserializer_with_static_configuration() {
// Given
final AtomicBoolean customDeserializerUsed = new AtomicBoolean(false);
JsonPath.config = new JsonPathConfig().defaultObjectDeserializer(new JsonPathObjectDeserializer() {
public <T> T deserialize(ObjectDeserializationContext ctx) {
customDeserializerUsed.set(true);
final String json = ctx.getDataToDeserialize().asString();
final Greeting greeting = new Greeting();
greeting.setFirstName(StringUtils.substringBetween(json, "\"firstName\":\"", "\""));
greeting.setLastName(StringUtils.substringBetween(json, "\"lastName\":\"", "\""));
return (T) greeting;
}
});
final JsonPath jsonPath = new JsonPath(GREETING);
// When
try {
final Greeting greeting = jsonPath.getObject("", Greeting.class);
// Then
assertThat(greeting.getFirstName(), equalTo("John"));
assertThat(greeting.getLastName(), equalTo("Doe"));
assertThat(customDeserializerUsed.get(), is(true));
} finally {
JsonPath.reset();
}
}
@Test public void
extracting_first_lotto_winner_to_java_object() {
// When
final Winner winner = JsonPath.from(LOTTO).getObject("lotto.winners[0]", Winner.class);
// Then
assertThat(winner.getNumbers(), hasItems(2,45,34,23,3,5));
assertThat(winner.getWinnerId(), is(23));
}
@Test public void
getting_numbers_greater_than_ten_for_lotto_winner_with_id_equal_to_23() {
// When
List<Integer> numbers = JsonPath.from(LOTTO).getList("lotto.winners.find { it.winnerId == 23 }.numbers.findAll { it > 10 }", Integer.class);
// Then
assertThat(numbers, hasItems(45, 34, 23));
assertThat(numbers, hasSize(3));
}
}