/*
 * Copyright (c) 2005, 2021 Oracle and/or its affiliates. All rights reserved.
 * Copyright (c) 2005, 2015 SAP. 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:
//     SAP - initial API and implementation

package org.eclipse.persistence.testing.tests.wdf.jpa1.relation;

import jakarta.persistence.EntityManager;

import org.eclipse.persistence.testing.framework.wdf.JPAEnvironment;
import org.eclipse.persistence.testing.models.wdf.jpa1.employee.Cubicle;
import org.eclipse.persistence.testing.models.wdf.jpa1.employee.Department;
import org.eclipse.persistence.testing.models.wdf.jpa1.employee.Employee;
import org.eclipse.persistence.testing.tests.wdf.jpa1.JPA1Base;
import org.junit.Test;

public class TestEmployee_Cubicle extends JPA1Base {

    @Override
    public void setup() {
        final JPAEnvironment env = getEnvironment();
        final EntityManager em = env.getEntityManager();
        try {
            env.beginTransaction(em);
            Department dep = new Department(9, "neun");
            Employee emp = new Employee(5, "first", "last", dep);
            Cubicle cub = new Cubicle(Integer.valueOf(3), Integer.valueOf(4), "red", emp);
            emp.setCubicle(cub);
            em.persist(dep);
            em.persist(emp);
            em.persist(cub);
            em.flush();
            env.commitTransactionAndClear(em);
        } finally {
            closeEntityManager(em);
        }
    }

    @Test
    public void testRelationToCompositeKey() {
        final EntityManager em = getEnvironment().getEntityManager();
        try {
            Employee employee = em.find(Employee.class, Integer.valueOf(5));
            verify(employee.getId() == 5, "wrong employee");
            verify(employee.getCubicle() != null, "cubicle is null");
            verify(employee.getCubicle().getFloor() != null, "floor is null");
            verify(employee.getCubicle().getFloor().intValue() == 3, "wrong floor");
            verify(employee.getCubicle().getPlace() != null, "place is null");
            verify(employee.getCubicle().getPlace().intValue() == 4, "wrong place");
            verify(employee.getDepartment() != null, "department is null");
            verify(employee.getDepartment().getId() == 9, "wrong department");
        } finally {
            closeEntityManager(em);
        }
    }
}
