/* * Copyright (c) 2011-2014 Jeppetto and Jonathan Thompson * * 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 org.iternine.jeppetto.dao.test.core; import org.iternine.jeppetto.dao.GenericDAO; import org.iternine.jeppetto.dao.JeppettoException; import org.iternine.jeppetto.dao.NoSuchItemException; import org.iternine.jeppetto.dao.test.RelatedObject; import org.iternine.jeppetto.dao.test.SimpleEnum; import org.iternine.jeppetto.dao.test.SimpleObject; import org.junit.After; import org.junit.Test; import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; public abstract class GenericDAOTest { //------------------------------------------------------------- // Methods - Abstract //------------------------------------------------------------- protected abstract GenericDAO<SimpleObject, String> getGenericDAO(); protected abstract void reset(); //------------------------------------------------------------- // Methods - Test Lifecycle //------------------------------------------------------------- @After public void after() { reset(); } //------------------------------------------------------------- // Methods - Test Cases //------------------------------------------------------------- @Test public void findById() throws NoSuchItemException { SimpleObject simpleObject = new SimpleObject(); getGenericDAO().save(simpleObject); SimpleObject resultObject = getGenericDAO().findById(simpleObject.getId()); assertEquals(resultObject.getId(), simpleObject.getId()); } @Test(expected = NoSuchItemException.class) public void findByBogusId() throws NoSuchItemException { getGenericDAO().findById("bogusId"); } @Test public void saveAndFindWithBasicFields() throws NoSuchItemException { SimpleObject simpleObject = new SimpleObject(); simpleObject.setIntValue(5); simpleObject.setLongValue(100l); simpleObject.setSimpleEnum(SimpleEnum.EnumValue); getGenericDAO().save(simpleObject); SimpleObject resultObject = getGenericDAO().findById(simpleObject.getId()); assertEquals(resultObject.getId(), simpleObject.getId()); assertEquals(5, resultObject.getIntValue()); assertEquals(100l, resultObject.getLongValue()); assertEquals(SimpleEnum.EnumValue, resultObject.getSimpleEnum()); } @Test public void saveAndUpdateBasicFields() throws NoSuchItemException { SimpleObject simpleObject = new SimpleObject(); simpleObject.setIntValue(5); simpleObject.setLongValue(100l); simpleObject.setSimpleEnum(SimpleEnum.EnumValue); getGenericDAO().save(simpleObject); SimpleObject resultObject = getGenericDAO().findById(simpleObject.getId()); resultObject.setIntValue(10); getGenericDAO().save(resultObject); resultObject = getGenericDAO().findById(simpleObject.getId()); assertEquals(resultObject.getId(), simpleObject.getId()); assertEquals(10, resultObject.getIntValue()); assertEquals(100l, resultObject.getLongValue()); assertEquals(SimpleEnum.EnumValue, resultObject.getSimpleEnum()); } @Test public void saveAndFindWithStringList() throws NoSuchItemException { SimpleObject simpleObject = new SimpleObject(); simpleObject.setStringList(new ArrayList<String>()); simpleObject.getStringList().add("foo"); simpleObject.getStringList().add("bar"); simpleObject.getStringList().add("bar"); getGenericDAO().save(simpleObject); SimpleObject resultObject = getGenericDAO().findById(simpleObject.getId()); assertNotNull(resultObject.getStringList()); assertEquals(3, resultObject.getStringList().size()); assertEquals("foo", resultObject.getStringList().get(0)); assertEquals("bar", resultObject.getStringList().get(1)); assertEquals("bar", resultObject.getStringList().get(2)); } @Test public void saveAndFindWithStringSet() throws NoSuchItemException { SimpleObject simpleObject = new SimpleObject(); simpleObject.setStringSet(new HashSet<String>()); simpleObject.getStringSet().add("foo"); simpleObject.getStringSet().add("bar"); simpleObject.getStringSet().add("bar"); getGenericDAO().save(simpleObject); SimpleObject resultObject = getGenericDAO().findById(simpleObject.getId()); assertNotNull(resultObject.getStringSet()); assertEquals(2, resultObject.getStringSet().size()); assertTrue(resultObject.getStringSet().contains("foo")); assertTrue(resultObject.getStringSet().contains("bar")); } @Test public void saveAndFindWithStringMap() throws NoSuchItemException { SimpleObject simpleObject = new SimpleObject(); simpleObject.setStringMap(new HashMap<String, String>()); simpleObject.getStringMap().put("foo", "bar"); getGenericDAO().save(simpleObject); SimpleObject resultObject = getGenericDAO().findById(simpleObject.getId()); assertNotNull(resultObject.getStringMap()); assertEquals("bar", resultObject.getStringMap().get("foo")); } @Test public void saveAndFindComplexObject() throws NoSuchItemException { SimpleObject simpleObject = new SimpleObject(); simpleObject.setIntValue(1234); RelatedObject relatedObject = new RelatedObject(); relatedObject.setRelatedIntValue(5678); simpleObject.setRelatedObject(relatedObject); simpleObject.addRelatedObject(relatedObject); simpleObject.addRelatedObject("foo", relatedObject); simpleObject.addRelatedObject("bar", relatedObject); getGenericDAO().save(simpleObject); SimpleObject resultObject = getGenericDAO().findById(simpleObject.getId()); assertEquals(resultObject.getId(), simpleObject.getId()); RelatedObject[] objects = resultObject.getRelatedObjects().toArray(new RelatedObject[1]); assertEquals(relatedObject.getRelatedIntValue(), objects[0].getRelatedIntValue()); assertEquals(relatedObject.getRelatedIntValue(), resultObject.getRelatedObject().getRelatedIntValue()); assertTrue(simpleObject.getRelatedObjectMap().containsKey("foo")); assertTrue(simpleObject.getRelatedObjectMap().containsKey("bar")); assertEquals(simpleObject.getRelatedObjectMap().get("foo").getRelatedIntValue(), simpleObject.getRelatedObjectMap().get("bar").getRelatedIntValue()); } @Test public void addToListAcrossSaves() { SimpleObject simpleObject = new SimpleObject(); simpleObject.setId("id"); simpleObject.setRelatedObjects(new ArrayList<RelatedObject>()); RelatedObject relatedObject1 = new RelatedObject(); relatedObject1.setRelatedIntValue(123); RelatedObject relatedObject2 = new RelatedObject(); relatedObject2.setRelatedIntValue(345); simpleObject.addRelatedObject(relatedObject1); getGenericDAO().save(simpleObject); SimpleObject result1 = getGenericDAO().findById("id"); result1.addRelatedObject(relatedObject2); getGenericDAO().save(result1); SimpleObject result2 = getGenericDAO().findById("id"); result2.addRelatedObject(relatedObject2); getGenericDAO().save(result2); SimpleObject finalResult= getGenericDAO().findById("id"); assertEquals(3, finalResult.getRelatedObjects().size()); assertEquals(123, finalResult.getRelatedObjects().get(0).getRelatedIntValue()); assertEquals(345, finalResult.getRelatedObjects().get(1).getRelatedIntValue()); assertEquals(345, finalResult.getRelatedObjects().get(2).getRelatedIntValue()); } @Test public void addToListUsingIndexAcrossSaves() { SimpleObject simpleObject = new SimpleObject(); simpleObject.setId("id"); simpleObject.setRelatedObjects(new ArrayList<RelatedObject>()); RelatedObject relatedObject1 = new RelatedObject(); relatedObject1.setRelatedIntValue(123); RelatedObject relatedObject2 = new RelatedObject(); relatedObject2.setRelatedIntValue(345); simpleObject.addRelatedObject(relatedObject1); getGenericDAO().save(simpleObject); SimpleObject result1 = getGenericDAO().findById("id"); result1.getRelatedObjects().add(0, relatedObject2); getGenericDAO().save(result1); SimpleObject finalResult= getGenericDAO().findById("id"); assertEquals(2, finalResult.getRelatedObjects().size()); assertEquals(345, finalResult.getRelatedObjects().get(0).getRelatedIntValue()); assertEquals(123, finalResult.getRelatedObjects().get(1).getRelatedIntValue()); } @Test public void addToMapAcrossSaves() { SimpleObject simpleObject = new SimpleObject(); simpleObject.setId("id"); simpleObject.setRelatedObjectMap(new HashMap<String, RelatedObject>()); RelatedObject relatedObject1 = new RelatedObject(); relatedObject1.setRelatedIntValue(123); RelatedObject relatedObject2 = new RelatedObject(); relatedObject2.setRelatedIntValue(345); simpleObject.getRelatedObjectMap().put("first", relatedObject1); getGenericDAO().save(simpleObject); SimpleObject result1 = getGenericDAO().findById("id"); result1.getRelatedObjectMap().put("second", relatedObject2); getGenericDAO().save(result1); SimpleObject result2 = getGenericDAO().findById("id"); result2.getRelatedObjectMap().put("third", relatedObject2); getGenericDAO().save(result2); SimpleObject finalResult= getGenericDAO().findById("id"); assertEquals(123, finalResult.getRelatedObjectMap().get("first").getRelatedIntValue()); assertEquals(345, finalResult.getRelatedObjectMap().get("second").getRelatedIntValue()); assertEquals(345, finalResult.getRelatedObjectMap().get("third").getRelatedIntValue()); } @Test public void saveAndUpdateComplexObject() throws NoSuchItemException { SimpleObject simpleObject = new SimpleObject(); simpleObject.setIntValue(1234); RelatedObject relatedObject = new RelatedObject(); relatedObject.setRelatedIntValue(5678); simpleObject.setRelatedObject(relatedObject); getGenericDAO().save(simpleObject); SimpleObject resultObject = getGenericDAO().findById(simpleObject.getId()); resultObject.getRelatedObject().setRelatedIntValue(1111); getGenericDAO().save(resultObject); resultObject = getGenericDAO().findById(simpleObject.getId()); assertEquals(resultObject.getId(), simpleObject.getId()); assertEquals(1111, resultObject.getRelatedObject().getRelatedIntValue()); } @Test(expected = NoSuchItemException.class) public void saveAndDelete() throws NoSuchItemException { SimpleObject simpleObject = new SimpleObject(); simpleObject.setIntValue(1234); getGenericDAO().save(simpleObject); SimpleObject resultObject = getGenericDAO().findById(simpleObject.getId()); assertEquals(resultObject.getId(), simpleObject.getId()); getGenericDAO().delete(simpleObject); getGenericDAO().findById(simpleObject.getId()); } @Test public void saveMultipleAndFindAll() throws NoSuchItemException { SimpleObject simpleObject = new SimpleObject(); simpleObject.setIntValue(1234); getGenericDAO().save(simpleObject); SimpleObject simpleObject2 = new SimpleObject(); simpleObject2.setIntValue(5678); getGenericDAO().save(simpleObject2); Iterable<SimpleObject> results = getGenericDAO().findAll(); int resultCount = 0; // noinspection UnusedDeclaration for (SimpleObject ignore : results) { resultCount++; } assertTrue(resultCount == 2); // check for existence of objects? } @Test public void transientValuesAreNotPersisted() throws NoSuchItemException { SimpleObject simpleObject = new SimpleObject(); simpleObject.setIntValue(5); simpleObject.setTransientValue(10); getGenericDAO().save(simpleObject); SimpleObject resultObject = getGenericDAO().findById(simpleObject.getId()); assertEquals(resultObject.getId(), simpleObject.getId()); assertEquals(5, resultObject.getIntValue()); assertEquals(0, resultObject.getTransientValue()); } @Test(expected = JeppettoException.class) public void idReuseShouldFail() { SimpleObject simpleObject1 = new SimpleObject(); simpleObject1.setId("a"); simpleObject1.setIntValue(-1); getGenericDAO().save(simpleObject1); SimpleObject simpleObject2 = new SimpleObject(); simpleObject2.setId("a"); simpleObject2.setIntValue(3); getGenericDAO().save(simpleObject2); } @Test(expected = JeppettoException.class) public void uniqueConstraintCausesException() { SimpleObject simpleObject1 = new SimpleObject(); simpleObject1.setIntValue(123); getGenericDAO().save(simpleObject1); SimpleObject simpleObject2 = new SimpleObject(); simpleObject2.setIntValue(123); getGenericDAO().save(simpleObject2); } }