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

import org.eclipse.persistence.exceptions.DatabaseException;
import org.eclipse.persistence.sessions.UnitOfWork;
import org.eclipse.persistence.testing.models.employee.domain.Employee;
import org.eclipse.persistence.testing.models.employee.domain.PhoneNumber;


/**
 * Test for bug 3815959: SETSHOULDPERFORMDELETESFIRST(TRUE) PERFORMS REDUNDANT UPDATE STATEMENTS
 */
public class PerformDeletesFirstIgnoreUpdateTest2 extends PerformDeletesFirstIgnoreUpdateTest {

    public PerformDeletesFirstIgnoreUpdateTest2() {
        setDescription("Verifies that TopLink doesn't issue UPDATE phone number after deleting employee owning it");
    }

    @Override
    public void test() {
        // create a new Employee with phone
        String firstName = "PerformDeletesFirstIgnoreUpdateTest2";
        Employee employee = new Employee();
        employee.setFirstName(firstName);
        employee.addPhoneNumber(new PhoneNumber("home", "123", "1234567"));
        UnitOfWork uow = getSession().acquireUnitOfWork();
        uow.registerObject(employee);
        uow.commit();

        // the second uow does the actual testing: updates the phone number and deletes the employee.
        // Note that the test couldn't be performed using a single uow: shouldPerformDeletesFirst setting
        // would have precluded updating the dependent objects before employee deletion - and the deletion
        // would have failed because of the dependencies left.
        UnitOfWork uow2 = getSession().acquireUnitOfWork();
        uow2.setShouldPerformDeletesFirst(true);
        Employee employeeClone = (Employee)uow2.registerObject(employee);
        PhoneNumber phone = (PhoneNumber)employeeClone.getPhoneNumbers().firstElement();
        // The new phone number is too long (it should be no more than 7 characters)
        // therefore is update goes through and not preceded with DELETE DatabaseException will result
        phone.setNumber("1234567890");
        uow2.deleteObject(employeeClone);
        try {
            uow2.commit();
        } catch (DatabaseException ex) {
            dbException = ex;
        }
    }
}
