/*
 * 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.insurance;

import org.eclipse.persistence.queries.ReadObjectQuery;
import org.eclipse.persistence.sessions.UnitOfWork;
import org.eclipse.persistence.testing.framework.*;
import org.eclipse.persistence.tools.schemaframework.PopulationManager;
import org.eclipse.persistence.internal.helper.Helper;
import org.eclipse.persistence.testing.models.insurance.*;

/**
 * This model tests reading/writing/deleting through using the insurance demo.
 */
public class InsuranceBasicTestModel extends TestModel {

    /**
     * Return the JUnit suite to allow JUnit runner to find it.
     * Unfortunately JUnit only allows suite methods to be static,
     * so it is not possible to generically do this.
     */
    public static junit.framework.TestSuite suite() {
        return new InsuranceBasicTestModel();
    }

    public InsuranceBasicTestModel() {
        setDescription("This model tests reading/writing/deleting using the insurance demo.");
    }

    @Override
    public void addRequiredSystems() {
        addRequiredSystem(new InsuranceSystem());

    }

    @Override
    public void addTests() {
        addTest(getReadObjectTestSuite());
        addTest(getReadAllTestSuite());
        addTest(getInsertObjectTestSuite());
        addTest(getUpdateObjectTestSuite());
        addTest(getDeleteObjectTestSuite());
        addTest(getDeletePrivateOwnedTestSuite());
    }

    /**
     * Return an example policy holder instance.
     */
    public static PolicyHolder buildExamplePolicyHolder() {
        PolicyHolder holder = new PolicyHolder();

        holder.setFirstName("Bobby");
        holder.setLastName("Jones");
        holder.setMale();
        holder.setSsn(12345);
        holder.setBirthDate(Helper.dateFromString("1950/04/30"));
        holder.setOccupation("Software Engineer");

        holder.setAddress(Address.example1());

        return holder;
    }

    public static TestSuite getDeleteObjectTestSuite() {
        TestSuite suite = new TestSuite();
        suite.setName("InsuranceDeleteObjectTestSuite");
        suite.setDescription("This suite tests the deletion of each object in the insurance demo.");

        Class holderClass = PolicyHolder.class;
        PopulationManager manager = PopulationManager.getDefaultManager();

        suite.addTest(new DeleteObjectTest(manager.getObject(holderClass, "example1")));
        suite.addTest(new DeleteObjectTest(manager.getObject(holderClass, "example2")));
        suite.addTest(new DeleteObjectTest(manager.getObject(holderClass, "example3")));
        suite.addTest(new DeleteObjectTest(manager.getObject(holderClass, "example4")));

        return suite;

    }

    public static TestSuite getDeletePrivateOwnedTestSuite() {
        TestSuite suite = new TestSuite();
        suite.setName("InsuranceDeletePrivateOwnedTestSuite");
        suite.setDescription("This suite tests the deletion of privately owned objects.");

        suite.addTest(new RemovePrivatelyOwnedTestCase());

        return suite;

    }

    public static TestSuite getInsertObjectTestSuite() {
        TestSuite suite = new TestSuite();
        suite.setName("InsuranceInsertObjectTestSuite");
        suite.setDescription("This suite tests the insertion of each object in the insurance demo.");

        suite.addTest(new InsertObjectTest(buildExamplePolicyHolder()));

        return suite;
    }

    public static TestSuite getReadAllTestSuite() {
        TestSuite suite = new TestSuite();
        suite.setName("InsuranceReadAllTestSuite");
        suite.setDescription("This suite tests the reading of all the objects of each class in the insurance demo.");

        PopulationManager manager = PopulationManager.getDefaultManager();

        suite.addTest(new ReadAllTest(PolicyHolder.class, 4));
        suite.addTest(new ReadAllTest(Policy.class, 5));
        suite.addTest(new ReadAllTest(Claim.class, 7));

        return suite;
    }

    public static TestSuite getReadObjectTestSuite() {
        TestSuite suite = new TestSuite();
        suite.setName("InsuranceReadObjectTestSuite");
        suite.setDescription("This suite test the reading of each object in the insurance demo.");

        Class holderClass = PolicyHolder.class;
        PopulationManager manager = PopulationManager.getDefaultManager();

        suite.addTest(new ReadObjectTest(manager.getObject(holderClass, "example1")));
        suite.addTest(new ReadObjectTest(manager.getObject(holderClass, "example2")));
        suite.addTest(new ReadObjectTest(manager.getObject(holderClass, "example3")));
        suite.addTest(new ReadObjectTest(manager.getObject(holderClass, "example4")));

        return suite;
    }

    public static TestSuite getUpdateObjectTestSuite() {
        TestSuite suite = new TestSuite();
        suite.setName("InsuranceUpdateObjectTestSuite");
        suite.setDescription("This suite tests the updating of each object in the insurance demo.");

        Class holderClass = PolicyHolder.class;
        PopulationManager manager = PopulationManager.getDefaultManager();

        suite.addTest(new WriteObjectTest(manager.getObject(holderClass, "example1")));
        suite.addTest(new UnitOfWorkBasicUpdateObjectTest(manager.getObject(holderClass, "example1")));
        suite.addTest(new UnitOfWorkBasicUpdateObjectTest(manager.getObject(holderClass, "example2")));
        suite.addTest(new UnitOfWorkBasicUpdateObjectTest(manager.getObject(holderClass, "example3")));
        suite.addTest(new UnitOfWorkBasicUpdateObjectTest(manager.getObject(holderClass, "example4")));

        return suite;
    }

    public static class RemovePrivatelyOwnedTestCase extends TestCase {
        public RemovePrivatelyOwnedTestCase() {
            setName("RemovePrivatelyOwnedTestCase");
        }
        @Override
        public void test() {
            // setup
            UnitOfWork uow = getSession().acquireUnitOfWork();
            BicyclePolicy policy = BicyclePolicy.example1();
            uow.registerObject(policy);
            uow.commit();
            long policyNumber = policy.getPolicyNumber();

            int nClaims = policy.getClaims().size();

            // test
            uow = getSession().acquireUnitOfWork();
            BicyclePolicy policyClone = (BicyclePolicy)uow.registerObject(policy);
            Claim claimToRemove = (Claim)policyClone.getClaims().get(0);
            policyClone.getClaims().remove(claimToRemove);
            uow.commit();

            // verify cache
            ReadObjectQuery query = new ReadObjectQuery(claimToRemove);
            query.shouldCheckCacheOnly();
            Claim claimToRemoveCache = (Claim)getSession().executeQuery(query);
            int nClaimsNewCache = policy.getClaims().size();
            // verify db
            getSession().getIdentityMapAccessor().initializeAllIdentityMaps();
            Claim claimToRemoveDb = (Claim)getSession().readObject(claimToRemove);
            policy = (BicyclePolicy)getSession().readObject(policy);
            int nClaimsNewDb = policy.getClaims().size();

            // clean up
            uow = getSession().acquireUnitOfWork();
            uow.deleteObject(policy);
            uow.commit();

            String errorMsg = "";
            if (nClaims == nClaimsNewCache) {
                errorMsg += "Cache: claim has not been removed from policy; ";
            }
            if (claimToRemoveCache != null) {
                errorMsg += "Cache: claim has not been deleted; ";
            }
            if (nClaims == nClaimsNewDb || claimToRemoveDb != null) {
                errorMsg += "DB: Claim has not been deleted";
            }
            if (errorMsg.length() > 0) {
                throw new TestErrorException(errorMsg);
            }
        }
    }
}
