/jeppetto-dao-mongo/src/test/java/org/iternine/jeppetto/dao/mongodb/MongoDAOTest.java

https://github.com/jeppetto/jeppetto · Java · 253 lines · 152 code · 76 blank · 25 comment · 2 complexity · 0a0f82d981b841fdc10ef005381efdf7 MD5 · raw file

  1. /*
  2. * Copyright (c) 2011-2017 Jeppetto and Jonathan Thompson
  3. *
  4. * Licensed under the Apache License, Version 2.0 (the "License");
  5. * you may not use this file except in compliance with the License.
  6. * You may obtain a copy of the License at
  7. *
  8. * http://www.apache.org/licenses/LICENSE-2.0
  9. *
  10. * Unless required by applicable law or agreed to in writing, software
  11. * distributed under the License is distributed on an "AS IS" BASIS,
  12. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13. * See the License for the specific language governing permissions and
  14. * limitations under the License.
  15. */
  16. package org.iternine.jeppetto.dao.mongodb;
  17. import org.iternine.jeppetto.dao.GenericDAO;
  18. import org.iternine.jeppetto.dao.NoSuchItemException;
  19. import org.iternine.jeppetto.dao.mongodb.enhance.DirtyableDBObject;
  20. import org.iternine.jeppetto.dao.test.RelatedObject;
  21. import org.iternine.jeppetto.dao.test.SimpleEnum;
  22. import org.iternine.jeppetto.dao.test.SimpleObject;
  23. import org.iternine.jeppetto.testsupport.MongoDatabaseProvider;
  24. import org.iternine.jeppetto.testsupport.TestContext;
  25. import com.mongodb.DBObject;
  26. import org.bson.types.ObjectId;
  27. import org.junit.After;
  28. import org.junit.Before;
  29. import org.junit.Test;
  30. import java.util.Collections;
  31. import java.util.HashMap;
  32. import java.util.HashSet;
  33. import java.util.Set;
  34. import static org.junit.Assert.assertEquals;
  35. import static org.junit.Assert.assertFalse;
  36. import static org.junit.Assert.assertNotNull;
  37. import static org.junit.Assert.assertTrue;
  38. public class MongoDAOTest {
  39. //-------------------------------------------------------------
  40. // Variables - Private
  41. //-------------------------------------------------------------
  42. private TestContext testContext;
  43. private GenericDAO<SimpleObject, String> simpleObjectDAO;
  44. //-------------------------------------------------------------
  45. // Methods - Set-Up / Tear-Down
  46. //-------------------------------------------------------------
  47. @Before
  48. public void setUp() {
  49. testContext = new TestContext("MongoGenericDAOTest.spring.xml",
  50. "MongoDAOTest.properties",
  51. new MongoDatabaseProvider());
  52. //noinspection unchecked
  53. simpleObjectDAO = (GenericDAO<SimpleObject, String>) testContext.getBean("mongoGenericDAO");
  54. }
  55. @After
  56. public void tearDown() {
  57. if (testContext != null) {
  58. testContext.close();
  59. }
  60. }
  61. //-------------------------------------------------------------
  62. // Methods - Test Cases
  63. //-------------------------------------------------------------
  64. @Test
  65. public void saveAndFindById()
  66. throws NoSuchItemException {
  67. SimpleObject simpleObject = new SimpleObject();
  68. simpleObject.setIntValue(1234);
  69. simpleObjectDAO.save(simpleObject);
  70. assertNotNull(simpleObject.getId());
  71. SimpleObject resultObject = simpleObjectDAO.findById(simpleObject.getId());
  72. assertEquals(resultObject.getId(), simpleObject.getId());
  73. assertDirty(resultObject, false);
  74. resultObject.setIntValue(4321);
  75. assertDirty(resultObject, true);
  76. }
  77. @Test
  78. public void fieldChangesAreDirty()
  79. throws NoSuchItemException {
  80. SimpleObject simpleObject = new SimpleObject();
  81. simpleObject.setIntValue(1234);
  82. simpleObjectDAO.save(simpleObject);
  83. SimpleObject resultObject;
  84. resultObject = simpleObjectDAO.findById(simpleObject.getId());
  85. assertDirty(resultObject, false);
  86. assertEquals(1234, resultObject.getIntValue());
  87. resultObject.setSimpleEnum(SimpleEnum.EnumValue);
  88. assertDirty(resultObject, true);
  89. simpleObjectDAO.save(resultObject);
  90. assertDirty(resultObject, false);
  91. resultObject = simpleObjectDAO.findById(simpleObject.getId());
  92. assertDirty(resultObject, false);
  93. assertEquals(1234, resultObject.getIntValue());
  94. assertEquals(SimpleEnum.EnumValue, resultObject.getSimpleEnum());
  95. resultObject.setIntValue(9876);
  96. assertDirty(resultObject, true);
  97. simpleObjectDAO.save(resultObject);
  98. assertDirty(resultObject, false);
  99. resultObject = simpleObjectDAO.findById(simpleObject.getId());
  100. assertDirty(resultObject, false);
  101. assertEquals(9876, resultObject.getIntValue());
  102. }
  103. @Test
  104. public void mapChangesAreDirty()
  105. throws NoSuchItemException {
  106. RelatedObject relatedObject = new RelatedObject();
  107. relatedObject.setRelatedIntValue(5678);
  108. SimpleObject simpleObject = new SimpleObject();
  109. simpleObject.setIntValue(1234);
  110. simpleObject.setStringMap(new HashMap<String, String>());
  111. simpleObject.getStringMap().put("foo", "bar");
  112. simpleObject.setRelatedObjectMap(new HashMap<String, RelatedObject>());
  113. simpleObject.getRelatedObjectMap().put("foo", relatedObject);
  114. simpleObjectDAO.save(simpleObject);
  115. SimpleObject resultObject;
  116. resultObject = simpleObjectDAO.findById(simpleObject.getId());
  117. assertEquals("bar", resultObject.getStringMap().get("foo"));
  118. assertDirty(resultObject, false);
  119. resultObject.getStringMap().put("baz", "bat");
  120. assertDirty(resultObject, true);
  121. simpleObjectDAO.save(resultObject);
  122. resultObject = simpleObjectDAO.findById(simpleObject.getId());
  123. assertEquals("bar", resultObject.getStringMap().get("foo"));
  124. assertEquals("bat", resultObject.getStringMap().get("baz"));
  125. assertDirty(resultObject, false);
  126. resultObject.getStringMap().putAll(new HashMap<String, String>());
  127. assertDirty(resultObject, false);
  128. resultObject.getRelatedObjectMap().put("baz", relatedObject);
  129. assertDirty(resultObject, true);
  130. resultObject.addToRelatedObjectSet(new RelatedObject());
  131. resultObject.addToRelatedObjectSet(new RelatedObject());
  132. simpleObjectDAO.save(resultObject);
  133. resultObject = simpleObjectDAO.findById(simpleObject.getId());
  134. assertEquals(5678, resultObject.getRelatedObjectMap().get("baz").getRelatedIntValue());
  135. }
  136. @Test
  137. public void objectIsWellBehavedDBObject()
  138. throws NoSuchItemException {
  139. SimpleObject pojo = new SimpleObject();
  140. pojo.setIntValue(1234);
  141. pojo.setSimpleEnum(SimpleEnum.EnumValue);
  142. simpleObjectDAO.save(pojo);
  143. pojo = simpleObjectDAO.findById(pojo.getId());
  144. DBObject dbo = (DBObject) pojo;
  145. assertEquals(pojo.getId(), dbo.get("_id").toString());
  146. assertEquals("EnumValue", dbo.get("simpleEnum"));
  147. Set<String> knownFields = new HashSet<String>();
  148. Collections.addAll(knownFields, "_id",
  149. "testBoolean",
  150. "__olv",
  151. "stringMap",
  152. "relatedObjects",
  153. "relatedObject",
  154. "relatedObjectMap",
  155. "relatedObjectSet",
  156. "stringList",
  157. "stringMap",
  158. "stringSet",
  159. "simpleEnum",
  160. "bytes",
  161. "intValue",
  162. "longValue",
  163. "doubleValue",
  164. "stringValue",
  165. "anotherIntValue");
  166. assertEquals(knownFields, dbo.keySet());
  167. ObjectId newId = ObjectId.get();
  168. dbo.put("_id", newId);
  169. assertEquals(newId, dbo.get("_id"));
  170. assertEquals("EnumValue", dbo.removeField("simpleEnum"));
  171. assertFalse(dbo.keySet().contains("simpleEnum"));
  172. }
  173. private void assertDirty(Object obj, boolean dirty) {
  174. assertTrue(obj instanceof DirtyableDBObject);
  175. assertEquals(dirty, ((DirtyableDBObject) obj).isDirty());
  176. }
  177. }