/* * JBoss, Home of Professional Open Source. * Copyright 2008, Red Hat Middleware LLC, and individual contributors * as indicated by the @author tags. See the copyright.txt file in the * distribution for a full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.test.cmp2.ejbselect; import java.util.Collection; import java.util.Iterator; import java.util.Properties; import javax.ejb.FinderException; import junit.framework.Test; import org.jboss.test.JBossTestCase; import org.jboss.test.util.ejb.EJBTestCase; /** * @author others + <a href="mailto:alex@jboss.org">Alex Loubyansky</a> */ public class EJBSelectUnitTestCase extends EJBTestCase { static org.jboss.logging.Logger log = org.jboss.logging.Logger.getLogger(EJBSelectUnitTestCase.class); public static Test suite() throws Exception { return JBossTestCase.getDeploySetup(EJBSelectUnitTestCase.class, "cmp2-ejbselect.jar"); } public EJBSelectUnitTestCase(String name) { super(name); } private ALocal a1; private ALocal a2; private BLocal b1; private BLocal b2; private BLocal b3; private BLocal b4; public void setUpEJB(Properties props) throws Exception { ALocalHome ahome = AUtil.getLocalHome(); BLocalHome bhome = BUtil.getLocalHome(); a1 = ahome.create("A1"); a1.setIntField(3); Collection bs = a1.getBs(); b1 = bhome.create("B1", "Alice", true); bs.add(b1); b2 = bhome.create("B2", "Bob", true); bs.add(b2); b3 = bhome.create("B3", "Charlie", false); bs.add(b3); b4 = bhome.create("B4", "Dan", false); bs.add(b4); a2 = ahome.create("A2"); a2.setIntField(9); } public void tearDownEJB(Properties props) throws Exception { a1.remove(); a2.remove(); } public void testReturnedInterface() throws Exception { Iterator i = a1.getSomeBs().iterator(); while(i.hasNext()) { Object obj = i.next(); assertTrue(obj instanceof BLocal); BLocal b = (BLocal)obj; b.getName(); } i = a1.getSomeBs().iterator(); while(i.hasNext()) { Object obj = i.next(); assertTrue(obj instanceof BLocal); BLocal b = (BLocal)obj; b.getName(); } } public void testEJBSelectFromEJBHomeMethod() throws Exception { ALocalHome ahome = AUtil.getLocalHome(); Collection results = ahome.getSomeBs(a1); for(Iterator iterator = results.iterator(); iterator.hasNext();) { Object obj = iterator.next(); assertTrue(obj instanceof BLocal); BLocal b = (BLocal)obj; b.getName(); } assertTrue(results.contains(b1)); assertTrue(results.contains(b2)); assertTrue(results.contains(b3)); assertTrue(results.contains(b4)); assertEquals(4, results.size()); } public void testCheckFinderForNullInEJBSELECT() throws Exception { ALocalHome ahome = AUtil.getLocalHome(); try { ahome.checkFinderForNull(); fail("Should not be here"); } catch (FinderException expected) { log.debug("Got expected error", expected); } } public void testGetSomeBxDeclaredSQL() throws Exception { ALocalHome ahome = AUtil.getLocalHome(); Collection results = ahome.getSomeBsDeclaredSQL(a1); for(Iterator iterator = results.iterator(); iterator.hasNext();) { Object obj = iterator.next(); assertTrue(obj instanceof BLocal); BLocal b = (BLocal)obj; b.getName(); } assertTrue(results.contains(b1)); assertTrue(results.contains(b2)); assertTrue(results.contains(b3)); assertTrue(results.contains(b4)); assertEquals(4, results.size()); } public void testGetTrue() throws Exception { Collection bs = b1.getTrue(); assertEquals(2, bs.size()); assertTrue(bs.contains(b1)); assertTrue(bs.contains(b2)); assertTrue(!bs.contains(b3)); assertTrue(!bs.contains(b4)); Iterator i = bs.iterator(); while(i.hasNext()) { BLocal b = (BLocal)i.next(); assertTrue(b.getBool()); } } public void testGetFalse() throws Exception { Collection bs = b1.getFalse(); assertEquals(2, bs.size()); assertTrue(!bs.contains(b1)); assertTrue(!bs.contains(b2)); assertTrue(bs.contains(b3)); assertTrue(bs.contains(b4)); Iterator i = bs.iterator(); while(i.hasNext()) { BLocal b = (BLocal)i.next(); assertTrue(!b.getBool()); } } public void testGetAWithBs() throws Exception { Collection as = a1.getAWithBs(); assertEquals(1, as.size()); assertTrue(as.contains(a1)); assertTrue(!as.contains(a2)); Iterator i = as.iterator(); while(i.hasNext()) { ALocal a = (ALocal)i.next(); assertTrue(!a.getBs().isEmpty()); } } // SQL funsctions in SELECT clause public void testCountInSelectClause() throws Exception { Collection result = BUtil.getLocalHome().selectDynamic( "SELECT COUNT(b.id) FROM B AS b", new Object[]{} ); assertTrue("COUNT(b.id) = 4", ((Long)result.iterator().next()).longValue() == 4); } public void testMaxInSelectClause() throws Exception { Collection result = BUtil.getLocalHome().selectDynamic( "SELECT MAX(a.intField) FROM A AS a", new Object[]{} ); assertTrue("MAX(a.id) = 9", ((Double)result.iterator().next()).doubleValue() == 9.0); } public void testMinInSelectClause() throws Exception { Collection result = BUtil.getLocalHome().selectDynamic( "SELECT MIN(a.intField) FROM A AS a", new Object[]{} ); assertTrue("MIN(a.id) = 3", ((Double)result.iterator().next()).doubleValue() == 3.0); } public void testSumInSelectClause() throws Exception { Collection result = BUtil.getLocalHome().selectDynamic( "SELECT SUM(a.intField) FROM A AS a", new Object[]{} ); assertTrue("SUM(a.id) = 12", ((Double)result.iterator().next()).doubleValue() == 12.0); } public void testAvgInSelectClause() throws Exception { Collection result = BUtil.getLocalHome().selectDynamic( "SELECT AVG(a.intField) FROM A AS a", new Object[]{} ); assertTrue("AVG(a.id) = 6", ((Double)result.iterator().next()).doubleValue() == 6.0); } public void testSqrtInSelectClause() throws Exception { String pk = "B1"; BLocal b = BUtil.getLocalHome().findByPrimaryKey(pk); b.setLongField(64); Collection result = BUtil.getLocalHome().selectDynamic( "SELECT SQRT(b.longField) FROM B AS b WHERE b.id = ?1", new Object[]{pk} ); assertTrue("SQRT(b.longField) = 8", ((Double)result.iterator().next()).doubleValue() == 8.0); } /* HSQL has problems with returning ABS? (returns null) public void testAbsInSelectClause() throws Exception { String pk = "B1"; BLocal b = BUtil.getLocalHome().findByPrimaryKey(pk); b.setLongField(-5); Collection result = BUtil.getLocalHome().selectDynamic( "SELECT ABS(b.longField) FROM B AS b WHERE b.id = ?1", new Object[]{pk} ); assertTrue("ABS(b.longField) = 5", ((Long)result.iterator().next()).longValue() == 5); } */ public void testLcaseInSelectClause() throws Exception { Collection result = BUtil.getLocalHome().selectDynamic( "SELECT LCASE(b.name) FROM B AS b WHERE b.id = ?1", new Object[]{"B1"} ); assertTrue("LCASE(b.name) = alice", "alice".equals(result.iterator().next())); } public void testUcaseInSelectClause() throws Exception { Collection result = BUtil.getLocalHome().selectDynamic( "SELECT UCASE(b.name) FROM B AS b", new Object[]{} ); assertTrue("result.size() == 4", result.size() == 4); assertTrue("result.contains('ALICE')", result.contains("ALICE")); assertTrue("result.contains('BOB')", result.contains("BOB")); assertTrue("result.contains('CHARLIE')", result.contains("CHARLIE")); assertTrue("result.contains('DAN')", result.contains("DAN")); } public void testLengthInSelectClause() throws Exception { Collection result = BUtil.getLocalHome().selectDynamic( "SELECT LENGTH(b.name) FROM B AS b WHERE b.id = ?1", new Object[]{"B1"} ); assertTrue("LENGTH(b.name) = 5", ((Long)result.iterator().next()).longValue() == 5); } public void testConcatInSelectClause() throws Exception { Collection result = BUtil.getLocalHome().selectDynamic( "SELECT CONCAT('Dear ', b.name) FROM B AS b WHERE b.id = ?1", new Object[]{"B1"} ); assertTrue("CONCAT('Dear ', b.name) = Dear Alice", "Dear Alice".equals(result.iterator().next())); } public void testLocateInSelectClause() throws Exception { Collection result = BUtil.getLocalHome().selectDynamic( "SELECT LOCATE('ice', b.name, 1) FROM B AS b WHERE b.id = ?1", new Object[]{"B1"} ); assertTrue("LOCATE('ice', b.name, 1) = 3", ((Long)result.iterator().next()).longValue() == 3); } public void testSubstringInSelectClause() throws Exception { Collection result = BUtil.getLocalHome().selectDynamic( "SELECT SUBSTRING(b.name, 3, 5) FROM B AS b WHERE b.id = ?1", new Object[]{"B1"} ); assertTrue("SUBSTRING(b.name, 3, 5) = ice", "ice".equals(result.iterator().next())); } public void testNestedFunctionsInSelectClause() throws Exception { Collection result = BUtil.getLocalHome().selectDynamic( "SELECT UCASE(SUBSTRING(CONCAT(b.id, b.name), 5, 7)) FROM B AS b WHERE b.id = ?1", new Object[]{"B1"} ); assertTrue("UCASE(SUBSTRING(CONCAT(b.id, b.name), 5, 7)) = ICE", "ICE".equals(result.iterator().next())); } public void testLimit() throws Exception { Collection col = BUtil.getLocalHome().selectDynamic("select object(b) from B b where b.id is not null order by b.id desc limit 1", null); assertEquals(1, col.size()); BLocal b = (BLocal)col.iterator().next(); assertEquals("B4", b.getId()); } public void testOffset() throws Exception { Collection col = BUtil.getLocalHome().selectDynamic("select object(b) from B b where b.id is not null order by b.id offset 1", null); assertEquals(3, col.size()); Iterator iter = col.iterator(); int i = 2; while(iter.hasNext()) { BLocal b = (BLocal)iter.next(); assertEquals("B" + i++, b.getId()); } } public void testOffsetLimit() throws Exception { Collection col = BUtil.getLocalHome().selectDynamic("select object(b) from B b where b.id is not null order by b.id offset 1 limit 2", null); assertEquals(2, col.size()); Iterator iter = col.iterator(); int i = 2; while(iter.hasNext()) { BLocal b = (BLocal)iter.next(); assertEquals("B" + i++, b.getId()); } } public void testMemberOf() throws Exception { Collection col = AUtil.getLocalHome().selectDynamic( "select distinct object(a) from A a, B b1, B b2 where b1.name=?1 and b2.name=?2 and b1 member of a.bs and b2 member of a.bs", new String[]{"Alice", "Bob"}); assertEquals(1, col.size()); ALocal a = (ALocal)col.iterator().next(); assertNotNull(a); assertEquals("A1", a.getId()); } }