/*
 * 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.json.moshi;

import org.apache.axis2.testutils.Axis2Server;
import org.junit.Assert;
import org.junit.ClassRule;
import org.junit.Test;

public class JSONXMLStreamAPITest {
    @ClassRule
    public static Axis2Server server = new Axis2Server("target/repo/moshi");

    @Test
    public void xmlStreamAPITest()throws Exception{
        String getLibURL = server.getEndpoint("LibraryService") + "getLibrary";
        String echoLibURL = server.getEndpoint("LibraryService") + "echoLibrary";

        String echoLibrary = "{\"echoLibrary\":{\"args0\":{\"admin\":{\"address\":{\"city\":\"My City\",\"country\":" +
                "\"My Country\",\"street\":\"My Street\",\"zipCode\":\"00000\"},\"age\":24,\"name\":\"micheal\"," +
                "\"phone\":12345},\"books\":[{\"author\":\"scofield\",\"numOfPages\":75,\"publisher\":\"malpiyali\"," +
                "\"reviewers\":[\"rev1\",\"rev2\",\"rev3\"]},{\"author\":\"Redman\",\"numOfPages\":75,\"publisher\":" +
                "\"malpiyali\",\"reviewers\":[\"rev1\",\"rev2\",\"rev3\"]},{\"author\":\"Snow\",\"numOfPages\":75," +
                "\"publisher\":\"malpiyali\",\"reviewers\":[\"rev1\",\"rev2\",\"rev3\"]},{\"author\":\"White\"," +
                "\"numOfPages\":75,\"publisher\":\"malpiyali\",\"reviewers\":[\"rev1\",\"rev2\",\"rev3\"]},{" +
                "\"author\":\"Jack\",\"numOfPages\":75,\"publisher\":\"malpiyali\",\"reviewers\":[\"rev1\",\"rev2\"," +
                "\"rev3\"]}],\"staff\":55}}}";

        String getLibrary = "{\"getLibrary\":{\"args0\":\"Newman\"}}";

        String echoLibraryResponse = "{\"echoLibraryResponse\":{\"return\":{\"admin\":{\"address\":{\"city\":" +
                "\"My City\",\"country\":\"My Country\",\"street\":\"My Street\",\"zipCode\":\"00000\"},\"age\":24," +
                "\"name\":\"micheal\",\"phone\":12345},\"books\":[{\"author\":\"scofield\",\"numOfPages\":75," +
                "\"publisher\":\"malpiyali\",\"reviewers\":[\"rev1\",\"rev2\",\"rev3\"]},{\"author\":\"Redman\"," +
                "\"numOfPages\":75,\"publisher\":\"malpiyali\",\"reviewers\":[\"rev1\",\"rev2\",\"rev3\"]}," +
                "{\"author\":\"Snow\",\"numOfPages\":75,\"publisher\":\"malpiyali\",\"reviewers\":[\"rev1\",\"rev2\"," +
                "\"rev3\"]},{\"author\":\"White\",\"numOfPages\":75,\"publisher\":\"malpiyali\",\"reviewers\":" +
                "[\"rev1\",\"rev2\",\"rev3\"]},{\"author\":\"Jack\",\"numOfPages\":75,\"publisher\":\"malpiyali\"," +
                "\"reviewers\":[\"rev1\",\"rev2\",\"rev3\"]}],\"staff\":55}}}";

        String getLibraryResponse = "{\"getLibraryResponse\":{\"return\":{\"admin\":{\"address\":{\"city\":\"My City\"," +
                "\"country\":\"My Country\",\"street\":\"My Street\",\"zipCode\":\"00000\"},\"age\":24,\"name\":" +
                "\"Newman\",\"phone\":12345},\"books\":[{\"author\":\"Jhon_0\",\"numOfPages\":175,\"publisher\":" +
                "\"Foxier\",\"reviewers\":[\"rev1\",\"rev2\",\"rev3\"]},{\"author\":\"Jhon_1\",\"numOfPages\":175," +
                "\"publisher\":\"Foxier\",\"reviewers\":[\"rev1\",\"rev2\",\"rev3\"]},{\"author\":\"Jhon_2\"," +
                "\"numOfPages\":175,\"publisher\":\"Foxier\",\"reviewers\":[\"rev1\",\"rev2\",\"rev3\"]},{\"author\":" +
                "\"Jhon_3\",\"numOfPages\":175,\"publisher\":\"Foxier\",\"reviewers\":[\"rev1\",\"rev2\",\"rev3\"]}," +
                "{\"author\":\"Jhon_4\",\"numOfPages\":175,\"publisher\":\"Foxier\",\"reviewers\":[\"rev1\",\"rev2\"," +
                "\"rev3\"]}],\"staff\":50}}}";

        String actualResponse = UtilTest.post(echoLibrary, echoLibURL);
        Assert.assertNotNull(actualResponse);
        Assert.assertEquals(echoLibraryResponse , actualResponse);

        String actualRespose_2 = UtilTest.post(getLibrary, getLibURL);
        Assert.assertNotNull(actualRespose_2);
        Assert.assertEquals(getLibraryResponse, actualRespose_2);

    }




}
