public static Page withOffsetAndLimit(int offset, int limit) { return new Page(offset, limit); }
private InMemoryPaginatedCacheDataSource<AnyRepositoryKey, AnyRepositoryValue> givenAnInMemoryPaginatedCacheDataSource() { return new InMemoryPaginatedCacheDataSource<>(timeProvider, ANY_TTL); }
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 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 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()); }
@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 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 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); }
private void loadCharacters() { createUseCaseCall(getCharacters).args( Page.withOffsetAndLimit(offset, NUMBER_OF_CHARACTERS_PER_PAGE)) .onSuccess(new OnSuccessCallback() { @Success public void onCharactersLoaded(PaginatedCollection<Character> characters) { showCharacters(characters); offset = characters.getPage().getOffset() + NUMBER_OF_CHARACTERS_PER_PAGE; } }).onError(new OnErrorCallback() { @Override public boolean onError(Error error) { getView().hideLoading(); return false; } }) .execute(); }
protected PaginatedCollection<V> getPaginatedValuesFromReadables(Page page) throws Exception { PaginatedCollection<V> values = null; for (PaginatedReadableDataSource<K, V> readable : paginatedReadableDataSources) { values = readable.getPage(page); if (values != null && values.getItems() != null && !values.getItems().isEmpty()) { break; } } return values; }
protected void populatePaginatedCaches(Page page, PaginatedCollection<V> values) throws Exception { for (PaginatedCacheDataSource<K, V> cacheDataSource : paginatedCacheDataSources) { cacheDataSource.addOrUpdatePage(page, values.getItems(), values.hasMore()); } }
private void givenCacheDataSourceReturnsNull(Page page) throws Exception { when(cacheDataSource.getPage(page)).thenReturn(null); }
@Override public synchronized PaginatedCollection<V> addOrUpdatePage(Page page, Collection<V> values, boolean hasMore) { for (V value : values) { addOrUpdate(value); } this.hasMore = hasMore; PaginatedCollection<V> paginatedCollection = new PaginatedCollection<>(values); paginatedCollection.setPage(page); paginatedCollection.setHasMore(hasMore); lastItemsUpdate = timeProvider.currentTimeMillis(); return paginatedCollection; }
@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 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 loadComics() { createUseCaseCall(getComicSeriesPage).args( Page.withOffsetAndLimit(offset, NUMBER_OF_COMIC_SERIES_PER_PAGE)) .onSuccess(new OnSuccessCallback() { @Success public void onComicSeriesLoaded(PaginatedCollection<ComicSeries> comicSeries) { showComics(comicSeries); offset = comicSeries.getPage().getOffset() + NUMBER_OF_COMIC_SERIES_PER_PAGE; } }) .onError(new OnErrorCallback() { @Override public boolean onError(Error error) { getView().hideLoading(); return false; } }) .execute(); }
@Provides @Singleton public PaginatedCacheDataSource<String, Character> provideCharactersPageInMemoryCache() { return new InMemoryPaginatedCacheDataSource<>(new TimeProvider(), CHARACTERS_IN_MEMORY_CACHE_TTL); }
private PaginatedCollection<AnyRepositoryValue> givenReadableDataSourceReturnsValues(Page page) throws Exception { PaginatedCollection<AnyRepositoryValue> values = getSomeValues(page); when(readableDataSource.getPage(page)).thenReturn(values); return values; }
@Provides @Singleton public PaginatedCacheDataSource<Integer, ComicSeries> provideComicsPageInMemoryCache() { return new InMemoryPaginatedCacheDataSource<>(new TimeProvider(), COMICS_IN_MEMORY_CACHE_TTL); }