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

import junit.framework.TestCase;
import org.apache.axis2.AxisFault;
import org.apache.axis2.context.ConfigurationContext;
import org.apache.axis2.deployment.util.Utils;
import org.apache.axis2.description.Parameter;
import org.apache.axis2.engine.AxisConfiguration;

import java.io.File;
import java.io.UnsupportedEncodingException;
import java.net.MalformedURLException;
import java.net.URISyntaxException;
import java.net.URL;

public class ScriptModuleTest extends TestCase {

//    public void testGetScriptForWSDL() throws MalformedURLException, URISyntaxException {
//        ScriptModule module = new ScriptModule();
//        URL wsdlURL = getClass().getClassLoader().getResource("org/apache/axis2/scripting/testrepo/test.wsdl");
//        URL scriptURL = module.getScriptForWSDL(wsdlURL);
//        assertTrue(scriptURL.toString().endsWith("test.js"));
//    }
//
//    public void testGetWSDLsInDir() throws MalformedURLException, URISyntaxException {
//        ScriptModule module = new ScriptModule();
//        URL wsdlURL = getClass().getClassLoader().getResource("org/apache/axis2/scripting/testrepo/test.wsdl");
//        URL scriptsDir = new File(wsdlURL.toURI()).getParentFile().toURL();
//        List wsdls = module.getWSDLsInDir(scriptsDir);
//        assertEquals(2, wsdls.size());
//        assertTrue(wsdls.get(0).toString().endsWith("test.wsdl"));
//    }
//
//    public void testReadScriptSource() throws AxisFault {
//        ScriptModule module = new ScriptModule();
//        URL url = getClass().getClassLoader().getResource("org/apache/axis2/scripting/testrepo/test.js");
//        String s = module.readScriptSource(url);
//        assertEquals("petra", s);
//    }

    public void testGetScriptServicesDirectory() throws AxisFault, MalformedURLException, URISyntaxException, UnsupportedEncodingException {
        ScriptModule module = new ScriptModule();
        AxisConfiguration axisConfig = new AxisConfiguration();
        URL url = getClass().getClassLoader().getResource("org/apache/axis2/scripting/testrepo/test.js");
        File dir = Utils.toFile(url).getParentFile();
        axisConfig.setRepository(dir.getParentFile().toURI().toURL());
        axisConfig.addParameter(new Parameter("scriptServicesDir", dir.getName()));
        assertEquals(dir.toURI().toURL(), module.getScriptServicesDirectory(axisConfig).toURI().toURL());
    }

//    public void testCreateService() throws AxisFault {
//        URL wsdlURL = getClass().getClassLoader().getResource("org/apache/axis2/scripting/testrepo/test.wsdl");
//        URL scriptURL = getClass().getClassLoader().getResource("org/apache/axis2/scripting/testrepo/test.js");
//        ScriptModule module = new ScriptModule();
//        AxisService axisService = module.createService(wsdlURL, scriptURL);
//        assertEquals("petra", axisService.getParameterValue(ScriptReceiver.SCRIPT_SRC_PROP));
//    }

    public void testInit() throws AxisFault, MalformedURLException, URISyntaxException, InterruptedException, UnsupportedEncodingException {
        ScriptModule module = new ScriptModule();
        AxisConfiguration axisConfig = new AxisConfiguration();
        URL url = getClass().getClassLoader().getResource("org/apache/axis2/scripting/testrepo/test.js");
        File dir = Utils.toFile(url).getParentFile();
        axisConfig.setRepository(dir.getParentFile().toURI().toURL());
        axisConfig.addParameter(new Parameter("scriptServicesDir", dir.getName()));
        ConfigurationContext configContext = new ConfigurationContext(axisConfig);

        module.init(configContext, null);
        
        Thread.sleep(500);
        
        assertNotNull(axisConfig.getService("test"));
    }

}
