/domain/domain-ts/src/test/java/com/thoriumsoft/domain/model/ModelTestsSupport.java

https://bitbucket.org/leemur/logistica · Java · 354 lines · 199 code · 91 blank · 64 comment · 0 complexity · 9f34a7634567ff9c122fbc676a22a779 MD5 · raw file

  1. package com.thoriumsoft.domain.model;
  2. import com.google.common.collect.ImmutableMap;
  3. import com.google.common.collect.Sets;
  4. import com.thoriumsoft.domain.DomainTestsSupport;
  5. import com.thoriumsoft.domain.model.annotations.Model;
  6. import com.thoriumsoft.domain.services.*;
  7. import org.springframework.beans.factory.annotation.Autowired;
  8. import org.testng.annotations.Test;
  9. import java.util.Map;
  10. import java.util.Set;
  11. import java.util.concurrent.atomic.AtomicInteger;
  12. import static com.thoriumsoft.test.TsTestGroups.COMMIT;
  13. import static org.testng.Assert.assertEquals;
  14. import static org.testng.AssertJUnit.fail;
  15. /**
  16. * @author Andrey Naumenko
  17. * @version $Revision: 5276 $ $Date: 2011-04-19 15:25:02 +0300 (Tue, 19 Apr 2011) $
  18. */
  19. @Test(groups = COMMIT)
  20. public class ModelTestsSupport extends DomainTestsSupport {
  21. private final AtomicInteger counter = new AtomicInteger();
  22. @Autowired
  23. private RegionService regionService;
  24. @Autowired
  25. @Model(Language.class)
  26. private TsEntityService<Language> languagesService;
  27. @Autowired
  28. @Model(Country.class)
  29. private TsEntityService<Country> countriesService;
  30. @Autowired
  31. @Model(CurrencyInfo.class)
  32. private TsEntityService<CurrencyInfo> currencyService;
  33. protected Region newStoredRegion() {
  34. return regionService.getRegion();
  35. }
  36. private final AtomicInteger lCounter = new AtomicInteger();
  37. protected Language newStoredLanguage() {
  38. final Language lang = new Language("L" + lCounter.getAndIncrement());
  39. lang.setName("new language" + counter.getAndIncrement());
  40. languagesService.save(lang);
  41. return reload(lang);
  42. }
  43. private final AtomicInteger cCounter = new AtomicInteger();
  44. protected Country newStoredCountry() {
  45. final Country country = new Country("C" + cCounter.getAndIncrement());
  46. country.setName("new country" + counter.getAndIncrement());
  47. countriesService.save(country);
  48. return reload(country);
  49. }
  50. /**
  51. * @author Andrey Naumenko
  52. * @version $Revision: 5276 $ $Date: 2011-04-19 15:25:02 +0300 (Tue, 19 Apr 2011) $
  53. */
  54. protected abstract class SimpleUnidirectionalSetTestsHelper<P extends TsObject, C extends TsObject> {
  55. public void testSet() {
  56. //initialize Entities
  57. final P p = newParent();
  58. try {
  59. getChildren(p).clear();
  60. fail("Collection must be unmodifiable");
  61. } catch (Exception e) {
  62. //collection is unmodifiable.
  63. }
  64. final C c_1 = newChild();
  65. final C c_2 = newChild();
  66. doSet(p, Sets.newHashSet(c_1, c_2));
  67. //check in-memory model
  68. assertEquals(getChildren(p).size(), 2);
  69. //read persisted state into different objects
  70. final P reloaded = reload(p);
  71. //now validate that 'set' operation persists association
  72. assertEquals(getChildren(reloaded).size(), 2);
  73. //change association elements
  74. doSet(reloaded, Sets.newHashSet(c_1));
  75. //check in-memory model
  76. assertEquals(getChildren(reloaded).size(), 1);
  77. //now validate that 'setPixels' remove pixels from database
  78. assertEquals(getChildren(reload(reloaded)).size(), 1);
  79. }
  80. protected abstract P newParent();
  81. protected abstract C newChild();
  82. protected abstract Set<? extends C> getChildren(final P p);
  83. protected abstract void doSet(final P p, final Set<? extends C> cs);
  84. }
  85. /**
  86. * @author Andrey Naumenko
  87. * @version $Revision: 5276 $ $Date: 2011-04-19 15:25:02 +0300 (Tue, 19 Apr 2011) $
  88. */
  89. protected abstract class SimpleManyToManyTestsHelper<P extends TsObject, C extends TsObject> {
  90. public void testSet() {
  91. //initialize Entities
  92. final P p = newParent();
  93. try {
  94. getChildren(p).clear();
  95. fail("Collection must be unmodifiable");
  96. } catch (Exception e) {
  97. //collection is unmodifiable.
  98. }
  99. final C c_1 = newChild();
  100. try {
  101. getParent(c_1).clear();
  102. fail("Collection must be unmodifiable");
  103. } catch (Exception e) {
  104. //collection is unmodifiable.
  105. }
  106. final C c_2 = newChild();
  107. try {
  108. getParent(c_2).clear();
  109. fail("Collection must be unmodifiable");
  110. } catch (Exception e) {
  111. //collection is unmodifiable.
  112. }
  113. doSet(p, Sets.newHashSet(c_1, c_2));
  114. //check in-memory model
  115. assertEquals(getChildren(p).size(), 2);
  116. assertEquals(getParent(c_1).size(), 1);
  117. assertEquals(getParent(c_2).size(), 1);
  118. //read persisted state into different objects
  119. final P reloaded = reload(p);
  120. //now validate that 'set' operation persists association
  121. assertEquals(getChildren(reloaded).size(), 2);
  122. //change association elements
  123. doSet(reloaded, Sets.newHashSet(c_1));
  124. //check in-memory model
  125. assertEquals(getChildren(reloaded).size(), 1);
  126. assertEquals(getParent(c_1).size(), 1);
  127. assertEquals(getParent(c_2).size(), 0);
  128. //now validate that 'setPixels' remove pixels from database
  129. assertEquals(getChildren(reload(reloaded)).size(), 1);
  130. assertEquals(getParent(reload(c_1)).size(), 1);
  131. assertEquals(getParent(reload(c_2)).size(), 0);
  132. }
  133. protected abstract P newParent();
  134. protected abstract C newChild();
  135. protected abstract Set<? extends P> getParent(final C c);
  136. protected abstract Set<? extends C> getChildren(final P p);
  137. protected abstract void doSet(final P p, final Set<? extends C> cs);
  138. }
  139. /**
  140. * @author Andrey Naumenko
  141. * @version $Revision: 5276 $ $Date: 2011-04-19 15:25:02 +0300 (Tue, 19 Apr 2011) $
  142. */
  143. protected abstract class ManyToManyTestsHelper<P extends TsObject, C extends TsObject> extends SimpleManyToManyTestsHelper<P, C> {
  144. public void testRemove() {
  145. //initialize Entities
  146. final P p = newParent();
  147. final C c_1 = newChild();
  148. final C c_2 = newChild();
  149. doSet(p, Sets.newHashSet(c_1, c_2));
  150. //check in-memory model
  151. assertEquals(getChildren(p).size(), 2);
  152. assertEquals(getParent(c_1).size(), 1);
  153. assertEquals(getParent(c_2).size(), 1);
  154. //read persisted state into different objects
  155. final P reloaded = reload(p);
  156. //now validate that 'set' operation persists association
  157. assertEquals(getChildren(reloaded).size(), 2);
  158. //change association elements
  159. doRemove(reloaded, c_2);
  160. //check in-memory model
  161. assertEquals(getChildren(reloaded).size(), 1);
  162. assertEquals(getParent(c_1).size(), 1);
  163. assertEquals(getParent(c_2).size(), 0);
  164. //now validate that 'setPixels' remove pixels from database
  165. assertEquals(getChildren(reload(reloaded)).size(), 1);
  166. assertEquals(getParent(reload(c_1)).size(), 1);
  167. assertEquals(getParent(reload(c_2)).size(), 0);
  168. }
  169. public void testAdd() {
  170. //initialize Entities
  171. final P p = newParent();
  172. final C c_1 = newChild();
  173. doSet(p, Sets.newHashSet(c_1));
  174. //check in-memory model
  175. assertEquals(getChildren(p).size(), 1);
  176. assertEquals(getParent(c_1).size(), 1);
  177. //read persisted state into different objects
  178. final P reloaded = reload(p);
  179. //now validate that 'set' operation persists association
  180. assertEquals(getChildren(reloaded).size(), 1);
  181. final C c_2 = newChild();
  182. //change association elements
  183. doAdd(reloaded, c_2);
  184. //check in-memory model
  185. assertEquals(getChildren(reloaded).size(), 2);
  186. assertEquals(getParent(c_1).size(), 1);
  187. assertEquals(getParent(c_2).size(), 1);
  188. //now validate that 'setPixels' remove pixels from database
  189. assertEquals(getChildren(reload(reloaded)).size(), 2);
  190. assertEquals(getParent(reload(c_1)).size(), 1);
  191. assertEquals(getParent(reload(c_2)).size(), 1);
  192. }
  193. protected abstract void doRemove(final P p, final C c);
  194. protected abstract void doAdd(final P p, final C c);
  195. }
  196. /**
  197. * @author Andrey Naumenko
  198. * @version $Revision: 5276 $ $Date: 2011-04-19 15:25:02 +0300 (Tue, 19 Apr 2011) $
  199. */
  200. protected abstract class MapsTestsHelper<P extends TsObject, K, V> {
  201. public void testSet() {
  202. //initialize Entities
  203. final P p = newParent();
  204. try {
  205. getMap(p).clear();
  206. fail("Map must be unmodifiable");
  207. } catch (Exception e) {
  208. //collection is unmodifiable.
  209. }
  210. final K k_1 = newKey();
  211. final V v_1 = cast(newValue());
  212. final K k_2 = newKey();
  213. final V v_2 = cast(newValue());
  214. doSet(p, ImmutableMap.<K, V>builder().
  215. put(k_1, v_1).
  216. put(k_2, v_2).
  217. build()
  218. );
  219. //check in-memory model
  220. final Map<K, V> map = getMap(p);
  221. assertEquals(map.size(), 2);
  222. assertEquals(cast(map.get(k_1)), v_1);
  223. assertEquals(cast(map.get(k_2)), v_2);
  224. //read persisted state
  225. final P stored = reload(p);
  226. final Map<K, V> storedMap = getMap(stored);
  227. //now validate that 'set' operation persists association
  228. assertEquals(storedMap.size(), 2);
  229. assertEquals(cast(storedMap.get(k_1)), v_1);
  230. assertEquals(cast(storedMap.get(k_2)), v_2);
  231. final K k_3 = newKey();
  232. final V v_3 = cast(newValue());
  233. final V v_1_1 = cast(newValue());
  234. //change association elements
  235. doSet(stored, ImmutableMap.<K, V>builder().
  236. put(k_1, v_1_1).
  237. put(k_3, v_3).
  238. build()
  239. );
  240. //check in-memory model
  241. assertEquals(storedMap.size(), 2);
  242. assertEquals(cast(storedMap.get(k_1)), v_1_1);
  243. assertEquals(cast(storedMap.get(k_2)), null);
  244. assertEquals(cast(storedMap.get(k_3)), v_3);
  245. //now validate that 'set' remove association from database
  246. final Map<K, V> reloadedMap = getMap(reload(p));
  247. assertEquals(reloadedMap.size(), 2);
  248. assertEquals(cast(reloadedMap.get(k_1)), v_1_1);
  249. assertEquals(cast(reloadedMap.get(k_2)), null);
  250. assertEquals(cast(reloadedMap.get(k_3)), v_3);
  251. }
  252. protected abstract P newParent();
  253. protected abstract K newKey();
  254. protected abstract V newValue();
  255. protected abstract V cast(final V v);
  256. protected abstract Map<K, V> getMap(P p);
  257. protected abstract void doSet(final P p, final Map<K, V> cs);
  258. // protected abstract void doRemove(final P p, final C c);
  259. //
  260. // protected abstract void doAdd(final P p, final C c);
  261. //
  262. }
  263. }