/*
 * Copyright (c) 2011, 2020 Oracle and/or its affiliates. All rights reserved.
 *
 * This program and the accompanying materials are made available under the
 * terms of the Eclipse Public License v. 2.0 which is available at
 * http://www.eclipse.org/legal/epl-2.0,
 * or the Eclipse Distribution License v. 1.0 which is available at
 * http://www.eclipse.org/org/documents/edl-v10.php.
 *
 * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
 */

// Contributors:
//     Mike Norman - April 21, 2010
//        fix for bug 309002
package dbws.testing.bindingmodel;

//javase imports

//java eXtension imports
import javax.wsdl.WSDLException;

//JUnit4 imports
import org.junit.BeforeClass;
import org.junit.Test;
import static org.junit.Assert.assertTrue;

//EclipseLink imports
import org.eclipse.persistence.internal.xr.QueryOperation;
import org.eclipse.persistence.internal.xr.SQLQueryHandler;

//domain-specific (test) imports
import dbws.testing.DBWSTestSuite;

public class BindingModelTestSuite extends DBWSTestSuite {

    static final String OPERATION = "numLogXml";
    static final String GROUP_BY_CLAUSE =
        "group by to_char(data, 'HH24') order by to_char(data, 'HH24') asc";

    @BeforeClass
    public static void setUp() throws WSDLException {
        DBWS_BUILDER_XML_USERNAME =
            "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" +
            "<dbws-builder xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\">" +
              "<properties>" +
                "<property name=\"projectName\">bindingmodel</property>" +
                "<property name=\"logLevel\">off</property>" +
                "<property name=\"username\">";
        DBWS_BUILDER_XML_PASSWORD =
                "</property><property name=\"password\">";
        DBWS_BUILDER_XML_URL =
                "</property><property name=\"url\">";
        DBWS_BUILDER_XML_DRIVER =
                "</property><property name=\"driver\">";
        DBWS_BUILDER_XML_PLATFORM =
                "</property><property name=\"platformClassname\">";
        DBWS_BUILDER_XML_MAIN =
                "</property>" +
              "</properties>" +
              "<sql " +
                "name=\"" + OPERATION + "\" " +
                "simpleXMLFormatTag=\"logXmlResult\" " +
                "xmlTag=\"numLogXml\" " +
                ">" +
                "<text><![CDATA[select to_char(data, 'HH24') as \"ora\", count(*) as \"num\" from " +
                  "log_xml where trunc(data) = to_date(?, 'YYYY-MM-DD') and tipo = ? " +
                  GROUP_BY_CLAUSE + "]]></text>" +
                  "<binding name=\"data\" type=\"xsd:string\"/>" +
                  "<binding name=\"tipo\" type=\"xsd:string\"/>" +
              "</sql>" +
            "</dbws-builder>";
        builder = null;
        DBWSTestSuite.setUp(".");
    }

    @Test
    public void checkParsedSqlText() {
        QueryOperation queryOperation =
            (QueryOperation)builder.getXrServiceModel().getOperation(OPERATION);
        SQLQueryHandler sqlQueryHandler = (SQLQueryHandler)queryOperation.getQueryHandler();
        String sqlString =  sqlQueryHandler.getSqlString();
        assertTrue("parse SQL text does not contain GROUP BY clause",
            sqlString.contains(GROUP_BY_CLAUSE));
    }
}
