From 2dccb818a2213ccc3bd5132cd72c0124070bac7a Mon Sep 17 00:00:00 2001 From: Wolfgang Buchner Date: Thu, 9 May 2013 12:13:43 +0200 Subject: [PATCH] unit test for: update ManyToMany collection cache on updating cached beans --- .../tests/cache/TestCacheCollectionIds.java | 71 ++++++++++++++++++- .../avaje/tests/model/basic/CachedBean.java | 42 +++++++++++ 2 files changed, 110 insertions(+), 3 deletions(-) create mode 100644 src/test/java/com/avaje/tests/model/basic/CachedBean.java diff --git a/src/test/java/com/avaje/tests/cache/TestCacheCollectionIds.java b/src/test/java/com/avaje/tests/cache/TestCacheCollectionIds.java index 31af49c39..6e8f802c7 100644 --- a/src/test/java/com/avaje/tests/cache/TestCacheCollectionIds.java +++ b/src/test/java/com/avaje/tests/cache/TestCacheCollectionIds.java @@ -2,15 +2,14 @@ package com.avaje.tests.cache; import java.util.List; +import com.avaje.ebeaninternal.server.cache.CachedManyIds; +import com.avaje.tests.model.basic.*; import org.junit.Assert; import org.junit.Test; import com.avaje.ebean.BaseTestCase; import com.avaje.ebean.Ebean; import com.avaje.ebean.cache.ServerCache; -import com.avaje.tests.model.basic.Contact; -import com.avaje.tests.model.basic.Customer; -import com.avaje.tests.model.basic.ResetBasicData; public class TestCacheCollectionIds extends BaseTestCase { @@ -86,4 +85,70 @@ public class TestCacheCollectionIds extends BaseTestCase { } return contacts2.size(); } + + /** + * When updating a ManyToMany relations also the collection cache must be updated. + */ + @Test + public void testUpdatingCollectionCacheForManyToManyRelations() { + // arrange + ResetBasicData.reset(); + + CachedBean cachedBean = new CachedBean(); + cachedBean.getCountries().add(Ebean.find(Country.class, "NZ")); + cachedBean.getCountries().add(Ebean.find(Country.class, "AU")); + + Ebean.save(cachedBean); + + // act + CachedBean loadedBean = Ebean.find(CachedBean.class, cachedBean.getId()); + loadedBean.getCountries().clear(); + loadedBean.getCountries().add(Ebean.find(Country.class, "AU")); + + Ebean.save(cachedBean); + + CachedBean result = Ebean.find(CachedBean.class, cachedBean.getId()); + ServerCache cachedBeanCountriesCache = Ebean.getServerCacheManager().getCollectionIdsCache(CachedBean.class, "countries"); + CachedManyIds cachedManyIds = (CachedManyIds) cachedBeanCountriesCache.get(result.getId()); + + + // assert + Assert.assertEquals(1, result.getCountries().size()); + Assert.assertEquals(1, cachedManyIds.getIdList().size()); + Assert.assertFalse(cachedManyIds.getIdList().contains("NZ")); + Assert.assertTrue(cachedManyIds.getIdList().contains("AU")); + } + + /** + * When updating a ManyToMany relations also the collection cache must be updated. + */ + @Test + public void testUpdatingCollectionCacheForManyToManyRelationsWithinStatelessUpdate() { + // arrange + ResetBasicData.reset(); + + CachedBean cachedBean = new CachedBean(); + cachedBean.getCountries().add(Ebean.find(Country.class, "NZ")); + cachedBean.getCountries().add(Ebean.find(Country.class, "AU")); + + Ebean.save(cachedBean); + + // act + CachedBean update = new CachedBean(); + update.setId(cachedBean.getId()); + update.getCountries().add(Ebean.find(Country.class, "AU")); + + Ebean.update(cachedBean); + + CachedBean result = Ebean.find(CachedBean.class, cachedBean.getId()); + ServerCache cachedBeanCountriesCache = Ebean.getServerCacheManager().getCollectionIdsCache(CachedBean.class, "countries"); + CachedManyIds cachedManyIds = (CachedManyIds) cachedBeanCountriesCache.get(result.getId()); + + + // assert + Assert.assertEquals(1, result.getCountries().size()); + Assert.assertEquals(1, cachedManyIds.getIdList().size()); + Assert.assertFalse(cachedManyIds.getIdList().contains("NZ")); + Assert.assertTrue(cachedManyIds.getIdList().contains("AU")); + } } diff --git a/src/test/java/com/avaje/tests/model/basic/CachedBean.java b/src/test/java/com/avaje/tests/model/basic/CachedBean.java new file mode 100644 index 000000000..5cf3da58a --- /dev/null +++ b/src/test/java/com/avaje/tests/model/basic/CachedBean.java @@ -0,0 +1,42 @@ +package com.avaje.tests.model.basic; + +import com.avaje.ebean.annotation.CacheStrategy; +import com.avaje.ebean.annotation.CacheTuning; + +import javax.persistence.Entity; +import javax.persistence.Id; +import javax.persistence.ManyToMany; +import javax.persistence.Table; +import java.util.ArrayList; +import java.util.List; + +/** + * Cached bean for testing caching implementation. + */ +@CacheStrategy +@Entity +@Table(name = "o_cached_bean") +public class CachedBean { + + @Id + Long id; + + @ManyToMany + List countries = new ArrayList(); + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public List getCountries() { + return countries; + } + + public void setCountries(List countries) { + this.countries = countries; + } +}