/*
 *  Copyright WSO2 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 org.apache.synapse.rest;

import org.apache.synapse.MessageContext;
import org.apache.synapse.api.API;
import org.apache.synapse.config.SynapseConfiguration;
import org.apache.synapse.core.axis2.Axis2MessageContext;
import org.apache.synapse.api.version.URLBasedVersionStrategy;
import org.apache.synapse.transport.nhttp.NhttpConstants;

public class BasicAPIMediationTest extends RESTMediationTestCase {

    private static final String TEST_API = "TestAPI";

    public void testRestURLPostfix1() throws Exception {
        API api = new API(TEST_API, "/test");
        SynapseConfiguration synapseConfig = new SynapseConfiguration();
        synapseConfig.addAPI(TEST_API, api);

        RESTRequestHandler handler = new RESTRequestHandler();

        MessageContext synCtx = getMessageContext(synapseConfig, false, "/test", "GET");
        handler.process(synCtx);
        checkRestURLPostfix(synCtx, "");

        synCtx = getMessageContext(synapseConfig, false, "/test/me/now", "GET");
        handler.process(synCtx);
        checkRestURLPostfix(synCtx, "/me/now");

        synCtx = getMessageContext(synapseConfig, false, "/test?a=5", "GET");
        handler.process(synCtx);
        checkRestURLPostfix(synCtx, "?a=5");

        api.setVersionStrategy(new URLBasedVersionStrategy(api, "1.0.0", null));
        synCtx = getMessageContext(synapseConfig, false, "/test/1.0.0?a=5", "GET");
        handler.process(synCtx);
        checkRestURLPostfix(synCtx, "?a=5");

        synCtx = getMessageContext(synapseConfig, false, "/test/1.0.0/foo?a=5", "GET");
        handler.process(synCtx);
        checkRestURLPostfix(synCtx, "/foo?a=5");
    }

    public void testRestURLPostfix2() throws Exception {
        API api = new API(TEST_API, "/");
        SynapseConfiguration synapseConfig = new SynapseConfiguration();
        synapseConfig.addAPI(TEST_API, api);

        RESTRequestHandler handler = new RESTRequestHandler();

        MessageContext synCtx = getMessageContext(synapseConfig, false, "/test", "GET");
        handler.process(synCtx);
        checkRestURLPostfix(synCtx, "/test");

        synCtx = getMessageContext(synapseConfig, false, "/test/me/now", "GET");
        handler.process(synCtx);
        checkRestURLPostfix(synCtx, "/test/me/now");

        synCtx = getMessageContext(synapseConfig, false, "/test?a=5", "GET");
        handler.process(synCtx);
        checkRestURLPostfix(synCtx, "/test?a=5");
    }

    public void testRestURLPostfix3() throws Exception {
        API api = new API(TEST_API, "/services/Foo");
        SynapseConfiguration synapseConfig = new SynapseConfiguration();
        synapseConfig.addAPI(TEST_API, api);

        RESTRequestHandler handler = new RESTRequestHandler();

        MessageContext synCtx = getMessageContext(synapseConfig, false, "/services/Foo/test", "GET");
        // When the service path is in the URL, NHTTP transport removes that portion
        // from the postfix
        ((Axis2MessageContext) synCtx).getAxis2MessageContext().
                setProperty(NhttpConstants.REST_URL_POSTFIX, "/test");
        handler.process(synCtx);
        checkRestURLPostfix(synCtx, "/test");
    }
    
    private void checkRestURLPostfix(MessageContext synCtx, String restURLPostfix) {
        String actual = (String) ((Axis2MessageContext) synCtx).getAxis2MessageContext().
                getProperty(NhttpConstants.REST_URL_POSTFIX);
        assertEquals(restURLPostfix, actual);
    }
}
