/** * Copyright 2009-2013 Oy Vaadin Ltd * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.vaadin.addon.jpacontainer.provider; import static org.easymock.EasyMock.createMock; import static org.easymock.EasyMock.isA; import static org.easymock.EasyMock.replay; import static org.easymock.EasyMock.verify; import static org.easymock.EasyMock.expectLastCall; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNull; import java.util.List; import javax.persistence.EntityManager; import javax.persistence.EntityManagerFactory; import javax.persistence.EntityTransaction; import javax.persistence.Persistence; import javax.persistence.criteria.CriteriaBuilder; import javax.persistence.criteria.CriteriaQuery; import javax.persistence.criteria.Order; import javax.persistence.criteria.Predicate; import javax.persistence.criteria.Root; import org.easymock.EasyMock; import org.junit.Before; import org.junit.Test; import com.vaadin.addon.jpacontainer.EntityContainer; import com.vaadin.addon.jpacontainer.QueryModifierDelegate; import com.vaadin.addon.jpacontainer.testdata.Person; import com.vaadin.addon.jpacontainer.util.DefaultQueryModifierDelegate; @SuppressWarnings({"rawtypes","unchecked"}) public class QueryModifierDelegateTest { static EntityContainer container = EasyMock.createNiceMock(EntityContainer.class); static { EasyMock.replay(container); } private static EntityManagerFactory emf = Persistence .createEntityManagerFactory("eclipselink-in-memory"); private EntityManager em; private LocalEntityProvider<Person> entityProvider; @Before public void setUp() { em = emf.createEntityManager(); EntityTransaction t = em.getTransaction(); t.begin(); em.createQuery("DELETE FROM Person a").executeUpdate(); t.commit(); // Create a bunch of test Skills t = em.getTransaction(); t.begin(); for (int i = 0; i < 20; i++) { Person p = new Person(); p.setFirstName("firstName" + i); p.setLastName("lastName" + i); em.persist(p); } t.commit(); entityProvider = new LocalEntityProvider<Person>(Person.class, em); } private QueryModifierDelegate createMockDelegate() { QueryModifierDelegate delegate = createMock(QueryModifierDelegate.class); delegate.queryWillBeBuilt(isA(CriteriaBuilder.class), isA(CriteriaQuery.class)); delegate.filtersWillBeAdded(isA(CriteriaBuilder.class), isA(CriteriaQuery.class), isA(List.class)); delegate.filtersWereAdded(isA(CriteriaBuilder.class), isA(CriteriaQuery.class)); delegate.queryHasBeenBuilt(isA(CriteriaBuilder.class), isA(CriteriaQuery.class)); return delegate; } private QueryModifierDelegate createDelegateAddingFirstNameEqualFilter( final String value) { QueryModifierDelegate delegate = new DefaultQueryModifierDelegate() { @Override public void filtersWillBeAdded(CriteriaBuilder criteriaBuilder, CriteriaQuery<?> query, List<Predicate> predicates) { Root<?> root = query.getRoots().iterator().next(); predicates.add(criteriaBuilder.equal( root.<String> get("firstName"), criteriaBuilder.literal(value))); } }; return delegate; } private QueryModifierDelegate createDelegateReplacingOrderByWithFirstNameDesc() { QueryModifierDelegate delegate = new DefaultQueryModifierDelegate() { @Override public void orderByWillBeAdded(CriteriaBuilder criteriaBuilder, CriteriaQuery<?> query, List<Order> orderBy) { Root<?> root = query.getRoots().iterator().next(); orderBy.clear(); orderBy.add(criteriaBuilder.desc(root.get("firstName"))); } }; return delegate; } @Test public void testAddQueryModifierDelegate() { QueryModifierDelegate delegate = createMock(QueryModifierDelegate.class); entityProvider.setQueryModifierDelegate(delegate); assertEquals(delegate, entityProvider.getQueryModifierDelegate()); entityProvider.setQueryModifierDelegate(null); assertNull(entityProvider.getQueryModifierDelegate()); } @Test public void testQueryModifierDelegateCalledBeforeAddingFilters() { QueryModifierDelegate delegate = createMockDelegate(); delegate.orderByWillBeAdded(isA(CriteriaBuilder.class), isA(CriteriaQuery.class), isA(List.class)); delegate.orderByWasAdded(isA(CriteriaBuilder.class), isA(CriteriaQuery.class)); replay(delegate); entityProvider.setQueryModifierDelegate(delegate); entityProvider.getFirstEntityIdentifier(container, null, null); entityProvider.setQueryModifierDelegate(null); verify(delegate); } @Test public void testQueryModifierDelegateCalledWhenCounting() { QueryModifierDelegate delegate = createMockDelegate(); replay(delegate); entityProvider.setQueryModifierDelegate(delegate); entityProvider.getEntityCount(container, null); entityProvider.setQueryModifierDelegate(null); verify(delegate); } @Test public void testQueryModifierDelegateCalledWhenContainsEntity() { QueryModifierDelegate delegate = createMockDelegate(); replay(delegate); entityProvider.setQueryModifierDelegate(delegate); entityProvider.containsEntity(container, 0L, null); entityProvider.setQueryModifierDelegate(null); verify(delegate); } @Test public void testCanAddPredicateThroughQueryModifierDelegate_count() { QueryModifierDelegate delegate = createDelegateAddingFirstNameEqualFilter("firstName9"); entityProvider.setQueryModifierDelegate(delegate); assertEquals(1, entityProvider.getEntityCount(container, null)); entityProvider.setQueryModifierDelegate(null); } @Test public void testCanAddPredicateThroughQueryModifierDelegate_firstEntityId() { Object entityId = entityProvider.getFirstEntityIdentifier(container, null, null); entityId = entityProvider.getNextEntityIdentifier(container, entityId, null, null); entityId = entityProvider.getNextEntityIdentifier(container, entityId, null, null); entityId = entityProvider.getNextEntityIdentifier(container, entityId, null, null); Object actualId = entityProvider.getNextEntityIdentifier(container, entityId, null, null); Person actualPerson = entityProvider.getEntity(container, actualId); QueryModifierDelegate delegate = createDelegateAddingFirstNameEqualFilter(actualPerson .getFirstName()); entityProvider.setQueryModifierDelegate(delegate); Object id = entityProvider.getFirstEntityIdentifier(container, null, null); assertEquals(actualId, id); entityProvider.setQueryModifierDelegate(null); } @Test public void testCanAddPredicateThroughQueryModifierDelegate_containsEntity() { final Object entityId = entityProvider.getFirstEntityIdentifier(container, null, null); QueryModifierDelegate delegate = createDelegateAddingFirstNameEqualFilter("this does not exist"); entityProvider.setQueryModifierDelegate(delegate); assertFalse(entityProvider.containsEntity(container, entityId, null)); entityProvider.setQueryModifierDelegate(null); } @Test public void testCanAddOrderByThroughQueryModifierDelegate() { QueryModifierDelegate delegate = createDelegateReplacingOrderByWithFirstNameDesc(); entityProvider.setQueryModifierDelegate(delegate); Object firstId = entityProvider.getFirstEntityIdentifier(container, null, null); Person person = entityProvider.getEntity(container, firstId); assertEquals("firstName9", person.getFirstName()); entityProvider.setQueryModifierDelegate(null); } }