/* * Copyright 2014 - 2017 Blazebit. * * 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.blazebit.persistence.view.testsuite.filter; import com.blazebit.persistence.CriteriaBuilder; import com.blazebit.persistence.testsuite.entity.PrimitiveDocument; import com.blazebit.persistence.testsuite.entity.PrimitivePerson; import com.blazebit.persistence.testsuite.tx.TxVoidWork; import com.blazebit.persistence.view.EntityViewManager; import com.blazebit.persistence.view.EntityViewSetting; import com.blazebit.persistence.view.EntityViews; import com.blazebit.persistence.view.spi.EntityViewConfiguration; import com.blazebit.persistence.view.testsuite.AbstractEntityViewTest; import com.blazebit.persistence.view.testsuite.filter.model.AttributeFilterNameClashView; import com.blazebit.persistence.view.testsuite.filter.model.AttributeFilterPrimitiveDocumentView; import com.blazebit.persistence.view.testsuite.filter.model.MultipleDefaultAttributeFiltersView; import com.blazebit.persistence.view.testsuite.filter.model.ViewFilterPrimitiveDocumentView; import org.junit.Assert; import org.junit.Before; import org.junit.Test; import javax.persistence.EntityManager; import java.util.List; import static com.googlecode.catchexception.CatchException.caughtException; import static com.googlecode.catchexception.CatchException.verifyException; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; /** * @author Moritz Becker (moritz.becker@gmx.at) * @since 1.2 */ public class AttributeFilterTest extends AbstractEntityViewTest { private PrimitiveDocument doc1; private PrimitiveDocument doc2; @Override protected Class<?>[] getEntityClasses() { return new Class<?>[]{ PrimitiveDocument.class, PrimitivePerson.class }; } @Override public void setUpOnce() { cleanDatabase(); transactional(new TxVoidWork() { @Override public void work(EntityManager em) { doc1 = new PrimitiveDocument("doc1"); doc2 = new PrimitiveDocument("doc2"); PrimitivePerson o1 = new PrimitivePerson("James"); PrimitivePerson o2 = new PrimitivePerson("Jack"); o1.setPartnerDocument(doc1); o2.setPartnerDocument(doc2); doc1.setOwner(o1); doc2.setOwner(o2); doc1.getContacts().put(1, o1); doc2.getContacts().put(1, o2); em.persist(o1); em.persist(o2); em.persist(doc1); em.persist(doc2); } }); } @Before public void setUp() { doc1 = cbf.create(em, PrimitiveDocument.class).where("name").eq("doc1").getSingleResult(); doc2 = cbf.create(em, PrimitiveDocument.class).where("name").eq("doc2").getSingleResult(); } @Test public void testMultipleDefaultFilters() { EntityViewConfiguration cfg = EntityViews.createDefaultConfiguration(); cfg.addEntityView(MultipleDefaultAttributeFiltersView.class); verifyException(cfg, IllegalArgumentException.class).createEntityViewManager(cbf); assertMessageContains("Illegal duplicate filter name mapping ''", caughtException()); } @Test public void testFilterNameClash() { EntityViewConfiguration cfg = EntityViews.createDefaultConfiguration(); cfg.addEntityView(AttributeFilterNameClashView.class); verifyException(cfg, IllegalArgumentException.class).createEntityViewManager(cbf); assertMessageContains("Illegal duplicate filter name mapping 'filter'", caughtException()); } @Test public void testMultipleActiveFilterPerAttribute() { EntityViewConfiguration cfg = EntityViews.createDefaultConfiguration(); cfg.addEntityView(AttributeFilterPrimitiveDocumentView.class); EntityViewManager evm = cfg.createEntityViewManager(cbf); EntityViewSetting<AttributeFilterPrimitiveDocumentView, CriteriaBuilder<AttributeFilterPrimitiveDocumentView>> setting = EntityViewSetting.create(AttributeFilterPrimitiveDocumentView.class); setting.addAttributeFilter("name", "pete"); IllegalArgumentException caughtException; try { setting.addAttributeFilter("name", "caseSensitiveNameFilter", "pete"); Assert.fail("Expected " + IllegalArgumentException.class.getName()); caughtException = null; } catch (IllegalArgumentException e) { caughtException = e; } assertMessageContains("At most one active attribute filter per attribute is allowed!", caughtException); } @Test public void testOverwriteDefaultAttributeFilterValue() { EntityViewConfiguration cfg = EntityViews.createDefaultConfiguration(); cfg.addEntityView(AttributeFilterPrimitiveDocumentView.class); EntityViewManager evm = cfg.createEntityViewManager(cbf); EntityViewSetting<AttributeFilterPrimitiveDocumentView, CriteriaBuilder<AttributeFilterPrimitiveDocumentView>> setting = EntityViewSetting.create(AttributeFilterPrimitiveDocumentView.class); setting.addAttributeFilter("name", "pete"); setting.addAttributeFilter("name", "pete2"); assertEquals("pete2", setting.getAttributeFilters().get("name").getFilterValue()); } @Test public void testOverwriteAttributeFilterValue() { EntityViewConfiguration cfg = EntityViews.createDefaultConfiguration(); cfg.addEntityView(AttributeFilterPrimitiveDocumentView.class); EntityViewManager evm = cfg.createEntityViewManager(cbf); EntityViewSetting<AttributeFilterPrimitiveDocumentView, CriteriaBuilder<AttributeFilterPrimitiveDocumentView>> setting = EntityViewSetting.create(AttributeFilterPrimitiveDocumentView.class); setting.addAttributeFilter("name", "caseSensitiveNameFilter", "pete"); setting.addAttributeFilter("name", "caseSensitiveNameFilter", "pete2"); assertEquals("pete2", setting.getAttributeFilters().get("name").getFilterValue()); } @Test public void testViewFilter() { EntityViewConfiguration cfg = EntityViews.createDefaultConfiguration(); cfg.addEntityView(ViewFilterPrimitiveDocumentView.class); EntityViewManager evm = cfg.createEntityViewManager(cbf); EntityViewSetting<ViewFilterPrimitiveDocumentView, CriteriaBuilder<ViewFilterPrimitiveDocumentView>> setting = EntityViewSetting.create(ViewFilterPrimitiveDocumentView.class); setting.addViewFilter("viewFilter1"); List<ViewFilterPrimitiveDocumentView> results = evm.applySetting(setting, cbf.create(em, PrimitiveDocument.class)).getResultList(); assertEquals(1, results.size()); assertEquals(Long.valueOf(doc1.getId()), results.get(0).getId()); } @Test public void testMultipleViewFilter() { EntityViewConfiguration cfg = EntityViews.createDefaultConfiguration(); cfg.addEntityView(ViewFilterPrimitiveDocumentView.class); EntityViewManager evm = cfg.createEntityViewManager(cbf); EntityViewSetting<ViewFilterPrimitiveDocumentView, CriteriaBuilder<ViewFilterPrimitiveDocumentView>> setting = EntityViewSetting.create(ViewFilterPrimitiveDocumentView.class); setting.addViewFilter("viewFilter1"); setting.addViewFilter("viewFilter2"); List<ViewFilterPrimitiveDocumentView> results = evm.applySetting(setting, cbf.create(em, PrimitiveDocument.class)).getResultList(); assertEquals(0, results.size()); } private void assertMessageContains(String expectedContainedMessage, Exception e) { assertTrue(e.getMessage().contains(expectedContainedMessage)); } }