package io.swagger; import static org.testng.Assert.assertEquals; import static org.testng.Assert.assertNotNull; import static org.testng.Assert.assertNull; import static org.testng.Assert.assertTrue; import static org.testng.Assert.fail; import io.swagger.converter.ModelConverters; import io.swagger.models.Address; import io.swagger.models.Issue534; import io.swagger.models.Model; import io.swagger.models.ModelImpl; import io.swagger.models.ModelWithJAXBAnnotations; import io.swagger.models.Xml; import io.swagger.models.properties.Property; import org.testng.annotations.Test; import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; import java.util.Map; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlElementWrapper; import javax.xml.bind.annotation.XmlRootElement; public class XmlModelTest { @Test(description = "it should process an XML model attribute") public void processXMLModelAttribute() { final Map<String, Model> schemas = ModelConverters.getInstance().readAll(Monster.class); final Model model = schemas.get("Monster"); assertNotNull(model); assertTrue(model instanceof ModelImpl); Xml xml = ((ModelImpl) model).getXml(); assertNotNull(xml); assertEquals(xml.getName(), "monster"); final Property property = model.getProperties().get("children"); assertNotNull(property); xml = property.getXml(); assertTrue(xml.getWrapped()); assertNull(xml.getName()); } @Test(description = "it should not create an xml object") public void itShouldNotCreateXmlObject() { final Map<String, Model> schemas = ModelConverters.getInstance().readAll(Address.class); final Model model = schemas.get("Address"); assertNotNull(model); assertTrue(model instanceof ModelImpl); final Property property = model.getProperties().get("streetNumber"); final Xml xml = property.getXml(); assertNull(xml); } @Test(description = "it should stay hidden per 534") public void stayHidden() { final Map<String, Model> schemas = ModelConverters.getInstance().readAll(Issue534.class); assertEquals(schemas.get("Issue534").getProperties().size(), 1); } @Test(description = "it should process a model with JAXB annotations") public void processModelWithJAXBAnnotations() { final Map<String, Model> schemas = ModelConverters.getInstance().readAll(ModelWithJAXBAnnotations.class); assertEquals(schemas.size(), 1); final Model model = schemas.get("ModelWithJAXBAnnotations"); assertNotNull(model); assertTrue(model instanceof ModelImpl); final Xml rootXml = ((ModelImpl) model).getXml(); assertNotNull(rootXml); assertEquals(rootXml.getName(), "rootName"); for (Map.Entry<String, Property> entry : model.getProperties().entrySet()) { final String name = entry.getKey(); final Property property = entry.getValue(); if ("id".equals(name)) { final Xml xml = property.getXml(); assertNotNull(xml); assertNull(xml.getName()); assertTrue(xml.getAttribute()); assertNull(xml.getWrapped()); } else if ("name".equals(name)) { final Xml xml = property.getXml(); assertNotNull(xml); assertEquals(xml.getName(), "renamed"); assertNull(xml.getAttribute()); assertNull(xml.getWrapped()); } else if (Arrays.asList("list", "forcedElement").contains(name)) { assertNull(property.getXml()); } else if ("wrappedList".equals(name)) { final Xml xml = property.getXml(); assertNotNull(xml); assertEquals(xml.getName(), "wrappedListItems"); assertNull(xml.getAttribute()); assertTrue(xml.getWrapped()); } else { fail(String.format("Unexpected property: %s", name)); } } } @Test(description = "it should deserialize a model") public void deserializeModel() throws IOException { final String yaml = "---\n" + "type: \"object\"\n" + "properties:\n" + " id:\n" + " type: \"string\"\n" + " xml:\n" + " attribute: true\n" + " name:\n" + " type: \"string\"\n" + " xml:\n" + " name: \"renamed\"\n" + " list:\n" + " type: \"array\"\n" + " items:\n" + " type: \"string\"\n" + " wrappedList:\n" + " type: \"array\"\n" + " xml:\n" + " name: \"wrappedListItems\"\n" + " wrapped: true\n" + " items:\n" + " type: \"string\"\n" + " forcedElement:\n" + " type: \"array\"\n" + " items:\n" + " type: \"string\"\n" + "xml:\n" + " name: \"rootName\""; final ModelImpl model = io.swagger.util.Yaml.mapper().readValue(yaml, ModelImpl.class); final Property wrappedList = model.getProperties().get("wrappedList"); assertNotNull(wrappedList); assertNotNull(wrappedList.getXml()); assertEquals(wrappedList.getXml().getName(), "wrappedListItems"); } @XmlRootElement(name = "monster") class Monster { public String name = ""; @XmlElementWrapper() @XmlElement(name = "children") public java.util.List<String> children = new ArrayList<String>(); } }