/*
 *  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.synapse.mediators.bsf;

import org.apache.axiom.om.impl.exception.XMLComparisonException;
import org.apache.synapse.mediators.AbstractTestCase;

import javax.script.ScriptEngineManager;

public class ScriptMediatorSerializationTest extends AbstractTestCase {

    ScriptMediatorFactory mediatorFactory;
    ScriptMediatorSerializer scriptMediatorSerializer;

    public ScriptMediatorSerializationTest() {
        mediatorFactory = new ScriptMediatorFactory();
        scriptMediatorSerializer = new ScriptMediatorSerializer();
    }

    public void testScriptMediatorSerializationScenarioOne() throws XMLComparisonException {
        String inputXml = "<script xmlns=\"http://ws.apache.org/ns/synapse\" key=\"script-key\" function=\"funOne\" language=\"js\"></script> ";
        assertTrue(serialization(inputXml, mediatorFactory, scriptMediatorSerializer));
        assertTrue(serialization(inputXml, scriptMediatorSerializer));
    }

    public void testScriptMediatorSerializationScenarioTwo() throws XMLComparisonException {
        String inputXml = "<script xmlns=\"http://ws.apache.org/ns/synapse\" language=\"js\" key=\"script-key\" ></script> ";
        assertTrue(serialization(inputXml, mediatorFactory, scriptMediatorSerializer));
        assertTrue(serialization(inputXml, scriptMediatorSerializer));
    }

    public void testInlineScriptMediatorSerializationScenarioOne() throws XMLComparisonException {
        String inputXml = "<syn:script xmlns:syn=\"http://ws.apache.org/ns/synapse\" language='rhinoJs'>" +
                "<![CDATA[var symbol = mc.getPayloadXML()..*::Code.toString();mc.setPayloadXML(<m:getQuote xmlns:m=\"http://services.samples/xsd\">\n" +
                "<m:request><m:symbol>{symbol}</m:symbol></m:request></m:getQuote>);]]></syn:script> ";
        assertTrue(serialization(inputXml, mediatorFactory, scriptMediatorSerializer));
        assertTrue(serialization(inputXml, scriptMediatorSerializer));
    }

    public void testInlineScriptMediatorSerializationScenarioTwo() throws XMLComparisonException {
        // Skip this test if Ruby script engine is not available (e.g., on JDK 21 with old JRuby)
        ScriptEngineManager manager = new ScriptEngineManager();
        if (manager.getEngineByName("rb") == null && manager.getEngineByName("ruby") == null) {
            System.out.println("Skipping testInlineScriptMediatorSerializationScenarioTwo - Ruby script engine not available");
            return;
        }
        
        String inputXml = "<syn:script xmlns:syn=\"http://ws.apache.org/ns/synapse\" language='rb'>" +
                "<![CDATA[" +
                "require 'rexml/document'\n" +
                "include REXML\n" +
                "newRequest= Document.new '<m:getQuote xmlns:m=\"http://services.samples/xsd\"><m:request><m:symbol>...test...</m:symbol></m:request></m:getQuote>'\n" +
                "newRequest.root.elements[1].elements[1].text = $mc.getPayloadXML().root.elements[1].get_text\n" +
                "$mc.setPayloadXML(newRequest)" +
                "]]></syn:script>";
        assertTrue(serialization(inputXml, mediatorFactory, scriptMediatorSerializer));
        assertTrue(serialization(inputXml, scriptMediatorSerializer));
    }

    public void testV2ScriptMediator() throws XMLComparisonException {
        String inputXml = "<script xmlns=\"http://ws.apache.org/ns/synapse\" language=\"js\" key=\"resources:js/test_math.js\" " +
                "function=\"sum_js\" target=\"variable\" target-variable=\"var1\">" +
                "<inputs>" +
                "<argument name=\"num1\" type=\"INTEGER\" expression=\"${payload.requestId}\" />" +
                "<argument name=\"num2\" type=\"INTEGER\" value=\"20\" />" +
                "</inputs>" +
                "</script>";
        assertTrue(serialization(inputXml, mediatorFactory, scriptMediatorSerializer));
        assertTrue(serialization(inputXml, scriptMediatorSerializer));
    }
}
