/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements. See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership. The ASF licenses this file
 * to you 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 org.apache.axis2.databinding.axis2_5887;

import static org.assertj.core.api.Assertions.assertThat;

import java.io.InputStream;

import org.apache.axiom.om.OMXMLBuilderFactory;
import org.apache.axiom.soap.SOAPEnvelope;
import org.apache.axis2.databinding.axis2_5887.client.GetOrdersByStatusResponse;
import org.junit.Test;

public class ParseTest {
    @Test
    public void test() throws Exception {
        GetOrdersByStatusResponse response;
        InputStream in = ParseTest.class.getResourceAsStream("getOrdersByStatus_response.xml");
        try {
            SOAPEnvelope envelope = OMXMLBuilderFactory.createSOAPModelBuilder(in, null).getSOAPEnvelope();
            response = GetOrdersByStatusResponse.Factory.parse(
                    envelope.getBody().getFirstElement().getXMLStreamReader(false));
        } finally {
            in.close();
        }
        assertThat(response.getOrders()).isNotNull();
        assertThat(response.getOrders().getOrders()).isNull();
    }
}
