blob: 3ecbb8bf09ef7cf72bc93603d47c532bcd834f17 [file] [log] [blame]
/*
* Copyright (c) 2011, 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:
// 05/19/2010-2.1 ailitchev - Bug 244124 - Add Nested FetchGroup
package org.eclipse.persistence.testing.tests.jpa.fetchgroups;
import java.util.ArrayList;
import java.util.Collection;
import junit.framework.TestSuite;
import org.eclipse.persistence.internal.jpa.weaving.ClassWeaver;
import org.eclipse.persistence.queries.FetchGroup;
import org.eclipse.persistence.queries.FetchGroupTracker;
import org.eclipse.persistence.testing.framework.junit.JUnitTestCase;
import org.eclipse.persistence.testing.models.jpa.advanced.Address;
import org.eclipse.persistence.testing.models.jpa.advanced.AdvancedTableCreator;
import org.eclipse.persistence.testing.models.jpa.advanced.Employee;
import org.eclipse.persistence.testing.models.jpa.advanced.PhoneNumber;
import org.junit.Test;
/**
* Test to verify changes made to {@link FetchGroupTracker} and
* {@link ClassWeaver} are working as expected.
*
* @author dclarke
* @since EclipseLink 2.1
*/
public class FetchGroupTrackerWeavingTests extends JUnitTestCase {
String checkAttribute = null;
String checkForSetAttribute = null;
public FetchGroupTrackerWeavingTests() {
super();
}
public FetchGroupTrackerWeavingTests(String name) {
super(name);
}
/*
* Fetch Group tests require weaving.
*/
@Override
public void runBare() throws Throwable {
if (this.shouldRunTestOnServer()) {
super.runBare();
} else {
if (isWeavingEnabled()) {
super.runBare();
}
}
}
public static junit.framework.Test suite() {
TestSuite suite = new TestSuite();
suite.setName("FetchGroupTrackerWeavingTests");
suite.addTest(new FetchGroupTrackerWeavingTests("testSetup"));
suite.addTest(new FetchGroupTrackerWeavingTests("verifyCheckFetchedForSetWithFetchGroup"));
suite.addTest(new FetchGroupTrackerWeavingTests("verifyCheckFetchedWithFetchGroup"));
suite.addTest(new FetchGroupTrackerWeavingTests("verifyCheckFetchedForSetWithFetchGroup_OneToOne"));
suite.addTest(new FetchGroupTrackerWeavingTests("verifyCheckFetchedWithFetchGroup_OneToOne"));
suite.addTest(new FetchGroupTrackerWeavingTests("verifyCheckFetchedForSetWithFetchGroup_OneToMany"));
suite.addTest(new FetchGroupTrackerWeavingTests("verifyCheckFetchedWithFetchGroup_OneToMany"));
return suite;
}
@Override
public void tearDown() {
this.checkAttribute = null;
this.checkForSetAttribute = null;
}
@Test
public void testSetup() {
new AdvancedTableCreator().replaceTables(JUnitTestCase.getServerSession());
// Force uppercase for Postgres.
if (getServerSession().getPlatform().isPostgreSQL()) {
getServerSession().getLogin().setShouldForceFieldNamesToUpperCase(true);
}
}
@Test
public void verifyCheckFetchedForSetWithFetchGroup() {
Employee emp = new Employee();
TestFetchGroup fg = new TestFetchGroup();
((FetchGroupTracker)emp)._persistence_setFetchGroup(fg);
assertNull(this.checkAttribute);
assertNull(this.checkForSetAttribute);
emp.setFirstName("John");
assertNull(this.checkAttribute);
assertNotNull(this.checkForSetAttribute);
assertEquals("firstName", this.checkForSetAttribute);
}
@Test
public void verifyCheckFetchedWithFetchGroup() {
Employee emp = new Employee();
TestFetchGroup fg = new TestFetchGroup();
((FetchGroupTracker)emp)._persistence_setFetchGroup(fg);
assertNull(this.checkAttribute);
assertNull(this.checkForSetAttribute);
emp.getFirstName();
assertNull(this.checkForSetAttribute);
assertNotNull(this.checkAttribute);
assertEquals("firstName", this.checkAttribute);
}
@Test
public void verifyCheckFetchedForSetWithFetchGroup_OneToOne() {
Employee emp = new Employee();
TestFetchGroup fg = new TestFetchGroup();
((FetchGroupTracker)emp)._persistence_setFetchGroup(fg);
assertNull(this.checkAttribute);
assertNull(this.checkForSetAttribute);
emp.setAddress(new Address());
assertNull(this.checkAttribute);
assertNotNull(this.checkForSetAttribute);
assertEquals("address", this.checkForSetAttribute);
}
@Test
public void verifyCheckFetchedWithFetchGroup_OneToOne() {
Employee emp = new Employee();
TestFetchGroup fg = new TestFetchGroup();
((FetchGroupTracker)emp)._persistence_setFetchGroup(fg);
assertNull(this.checkAttribute);
assertNull(this.checkForSetAttribute);
Address addr = emp.getAddress();
assertNull(addr);
assertNull(this.checkForSetAttribute);
assertNotNull(this.checkAttribute);
assertEquals("address", this.checkAttribute);
}
@Test
public void verifyCheckFetchedForSetWithFetchGroup_OneToMany() {
Employee emp = new Employee();
TestFetchGroup fg = new TestFetchGroup();
((FetchGroupTracker)emp)._persistence_setFetchGroup(fg);
assertNull(this.checkAttribute);
assertNull(this.checkForSetAttribute);
emp.setPhoneNumbers(new ArrayList<PhoneNumber>());
assertNull(this.checkAttribute);
assertNotNull(this.checkForSetAttribute);
assertEquals("phoneNumbers", this.checkForSetAttribute);
}
@Test
public void verifyCheckFetchedWithFetchGroup_OneToMany() {
Employee emp = new Employee();
TestFetchGroup fg = new TestFetchGroup();
((FetchGroupTracker)emp)._persistence_setFetchGroup(fg);
assertNull(this.checkAttribute);
assertNull(this.checkForSetAttribute);
Collection<PhoneNumber> phones = emp.getPhoneNumbers();
assertNotNull(phones);
assertTrue(phones.isEmpty());
assertNull(this.checkForSetAttribute);
assertNotNull(this.checkAttribute);
assertEquals("phoneNumbers", this.checkAttribute);
}
class TestFetchGroup extends FetchGroup {
@Override
public String onUnfetchedAttribute(FetchGroupTracker entity, String attributeName) {
checkAttribute = attributeName;
return null;
}
@Override
public String onUnfetchedAttributeForSet(FetchGroupTracker entity, String attributeName) {
checkForSetAttribute = attributeName;
return null;
}
}
}