/*
 * Copyright 2016 JBoss Inc
 *
 * 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.apiman.gateway.engine.io;

import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.util.Iterator;

import javax.xml.namespace.QName;
import javax.xml.soap.MessageFactory;
import javax.xml.soap.SOAPEnvelope;
import javax.xml.soap.SOAPHeader;
import javax.xml.soap.SOAPHeaderElement;
import javax.xml.soap.SOAPMessage;

import org.junit.Assert;
import org.junit.Test;

/**
 * Unit Test for {@link SoapPayloadIO}.
 *
 * @author eric.wittmann@redhat.com
 */
@SuppressWarnings("nls")
public class SoapPayloadIOTest {

    /**
     * Test method for {@link io.apiman.gateway.engine.io.SoapPayloadIO#unmarshall(java.io.InputStream)}.
     */
    @Test
    public void testUnmarshall_Simple() throws Exception {
        String xml = "<?xml version=\"1.0\"?>\r\n" +
                "<soap:Envelope xmlns:soap=\"http://www.w3.org/2003/05/soap-envelope\">\r\n" +
                "  <soap:Header>\r\n" +
                "     <ns1:CustomHeader xmlns:ns1=\"urn:ns1\">CVALUE</ns1:CustomHeader>\r\n" +
                "  </soap:Header>\r\n" +
                "  <soap:Body>\r\n" +
                "    <m:GetStockPrice xmlns:m=\"http://www.example.org/stock/Surya\">\r\n" +
                "      <m:StockName>IBM</m:StockName>\r\n" +
                "    </m:GetStockPrice>\r\n" +
                "  </soap:Body>\r\n" +
                "</soap:Envelope>";
        byte [] xmlBytes = xml.getBytes();
        SoapPayloadIO io = new SoapPayloadIO();
        try (InputStream is = new ByteArrayInputStream(xmlBytes)) {
            SOAPEnvelope envelope = io.unmarshall(is);
            Assert.assertNotNull(envelope);
            Assert.assertEquals("Envelope", envelope.getLocalName());
            Assert.assertEquals("http://www.w3.org/2003/05/soap-envelope", envelope.getNamespaceURI());

            SOAPHeader header = envelope.getHeader();
            Assert.assertNotNull(header);

            Iterator<?> allHeaderElements = header.examineAllHeaderElements();
            Assert.assertTrue(allHeaderElements.hasNext());
            SOAPHeaderElement cheader = (SOAPHeaderElement) allHeaderElements.next();
            Assert.assertNotNull(cheader);
            Assert.assertEquals("CVALUE", cheader.getTextContent());
        }
    }

    /**
     * Test method for {@link io.apiman.gateway.engine.io.SoapPayloadIO#marshall(org.w3c.dom.Document)}.
     */
    @Test
    public void testMarshall_Simple() throws Exception {
        MessageFactory msgFactory = MessageFactory.newInstance();
        SOAPMessage message = msgFactory.createMessage();
        SOAPEnvelope envelope = message.getSOAPPart().getEnvelope();

        SOAPHeader header = envelope.getHeader();
        SOAPHeaderElement cheader = header.addHeaderElement(new QName("urn:ns1", "CustomHeader"));
        cheader.setTextContent("CVALUE");

        SoapPayloadIO io = new SoapPayloadIO();
        byte[] data = io.marshall(envelope);
        String actual = new String(data);

        String expected = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><SOAP-ENV:Envelope xmlns:SOAP-ENV=\"http://schemas.xmlsoap.org/soap/envelope/\"><SOAP-ENV:Header><CustomHeader xmlns=\"urn:ns1\">CVALUE</CustomHeader></SOAP-ENV:Header><SOAP-ENV:Body/></SOAP-ENV:Envelope>";
        Assert.assertEquals(expected, actual);
    }



}
