protected void populatePaginatedCaches(Page page, PaginatedCollection<V> values) throws Exception { for (PaginatedCacheDataSource<K, V> cacheDataSource : paginatedCacheDataSources) { cacheDataSource.addOrUpdatePage(page, values.getItems(), values.hasMore()); } }
protected PaginatedCollection<V> getPaginatedValuesFromCaches(Page page) throws Exception { PaginatedCollection<V> values = null; for (PaginatedCacheDataSource<K, V> cacheDataSource : paginatedCacheDataSources) { values = cacheDataSource.getPage(page); if (values != null && values.getItems() != null && !values.getItems().isEmpty()) { if (areValidValues(values, cacheDataSource)) { break; } else { cacheDataSource.deleteAll(); values = null; } } else { values = null; } } return values; }
private PaginatedCollection<AnyRepositoryValue> givenCacheDataSourceReturnsValues(Page page, boolean areValidValues) throws Exception { PaginatedCollection<AnyRepositoryValue> values = getSomeValues(page); when(cacheDataSource.getPage(page)).thenReturn(values); when(cacheDataSource.isValid(any(AnyRepositoryValue.class))).thenReturn(areValidValues); return values; }
@Test public void shouldReturnHasMoreIfThereAreMoreItemsToLoad() throws Exception { Page page = Page.withOffsetAndLimit(ANY_OFFSET, ANY_LIMIT); Collection<AnyRepositoryValue> values = givenSomeItems(ANY_OFFSET + ANY_LIMIT); PaginatedCacheDataSource<AnyRepositoryKey, AnyRepositoryValue> cache = givenAnInMemoryPaginatedCacheDataSource(); cache.addOrUpdatePage(page, values, ANY_HAS_MORE); PaginatedCollection<AnyRepositoryValue> paginatedCollection = cache.getPage(page); assertEquals(ANY_HAS_MORE, paginatedCollection.hasMore()); }
@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(); }
private void givenCacheDataSourceReturnsNull(Page page) throws Exception { when(cacheDataSource.getPage(page)).thenReturn(null); }
private boolean areValidValues(PaginatedCollection<V> values, PaginatedCacheDataSource<K, V> cacheDataSource) { boolean areValidValues = false; for (V value : values.getItems()) { areValidValues |= cacheDataSource.isValid(value); } return areValidValues; } }
@Test public void shouldAddValuesBasedOnTheOffsetAndLimit() throws Exception { Page page = Page.withOffsetAndLimit(ANY_OFFSET, ANY_LIMIT); Collection<AnyRepositoryValue> values = givenSomeItems(ANY_OFFSET + ANY_LIMIT); PaginatedCacheDataSource<AnyRepositoryKey, AnyRepositoryValue> cache = givenAnInMemoryPaginatedCacheDataSource(); cache.addOrUpdatePage(page, values, ANY_HAS_MORE); PaginatedCollection<AnyRepositoryValue> paginatedCollection = cache.getPage(page); assertEquals(values, paginatedCollection.getItems()); }
@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 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 shouldReturnTheRequestedOffset() throws Exception { Page page = Page.withOffsetAndLimit(ANY_OFFSET, ANY_LIMIT); Collection<AnyRepositoryValue> values = givenSomeItems(ANY_OFFSET + ANY_LIMIT); PaginatedCacheDataSource<AnyRepositoryKey, AnyRepositoryValue> cache = givenAnInMemoryPaginatedCacheDataSource(); cache.addOrUpdatePage(page, values, ANY_HAS_MORE); PaginatedCollection<AnyRepositoryValue> paginatedCollection = cache.getPage(page); assertEquals(ANY_OFFSET, paginatedCollection.getPage().getOffset()); }
@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 shouldReturnRequestedLimit() throws Exception { Page page = Page.withOffsetAndLimit(ANY_OFFSET, ANY_LIMIT); Collection<AnyRepositoryValue> values = givenSomeItems(ANY_OFFSET + ANY_LIMIT); PaginatedCacheDataSource<AnyRepositoryKey, AnyRepositoryValue> cache = givenAnInMemoryPaginatedCacheDataSource(); cache.addOrUpdatePage(page, values, ANY_HAS_MORE); PaginatedCollection<AnyRepositoryValue> paginatedCollection = cache.getPage(page); assertEquals(ANY_LIMIT, paginatedCollection.getPage().getLimit()); }