/*
 * Copyright (c) 1998, 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:
//     dclarke - Dynamic Persistence
//       http://wiki.eclipse.org/EclipseLink/Development/Dynamic
//       (https://bugs.eclipse.org/bugs/show_bug.cgi?id=200045)
//     mnorman - tweaks to work from Ant command-line,
//               get database properties from System, etc.
//
package org.eclipse.persistence.testing.tests.dynamic.dynamichelper;

//javase imports
import java.util.List;

//JUnit4 imports
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;

//EclipseLink imports
import org.eclipse.persistence.dynamic.DynamicClassLoader;
import org.eclipse.persistence.dynamic.DynamicEntity;
import org.eclipse.persistence.dynamic.DynamicHelper;
import org.eclipse.persistence.dynamic.DynamicType;
import org.eclipse.persistence.dynamic.DynamicTypeBuilder;
import org.eclipse.persistence.expressions.ExpressionBuilder;
import org.eclipse.persistence.queries.ReadAllQuery;
import org.eclipse.persistence.queries.ReadObjectQuery;
import org.eclipse.persistence.queries.ReportQuery;
import org.eclipse.persistence.sessions.DatabaseSession;
import org.eclipse.persistence.sessions.UnitOfWork;

//domain-specific (testing) inmports
import static org.eclipse.persistence.testing.tests.dynamic.DynamicTestingHelper.createEmptySession;
import static org.eclipse.persistence.testing.tests.dynamic.DynamicTestingHelper.createSession;

/**
 * Set of tests verifying that the DynamicHelper functions as expected.
 */
public class DynamicHelperTestSuite {

    public static final String PACKAGE_PREFIX =
        DynamicHelperTestSuite.class.getPackage().getName();
    public static final String EMPLOYEE_CLASSNAME = PACKAGE_PREFIX + ".Employee";

    //test fixtures
    static DatabaseSession session = null;
    static DynamicHelper dynamicHelper = null;
    @BeforeClass
    public static void setUp() {
        session = createSession();
        dynamicHelper = new DynamicHelper(session);
        DynamicClassLoader dcl = dynamicHelper.getDynamicClassLoader();
        Class<?> empClass = dcl.createDynamicClass(EMPLOYEE_CLASSNAME);
        DynamicTypeBuilder typeBuilder = new DynamicTypeBuilder(empClass, null, "D_EMPLOYEE");
        typeBuilder.setPrimaryKeyFields("EMP_ID");
        typeBuilder.addDirectMapping("id", int.class, "EMP_ID");
        typeBuilder.addDirectMapping("firstName", String.class, "F_NAME");
        typeBuilder.addDirectMapping("lastName", String.class, "L_NAME");
        dynamicHelper.addTypes(true, false, typeBuilder.getType());
        DynamicType empType = new DynamicHelper(session).getType("Employee");
        assertNotNull("No type found for Employee", empType);

        //Populate table with a single Employee
        DynamicEntity e1 = empType.newDynamicEntity();
        e1.set("id", 1);
        e1.set("firstName", "Mike");
        e1.set("lastName", "Norman");
        UnitOfWork uow = session.acquireUnitOfWork();
        uow.registerNewObject(e1);
        uow.commit();
        session.getIdentityMapAccessor().initializeAllIdentityMaps();
    }

    @AfterClass
    public static void tearDown() {
        session.executeNonSelectingSQL("DROP TABLE D_EMPLOYEE");
        session.logout();
        session = null;
        dynamicHelper = null;
    }

    @Test
    public void createQuery_ValidReadObjectQuery() throws Exception {
        ReadObjectQuery query = dynamicHelper.newReadObjectQuery("Employee");
        assertNotNull(query);
        query.setSelectionCriteria(query.getExpressionBuilder().get("id").equal(1L));

        DynamicEntity emp = (DynamicEntity) session.executeQuery(query);
        assertNotNull(emp);
    }

    @SuppressWarnings("unchecked")
    @Test
    public void createQuery_ValidReadAllQuery() throws Exception {
        ReadAllQuery query = dynamicHelper.newReadAllQuery("Employee");
        assertNotNull(query);

        List<DynamicEntity> emps = (List<DynamicEntity>) session.executeQuery(query);
        assertNotNull(emps);
    }

    @Test
    public void createQuery_ValidReportQuery() throws Exception {
        ReportQuery query = dynamicHelper.newReportQuery("Employee", new ExpressionBuilder());
        assertNotNull(query);
        query.addCount();
        query.setShouldReturnSingleValue(true);

        Number count = (Number) session.executeQuery(query);
        assertNotNull(count);
        assertEquals(1L, count.longValue());
    }

    @Test(expected=IllegalArgumentException.class)
    public void nullArgs() {
        new DynamicHelper(createEmptySession()).newReadAllQuery(null);
    }

}
