/*
 * Copyright (c) 1998, 2021 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:
//     Oracle - initial API and implementation from Oracle TopLink
package org.eclipse.persistence.testing.tests.jpa.spring;

import java.lang.reflect.Field;
import java.util.List;

import jakarta.persistence.Query;

import org.springframework.dao.InvalidDataAccessApiUsageException;

import junit.framework.TestCase;
import test.org.eclipse.persistence.testing.models.jpa.spring.Address;
import test.org.eclipse.persistence.testing.models.jpa.spring.Route;
import test.org.eclipse.persistence.testing.models.jpa.spring.Truck;


/**
 * Base Junit TestClass for Spring Framework tests.
 * All test methods here will be exercised by the different Spring configurations that extend this class.
 */
public abstract class SpringJunitTestCase extends TestCase {

    private EntityManagerWrapper em;

    protected void setEntityManager(EntityManagerWrapper em) {
        this.em = em;
    }

    public void testPersist(){
        Truck truck = new Truck("persist");
        try {
            em.persist(truck);
            assertTrue(((Truck)em.find(truck)).getDriverName().equals("persist"));
        } finally {
            em.remove(truck);
        }
    }

    //With this entity model, removing the truck should not delete the route nor address
    public void testCascadePersistwithRemove(){
        Truck truck = new Truck("cascade");
        Route   route   = new Route(155);
        Address address = new Address(1, 1, "First St.");
        route.addAddress(address);
        truck.setRoute(route);
        try {
            em.persist(truck);
            assertTrue(((Truck)em.find(truck)).getDriverName().equals("cascade"));
            assertTrue(((Route)em.find(route)).getAverageTimeMins() == 155);
            assertTrue(((Address)em.find(address)).getStreet().equals("First St."));

            em.remove(truck);
            assertTrue(em.find(truck) == null);
            assertTrue(((Route)em.find(route)).getAverageTimeMins() == 155);
            assertTrue(((Address)em.find(address)).getStreet().equals("First St."));
        } finally {
            route.removeAddress(address);
            em.remove(address);
            em.remove(route);
        }
    }

    public void testRemove(){
        Truck truck = new Truck("remove");
        em.persist(truck);
        assertTrue(((Truck) em.find(truck)).getDriverName().equals("remove"));
        em.remove(truck);
        assertTrue(em.find(truck) == null);
    }

    public void testContains(){
        Truck truck = new Truck("contains");
        try {
            em.persist(truck);
            assertTrue(em.contains(truck));
            assertFalse(em.contains(new Truck("doesNotContain")));
        } finally {
            em.remove(truck);
        }
    }

    public void testMerge(){
        Truck truck = new Truck("merge");
        try {
            truck = (Truck)em.merge(truck);
            assertTrue(((Truck) em.find(truck)).getDriverName().equals("merge"));
        } finally {
            em.remove(truck);
        }
    }

    public void testRefresh(){
        Truck truck = new Truck("refresh");
        try {
            em.persist(truck);
            em.flush();
            assertTrue(((Truck) em.find(truck)).getDriverName().equals("refresh"));
            truck.setDriverName("changeRefresh");
            em.refresh(truck);
            assertTrue(truck.getDriverName().equals("refresh"));
        } finally {
            em.remove(truck);
        }
    }

    public void testFlush(){
        Truck truck = new Truck("flush");
        try {
            em.persist(truck);
            assertTrue(((Truck) em.find(truck)).getDriverName().equals("flush"));
            truck.setDriverName("reflush");
            em.flush();
            assertTrue(((Truck) em.find(truck)).getDriverName().equals("reflush"));
        } finally {
            em.remove(truck);
        }
    }

    public void testCreateNativeQuery(){
        Route route = new Route();
        route.setAverageTimeMins(150);
        em.persist(route);
        Route r = (Route)em.createNativeQuery(
                "SELECT id as ID, averageTimeMins as AVERAGETIMEMINS FROM SPRING_TLE_ROUTE WHERE (ID="+route.getId()+")", Route.class)
                .getSingleResult();
        assertTrue(r.getAverageTimeMins() == 150);

        em.executeNativeQuery("DELETE FROM SPRING_TLE_ROUTE WHERE (ID="+route.getId()+")");
        List l = em.createNativeQuery(
                "SELECT id as ID, averageTimeMins as AVERAGETIMEMINS FROM SPRING_TLE_ROUTE WHERE (ID="+route.getId()+")", Route.class)
                .getResultList();
        assertTrue(l.size() == 0);
    }

    public void testNamedQuery(){
        Truck truck = new Truck("namedQuery");
        Route route = new Route();
        truck.setRoute(route);
        try {
            em.persist(truck);
            Query q = em.createNamedQuery("findTruckByDriverName");
            q.setParameter(1, "namedQuery");
            assertTrue(((Truck)q.getSingleResult()).getRoute().getId() == route.getId());
        } finally {
            em.remove(truck);
            em.remove(route);
        }
    }

    public void testCreateQuery(){
        Truck truck = new Truck("createQuery");
        try {
            em.persist(truck);
            em.flush();
            Query q = em.createQuery("SELECT t FROM Truck t WHERE t.driverName LIKE ?1");
            q.setParameter(1, "createQuery");
            assertTrue(((Truck)q.getSingleResult()).getId() == truck.getId());
        } finally {
            em.remove(truck);
        }
    }

    //COMMENT OUT if weaving is disabled
    public void testAddressVH() {
        Field f = null;
        try {
            f = Address.class.getDeclaredField("_persistence_route_vh");
        } catch (Exception e) {
            assertFalse("Exception when Address value holder retrieved", true);
        }
        assertNotNull("Address class does not have '_persistence_route_vh' field", f);
    }

    public void testDataExceptionTranslation(){
        try {
            em.refresh(new Truck("detachedTruck"));
            assertFalse("No exception thrown with bad refresh", true);
        }catch (InvalidDataAccessApiUsageException idaaue) {
            //expected, so do nothing
        }catch (Exception e) {
            assertFalse("Wrong exception thrown with bad refresh: " + e, true);
        }
    }

}
