/*******************************************************************************
 * Copyright (c) 2011, 2013 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 v1.0 and Eclipse Distribution License v. 1.0
 * which accompanies this distribution.
 * The Eclipse Public License is available at http://www.eclipse.org/legal/epl-v10.html
 * and the Eclipse Distribution License is available at
 * http://www.eclipse.org/org/documents/edl-v10.php.
 *
 * 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));
    }
}