blob: 073ba4e25d5ac4ce61aee00b97e33999323aa39d [file] [log] [blame]
/*
* 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:
// Jun 29, 2009-1.0M6 Chris Delahunt
// - TODO Bug#: Bug Description
// 07/05/2010-2.1.1 Michael O'Brien
// - 321716: modelgen and jpa versions of duplicate code in both copies of
// JUnitCriteriaSimpleTestSuite must be kept in sync (to avoid only failing on WebSphere under Derby)
// (ideally there should be only one copy of the code - the other suite should reference or subclass for changes)
// see
// org.eclipse.persistence.testing.tests.jpa.criteria.JUnitCriteriaSimpleTestSuite.simpleModTest():1796
// org.eclipse.persistence.testing.tests.jpa.criteria.metamodel.JUnitCriteriaSimpleTestSuite.simpleModTest():1766
// - 321902: this copied code should be renamed, merged or subclassed off the original
package org.eclipse.persistence.testing.tests.jpa.criteria;
import junit.framework.Test;
import junit.framework.TestSuite;
import org.eclipse.persistence.expressions.ExpressionBuilder;
import org.eclipse.persistence.jpa.JpaEntityManager;
import org.eclipse.persistence.platform.database.DatabasePlatform;
import org.eclipse.persistence.testing.framework.junit.JUnitTestCase;
import org.eclipse.persistence.testing.models.jpa.advanced.Employee;
import jakarta.persistence.EntityManager;
import jakarta.persistence.Query;
import jakarta.persistence.Tuple;
import jakarta.persistence.TypedQuery;
import jakarta.persistence.criteria.CriteriaBuilder;
import jakarta.persistence.criteria.CriteriaQuery;
import jakarta.persistence.criteria.Fetch;
import jakarta.persistence.criteria.Join;
import jakarta.persistence.criteria.JoinType;
import jakarta.persistence.criteria.Path;
import jakarta.persistence.criteria.Root;
import java.util.HashMap;
import java.util.List;
import static org.eclipse.persistence.testing.tests.jpa.criteria.JUnitCriteriaSimpleTestSuiteBase.Attributes.*;
/**
* @author cdelahun Converted from JUnitJPQLSimpleTestSuite
*/
public class JUnitCriteriaSimpleTestSuite extends JUnitCriteriaSimpleTestSuiteBase<String> {
private final class Wrapper implements CriteriaQueryWrapper {
@Override
public <X,Y> Root<X> from(CriteriaQuery<Y> query, Class<X> entityClass) {
return query.from(entityClass);
}
@Override
public <X,Y> Fetch<X,Y> fetch(Root<X> root, Attributes attributeKey, JoinType joinType) {
return root.fetch(attributes.get(attributeKey), JoinType.LEFT);
}
@Override
public <X,Y> Path<Y> get(Path<X> path, Attributes attributeKey) {
return path.get(attributes.get(attributeKey));
}
@Override
public <X,Y> Join<X,Y> join(Root<X> root, Attributes attributeKey) {
return root.join(attributes.get(attributeKey));
}
@Override
public <X, Y> Join<X, Y> join(Root<X> root, Attributes attributeKey, JoinType joinType) {
return root.join(attributes.get(attributeKey), joinType);
}
}
@Override
protected void setWrapper() {
this.wrapper = new Wrapper();
}
@Override
protected void populateAttributes() {
attributes = new HashMap<>();
attributes.put(Employee_id, "id");
attributes.put(Employee_firstName, "firstName");
attributes.put(Employee_lastName, "lastName");
attributes.put(Employee_salary, "salary");
attributes.put(Employee_normalHours, "normalHours");
attributes.put(Employee_phoneNumbers, "phoneNumbers");
attributes.put(Employee_managedEmployees, "managedEmployees");
attributes.put(Employee_projects, "projects");
attributes.put(Employee_address, "address");
attributes.put(Employee_status, "status");
attributes.put(Employee_hugeProject, "hugeProject");
attributes.put(PhoneNumber_number, "number");
attributes.put(PhoneNumber_areaCode, "areaCode");
attributes.put(PhoneNumber_owner, "owner");
attributes.put(Address_street, "street");
attributes.put(Address_postalCode, "postalCode");
attributes.put(Address_city, "city");
attributes.put(LargeProject_budget, "budget");
attributes.put(BeerConsumer_blueBeersToConsume, "blueBeersToConsume");
attributes.put(BlueLight_discount, "discount");
attributes.put(Person_car, "car");
attributes.put(SportsCar_maxSpeed, "maxSpeed");
}
public JUnitCriteriaSimpleTestSuite() {
super();
}
public JUnitCriteriaSimpleTestSuite(String name) {
super(name);
}
// This suite contains all tests contained in this class
public static Test suite() {
TestSuite suite = (TestSuite) JUnitCriteriaSimpleTestSuiteBase.suite(JUnitCriteriaSimpleTestSuite.class);
suite.setName("JUnitCriteriaSimpleTestSuite");
suite.addTest(new JUnitCriteriaSimpleTestSuite("testParameterEqualsParameter"));
suite.addTest(new JUnitCriteriaSimpleTestSuite("testOneEqualsOne"));
suite.addTest(new JUnitCriteriaSimpleTestSuite("testTupleTupleValidation"));
return suite;
}
/**
* Tests 1=1 returns correct result.
*/
@Override
public void testParameterEqualsParameter() throws Exception {
DatabasePlatform databasePlatform = JUnitTestCase.getServerSession().getPlatform();
if (databasePlatform.isSymfoware()) {
getServerSession().logMessage("Test testParameterEqualsParameter skipped for this platform, " + "Symfoware doesn't allow dynamic parameters on both sides of the equals operator at the same time. (bug 304897)");
return;
}
if (databasePlatform.isMaxDB()) {
getServerSession().logMessage("Test testParameterEqualsParameter skipped for this platform, " + "MaxDB doesn't allow dynamic parameters on both sides of the equals operator at the same time. (bug 326962)");
return;
}
EntityManager em = createEntityManager();
beginTransaction(em);
try {
CriteriaBuilder qb = em.getCriteriaBuilder();
// "SELECT e FROM Employee e"
Query query = em.createQuery(qb.createQuery(Employee.class));
List emps = query.getResultList();
assertNotNull(emps);
int numRead = emps.size();
// "SELECT e FROM Employee e WHERE :arg1=:arg2");
CriteriaQuery<Employee> cq = qb.createQuery(Employee.class);
cq.where(qb.equal(qb.parameter(Integer.class, "arg1"), qb.parameter(Integer.class, "arg2")));
query = em.createQuery(cq);
query.setParameter("arg1", 1);
query.setParameter("arg2", 1);
emps = query.getResultList();
assertNotNull(emps);
assertEquals(numRead, emps.size());
} finally {
rollbackTransaction(em);
closeEntityManager(em);
}
}
/**
* Tests 1=1 returns correct result.
*/
public void testOneEqualsOne() throws Exception {
EntityManager em = createEntityManager();
beginTransaction(em);
try {
CriteriaBuilder qb = em.getCriteriaBuilder();
// "SELECT e FROM Employee e"
Query query = em.createQuery(qb.createQuery(Employee.class));
List emps = query.getResultList();
assertNotNull(emps);
int numRead = emps.size();
// "SELECT e FROM Employee e WHERE 1=1");
CriteriaQuery<Employee> cq = qb.createQuery(Employee.class);
cq.where(qb.equal(qb.literal(1), 1));
emps = em.createQuery(cq).getResultList();
assertNotNull(emps);
assertEquals(numRead, emps.size());
ExpressionBuilder builder = new ExpressionBuilder();
query = ((JpaEntityManager) em.getDelegate()).createQuery(builder.value(1).equal(builder.value(1)), Employee.class);
emps = query.getResultList();
assertNotNull(emps);
assertEquals(numRead, emps.size());
} finally {
rollbackTransaction(em);
closeEntityManager(em);
}
}
/**
* bug 366182 : test Tuple.get(tuple) validation
*/
public void testTupleTupleValidation() {
EntityManager em = createEntityManager();
CriteriaBuilder qb = em.getCriteriaBuilder();
CriteriaQuery<Tuple> criteria = qb.createTupleQuery();
Root<Employee> emp = criteria.from(Employee.class);
Path<Object> unusedTupleElement = emp.get("normalHours"); // Receives IllegalArgumentException if metamodel is used
Path<Object> lastName = emp.get("lastName");
criteria.multiselect(lastName, emp.get("firstName"));
TypedQuery<Tuple> query = em.createQuery(criteria);
List<Tuple> list = query.getResultList();
Tuple row = list.get(0);
//verify it doesn't throw an exception in a valid case first:
row.get(lastName);
try {
Object result = row.get(unusedTupleElement);
fail("IllegalArgumentException expected using an invalid value. Result returned:"+result);
} catch (Exception iae) {
assertEquals(IllegalArgumentException.class, iae.getClass());
}
closeEntityManager(em);
}
}