PaginatedRosieRepository extends RosieRepository<K, V> { public PaginatedCollection<V> getPage(Page page) throws Exception { return getPage(page, ReadPolicy.READ_ALL); }  PaginatedCollection<V> getPage(Page page); PaginatedCollection<V> getPage(Page page, ReadPolicy policy);  }
@Test public void shouldReturnValuesFromCacheDataSourceIfDataIsValid() throws Exception { Page page = Page.withOffsetAndLimit(ANY_OFFSET, ANY_LIMIT); PaginatedCollection<AnyRepositoryValue> cacheValues = givenCacheDataSourceReturnsValidValues(page); PaginatedRosieRepository<AnyRepositoryKey, AnyRepositoryValue> repository = givenAPaginatedRepository(); PaginatedCollection<AnyRepositoryValue> values = repository.getPage(page); assertEquals(cacheValues, values); }
@Test public void shouldReturnItemsFromReadableDataSourceIfCacheDataSourceHasNoData() throws Exception { Page page = Page.withOffsetAndLimit(ANY_OFFSET, ANY_LIMIT); givenCacheDataSourceReturnsNull(page); PaginatedCollection<AnyRepositoryValue> readableValues = givenReadableDataSourceReturnsValues(page); PaginatedRosieRepository<AnyRepositoryKey, AnyRepositoryValue> repository = givenAPaginatedRepository(); PaginatedCollection<AnyRepositoryValue> values = repository.getPage(page); assertEquals(readableValues, values); }
@Test public void shouldReturnValuesFromReadableDataSourceIfCacheDataSourceIsNotValid() throws Exception { Page page = Page.withOffsetAndLimit(ANY_OFFSET, ANY_LIMIT); givenCacheDataSourceReturnsNonValidValues(page); PaginatedCollection<AnyRepositoryValue> readableValues = givenReadableDataSourceReturnsValues(page); PaginatedRosieRepository<AnyRepositoryKey, AnyRepositoryValue> repository = givenAPaginatedRepository(); PaginatedCollection<AnyRepositoryValue> values = repository.getPage(page); assertEquals(readableValues, values); }
@Test public void shouldReturnValuesFromReadableDataSourceIfCacheDoNotHaveThisPage() throws Exception { Page page = Page.withOffsetAndLimit(ANY_OFFSET, ANY_LIMIT); givenCacheDataSourceReturnsNonValidValues(page); givenReadableDataSourceReturnsValues(page); PaginatedRosieRepository<AnyRepositoryKey, AnyRepositoryValue> repository = givenAPaginatedRepository(); repository.getPage(page); Page nextPage = Page.withOffsetAndLimit(ANY_OFFSET + ANY_LIMIT, ANY_LIMIT); repository.getPage(nextPage); verify(cacheDataSource).getPage(page); verify(readableDataSource).getPage(page); verify(cacheDataSource).getPage(nextPage); verify(readableDataSource).getPage(nextPage); }
@Test public void shouldNotRemoveDataFromCacheIfCacheDoNotHaveThisPage() throws Exception { Page page = Page.withOffsetAndLimit(ANY_OFFSET, ANY_LIMIT); givenCacheDataSourceReturnsNonValidValues(page); givenReadableDataSourceReturnsValues(page); PaginatedRosieRepository<AnyRepositoryKey, AnyRepositoryValue> repository = givenAPaginatedRepository(); repository.getPage(page); Page nextPage = Page.withOffsetAndLimit(ANY_OFFSET + ANY_LIMIT, ANY_LIMIT); repository.getPage(nextPage); verify(cacheDataSource, times(1)).deleteAll(); }
@Test public void shouldReturnValuesFromReadableDataSourceIfPolicyForcesOnlyReadable() throws Exception { Page page = Page.withOffsetAndLimit(ANY_OFFSET, ANY_LIMIT); givenCacheDataSourceReturnsValidValues(page); PaginatedCollection<AnyRepositoryValue> readableValues = givenReadableDataSourceReturnsValues(page); PaginatedRosieRepository<AnyRepositoryKey, AnyRepositoryValue> repository = givenAPaginatedRepository(); PaginatedCollection<AnyRepositoryValue> values = repository.getPage(page, ReadPolicy.READABLE_ONLY); assertEquals(readableValues, values); }
@Test public void shouldPopulateCacheDataSourceAfterGetPageFromReadableDataSource() throws Exception { Page page = Page.withOffsetAndLimit(ANY_OFFSET, ANY_LIMIT); givenCacheDataSourceReturnsNull(page); PaginatedCollection<AnyRepositoryValue> readableValues = givenReadableDataSourceReturnsValues(page); PaginatedRosieRepository<AnyRepositoryKey, AnyRepositoryValue> repository = givenAPaginatedRepository(); repository.getPage(page); verify(cacheDataSource).addOrUpdatePage(page, readableValues.getItems(), true); }
@Test public void shouldDeleteCacheDataIfItemsAreNotValid() throws Exception { Page page = Page.withOffsetAndLimit(ANY_OFFSET, ANY_LIMIT); givenCacheDataSourceReturnsNonValidValues(page); PaginatedRosieRepository<AnyRepositoryKey, AnyRepositoryValue> repository = givenAPaginatedRepository(); repository.getPage(page); verify(cacheDataSource).deleteAll(); }