package integration.api.xml; import integration.VertxNubesTestBase; import io.vertx.ext.unit.Async; import io.vertx.ext.unit.TestContext; import org.junit.Test; import org.w3c.dom.Document; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import org.xml.sax.InputSource; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import java.io.StringReader; import static io.vertx.core.http.HttpHeaders.ACCEPT; import static io.vertx.core.http.HttpHeaders.CONTENT_TYPE; // TODO : test errors public class XmlApiTest extends VertxNubesTestBase { private final static String dogXML = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?><dog><breed>Beagle</breed><name>Snoopy</name></dog>"; @Test public void noContentType(TestContext context) { Async async = context.async(); client().getNow("/xml/dog", response -> { context.assertEquals(406, response.statusCode()); async.complete(); }); } @Test public void wrongContentType(TestContext context) { Async async = context.async(); client().get("/xml/dog", response -> { context.assertEquals(406, response.statusCode()); response.bodyHandler(buff -> { context.assertEquals("Not acceptable", buff.toString("UTF-8")); async.complete(); }); }).putHeader(ACCEPT, "yourmum").end(); } @Test public void getDomainObject(TestContext context) { Async async = context.async(); getXML("/xml/dog", response -> { context.assertEquals(200, response.statusCode()); context.assertEquals("application/xml", response.getHeader(CONTENT_TYPE)); response.bodyHandler(buffer -> { context.assertEquals(dogXML, buffer.toString("UTF-8")); async.complete(); }); }); } @Test public void postSomeStuff(TestContext context) { Async async = context.async(); sendXML("/xml/postdog", dogXML, response -> { context.assertEquals(200, response.statusCode()); context.assertEquals("application/xml", response.getHeader(CONTENT_TYPE)); response.bodyHandler(buffer -> { context.assertEquals(dogXML, buffer.toString("UTF-8")); async.complete(); }); }); } @Test public void marshallException(TestContext context) { Async async = context.async(); getXML("/xml/exception", response -> { context.assertEquals(500, response.statusCode()); context.assertEquals("application/xml", response.getHeader(CONTENT_TYPE)); response.bodyHandler(buffer -> { String xml = buffer.toString("UTF-8"); context.assertNotNull(xml); try { Document doc = loadXMLFromString(xml); NodeList elements = doc.getElementsByTagName("message"); Node node = elements.item(0); String msg = node.getTextContent(); context.assertTrue(msg.indexOf("Exception : Manually thrown exception") > -1); async.complete(); } catch(Exception e) { context.fail(e); } }); }); } private static Document loadXMLFromString(String xml) throws Exception { DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = factory.newDocumentBuilder(); InputSource is = new InputSource(new StringReader(xml)); return builder.parse(is); } }