/* * 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.xml; import io.restassured.mapper.ObjectDeserializationContext; import io.restassured.path.xml.mapping.XmlPathObjectDeserializer; import io.restassured.path.xml.support.CoolGreeting; import io.restassured.path.xml.support.Greeting; import io.restassured.path.xml.support.Greetings; import io.restassured.path.xml.config.XmlPathConfig; import org.apache.commons.lang3.StringUtils; import org.junit.Rule; import org.junit.Test; import org.junit.rules.ExpectedException; import java.util.List; import java.util.concurrent.atomic.AtomicBoolean; import static io.restassured.path.xml.XmlPath.from; import static org.hamcrest.Matchers.equalTo; import static org.hamcrest.Matchers.is; import static org.junit.Assert.assertThat; public class XmlPathObjectDeserializationTest { @Rule public ExpectedException exception = ExpectedException.none(); private static final String COOL_GREETING = "<cool><greeting><firstName>John</firstName>\n" + " <lastName>Doe</lastName>\n" + " </greeting></cool>"; public static final String GREETINGS = "<greetings>\n" + "\t<greeting>\n" + "\t\t<firstName>John</firstName>\n" + "\t\t<lastName>Doe</lastName>\n" + "\t</greeting>\n" + "\t<greeting>\n" + "\t\t<firstName>Jane</firstName>\n" + "\t\t<lastName>Doe</lastName>\n" + "\t</greeting>\n" + "\t<greeting>\n" + "\t\t<firstName>Some</firstName>\n" + "\t\t<lastName>One</lastName>\n" + "\t</greeting>\n" + "</greetings>"; @Test public void deserializes_single_sub_node_using_jaxb() { // When final Greeting greeting = from(COOL_GREETING).getObject("cool.greeting", Greeting.class); // Then assertThat(greeting.getFirstName(), equalTo("John")); assertThat(greeting.getLastName(), equalTo("Doe")); } @Test public void deserializes_root_node_using_jaxb() { // When final CoolGreeting greeting = from(COOL_GREETING).getObject("cool", CoolGreeting.class); // Then assertThat(greeting.getGreeting().getFirstName(), equalTo("John")); assertThat(greeting.getGreeting().getLastName(), equalTo("Doe")); } @Test public void deserializes_another_sub_node_using_jaxb() { // When final Greeting greeting = from(GREETINGS).getObject("greetings.greeting[0]", Greeting.class); // Then assertThat(greeting.getFirstName(), equalTo("John")); assertThat(greeting.getLastName(), equalTo("Doe")); } @Test public void deserializes_xml_document_including_list_using_jaxb() { // When final Greetings greetings = from(GREETINGS).getObject("greetings", Greetings.class); // Then assertThat(greetings.getGreeting().size(), is(3)); } @Test public void cannot_deserialize_list_when_using_getObject() { exception.expect(IllegalArgumentException.class); exception.expectMessage("Failed to convert XML to Java Object. If you're trying convert to a list then use the getList method instead."); // When final List<Greeting> greetings = from(GREETINGS).getObject("greetings.greeting", List.class); // Then assertThat(greetings.size(), is(3)); } @Test public void deserializes_list_using_getList() { // When final List<Greeting> greetings = from(GREETINGS).getList("greetings.greeting", Greeting.class); // Then assertThat(greetings.size(), is(3)); } @Test public void xml_path_supports_custom_deserializer() { // Given final AtomicBoolean customDeserializerUsed = new AtomicBoolean(false); final XmlPath xmlPath = new XmlPath(COOL_GREETING).using(XmlPathConfig.xmlPathConfig().defaultObjectDeserializer(new XmlPathObjectDeserializer() { public <T> T deserialize(ObjectDeserializationContext ctx) { customDeserializerUsed.set(true); final String xml = ctx.getDataToDeserialize().asString(); final Greeting greeting = new Greeting(); greeting.setFirstName(StringUtils.substringBetween(xml, "<firstName>", "</firstName>")); greeting.setLastName(StringUtils.substringBetween(xml, "<lastName>", "</lastName>")); return (T) greeting; } })); // When final Greeting greeting = xmlPath.getObject("", Greeting.class); // Then assertThat(greeting.getFirstName(), equalTo("John")); assertThat(greeting.getLastName(), equalTo("Doe")); assertThat(customDeserializerUsed.get(), is(true)); } @Test public void xml_path_supports_custom_deserializer_using_static_configuration() { // Given final AtomicBoolean customDeserializerUsed = new AtomicBoolean(false); XmlPath.config = XmlPathConfig.xmlPathConfig().defaultObjectDeserializer(new XmlPathObjectDeserializer() { public <T> T deserialize(ObjectDeserializationContext ctx) { customDeserializerUsed.set(true); final String xml = ctx.getDataToDeserialize().asString(); final Greeting greeting = new Greeting(); greeting.setFirstName(StringUtils.substringBetween(xml, "<firstName>", "</firstName>")); greeting.setLastName(StringUtils.substringBetween(xml, "<lastName>", "</lastName>")); return (T) greeting; } }); // When try { final XmlPath xmlPath = new XmlPath(COOL_GREETING); final Greeting greeting = xmlPath.getObject("", Greeting.class); // Then assertThat(greeting.getFirstName(), equalTo("John")); assertThat(greeting.getLastName(), equalTo("Doe")); assertThat(customDeserializerUsed.get(), is(true)); } finally { XmlPath.reset(); } } }