/* * Copyright (C) 2016 Mobile Jazz * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.mobilejazz.cacheio; import android.support.annotation.NonNull; import android.support.test.InstrumentationRegistry; import android.support.test.runner.AndroidJUnit4; import com.mobilejazz.cacheio.mappers.DefaultQueryMapper; import com.mobilejazz.cacheio.mappers.PaginatedQueryMapper; import com.mobilejazz.cacheio.model.TestUser; import com.mobilejazz.cacheio.query.DefaultQuery; import com.mobilejazz.cacheio.query.PaginatedQuery; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import rx.Single; import java.util.*; import java.util.concurrent.*; import static org.assertj.core.api.Assertions.assertThat; @RunWith(AndroidJUnit4.class) public class RxRepositoryTests { private CacheIO cacheIO; public static final String FAKE_TEST_USER_ID = "fake.user.id"; public static final String FAKE_TEST_USER_NAME = "fake.test.user.name"; @Before public void setUp() throws Exception { this.cacheIO = CacheIO.with(InstrumentationRegistry.getContext()) .identifier("test.database") .executor(Executors.newSingleThreadExecutor()) .setKeyMapper(PaginatedQuery.class, new PaginatedQueryMapper()) .setKeyMapper(DefaultQuery.class, new DefaultQueryMapper()) .build(); } @Test(expected = IllegalArgumentException.class) public void shouldThrowAExceptionWhenCacheAndQueryCacheIsNull() throws Exception { new StringKeyedRxRepository.Builder<TestUser, DefaultQuery>().setCache(null) .setQueryCache(null) .build(); } @Test(expected = IllegalArgumentException.class) public void shouldThrowAExceptionWhenCacheIsNull() throws Exception { RxCache<DefaultQuery, StringList> queryCache = cacheIO.newRxCache(DefaultQuery.class, StringList.class); new StringKeyedRxRepository.Builder<TestUser, DefaultQuery>().setCache(null) .setQueryCache(queryCache) .build(); } @Test(expected = IllegalArgumentException.class) public void shouldThrowAExceptionWhenQueryCacheIsNull() throws Exception { RxCache<String, TestUser> cache = cacheIO.newRxCache(String.class, TestUser.class); new StringKeyedRxRepository.Builder<TestUser, DefaultQuery>().setCache(cache) .setQueryCache(null) .build(); } @Test(expected = IllegalArgumentException.class) public void shouldThrowAExceptionWhenDummyObjectIsNull() throws Exception { RxRepository<String, TestUser, PaginatedQuery> repository = givenARxWithPaginatedQueryRepository(); repository.put(null); } @Test(expected = IllegalArgumentException.class) public void shouldThrowAExceptionWhenQueryAndListAreNull() throws Exception { RxRepository<String, TestUser, PaginatedQuery> repository = givenARxWithPaginatedQueryRepository(); repository.put(null, null); } @Test(expected = IllegalArgumentException.class) public void shouldThrowAExceptionWhenPutAndQueryIsNull() throws Exception { RxRepository<String, TestUser, PaginatedQuery> repository = givenARxWithPaginatedQueryRepository(); repository.put(null, Collections.<TestUser>emptyList()); } @Test(expected = IllegalArgumentException.class) public void shouldThrowAExceptionWhenPutAndListIsNull() throws Exception { RxRepository<String, TestUser, PaginatedQuery> repository = givenARxWithPaginatedQueryRepository(); PaginatedQuery paginatedQuery = givenAFakePaginatedQuery("test", 0, 5); repository.put(paginatedQuery, null); } @Test(expected = IllegalArgumentException.class) public void shouldThrowAExceptionWhenFindAndQueryIsNull() throws Exception { RxRepository<String, TestUser, PaginatedQuery> repository = givenARxWithPaginatedQueryRepository(); repository.find(null); } @Test(expected = IllegalArgumentException.class) public void shouldThrowAExceptionWhenFindByIdAndIdIsNull() throws Exception { RxRepository<String, TestUser, PaginatedQuery> repository = givenARxWithPaginatedQueryRepository(); repository.findById(null); } @Test(expected = IllegalArgumentException.class) public void shouldThrowAExceptionWhenFindByIdAndIdIsEmpty() throws Exception { RxRepository<String, TestUser, PaginatedQuery> repository = givenARxWithPaginatedQueryRepository(); repository.findById(""); } @Test(expected = IllegalArgumentException.class) public void shouldThrowAExceptionWhenRemoveByIdAndIdIsEmpty() throws Exception { RxRepository<String, TestUser, PaginatedQuery> repository = givenARxWithPaginatedQueryRepository(); repository.removeById(""); } @Test(expected = IllegalArgumentException.class) public void shouldThrowAExceptionWhenRemoveByIdAndIdIsNull() throws Exception { RxRepository<String, TestUser, PaginatedQuery> repository = givenARxWithPaginatedQueryRepository(); repository.removeById(null); } @Test(expected = IllegalArgumentException.class) public void shouldThrowAExceptionWhenRemoveByQueryAndQueryIsNull() throws Exception { RxRepository<String, TestUser, PaginatedQuery> repository = givenARxWithPaginatedQueryRepository(); repository.removeByQuery(null); } @Test public void shouldPutADummyObject() throws Exception { RxRepository<String, TestUser, PaginatedQuery> repository = givenARxWithPaginatedQueryRepository(); TestUser testUserPut = repository.put(givenDummyTestUser()).toObservable().toBlocking().first(); Single<TestUser> singleTestUser = repository.findById(FAKE_TEST_USER_ID); TestUser testUser = singleTestUser.toObservable().toBlocking().first(); assertThat(testUser).isNotNull(); assertThat(testUser.getId()).isEqualTo(FAKE_TEST_USER_ID); assertThat(testUser.getName()).isEqualTo(FAKE_TEST_USER_NAME); } @Test public void shouldPutAListOfDummyObjectsWithPaginatedQuery() throws Exception { RxRepository<String, TestUser, PaginatedQuery> repository = givenARxWithPaginatedQueryRepository(); TestUser testUserOne = givenDummyTestUser("one", "dummy_one"); TestUser testUserTwo = givenDummyTestUser("two", "dummy_two"); List<TestUser> testUsersToPut = new ArrayList<>(2); testUsersToPut.add(testUserOne); testUsersToPut.add(testUserTwo); PaginatedQuery paginatedQuery = new PaginatedQuery("test.user.paginated", 0, 10); List<TestUser> testUsersPut = repository.put(paginatedQuery, testUsersToPut).toObservable().toBlocking().first(); List<TestUser> testUsersExpected = repository.find(paginatedQuery).toObservable().toBlocking().first(); assertThat(testUsersExpected).isNotNull(); assertThat(testUsersExpected.size()).isEqualTo(testUsersToPut.size()); assertThat(testUsersExpected.get(0)).isNotNull(); assertThat(testUsersExpected.get(0).getId()).isEqualTo(testUserOne.getId()); assertThat(testUsersExpected.get(0).getName()).isEqualTo(testUserOne.getName()); assertThat(testUsersExpected.get(1)).isNotNull(); assertThat(testUsersExpected.get(1).getId()).isEqualTo(testUserTwo.getId()); assertThat(testUsersExpected.get(1).getName()).isEqualTo(testUserTwo.getName()); } @Test public void shouldPutAListOfDummyObjectsWithDefaultQuery() throws Exception { RxRepository<String, TestUser, DefaultQuery> repository = givenARxWithDefaultQueryRepository(); TestUser testUserOne = givenDummyTestUser("one", "dummy_one"); TestUser testUserTwo = givenDummyTestUser("two", "dummy_two"); List<TestUser> testUsersToPut = new ArrayList<>(2); testUsersToPut.add(testUserOne); testUsersToPut.add(testUserTwo); DefaultQuery query = new DefaultQuery("test.query"); List<TestUser> first = repository.put(query, testUsersToPut).toObservable().toBlocking().first(); List<TestUser> testUsersExpected = repository.find(query).toObservable().toBlocking().first(); assertThat(testUsersExpected).isNotNull(); assertThat(testUsersExpected.size()).isEqualTo(testUsersToPut.size()); assertThat(testUsersExpected.get(0)).isNotNull(); assertThat(testUsersExpected.get(0).getId()).isEqualTo(testUserOne.getId()); assertThat(testUsersExpected.get(0).getName()).isEqualTo(testUserOne.getName()); assertThat(testUsersExpected.get(1)).isNotNull(); assertThat(testUsersExpected.get(1).getId()).isEqualTo(testUserTwo.getId()); assertThat(testUsersExpected.get(1).getName()).isEqualTo(testUserTwo.getName()); } @Test public void shouldReturnEmptyListWhenThereIsNoDummyObjectsWithPaginatedQuery() throws Exception { RxRepository<String, TestUser, PaginatedQuery> repository = givenARxWithPaginatedQueryRepository(); List<TestUser> testUsers = repository.find(givenAFakePaginatedQuery("fake.id", 0, 5)) .toObservable() .toBlocking() .first(); assertThat(testUsers).isEmpty(); } @Test public void shouldReturnEmptyListWhenThereIsNoDummyObjectsWithDefaultQuery() throws Exception { RxRepository<String, TestUser, DefaultQuery> repository = givenARxWithDefaultQueryRepository(); List<TestUser> testUsers = repository.find(givenADefaultQuery("test.id")).toObservable().toBlocking().first(); assertThat(testUsers).isEmpty(); } @Test public void shouldRemoveADummyObject() throws Exception { RxRepository<String, TestUser, PaginatedQuery> repository = givenARxWithPaginatedQueryRepository(); TestUser persisted = repository.put(givenDummyTestUser()).toObservable().toBlocking().first(); String keyRemoved = repository.removeById(FAKE_TEST_USER_ID).toObservable().toBlocking().first(); assertThat(keyRemoved).isNotNull(); assertThat(keyRemoved).isEqualTo(FAKE_TEST_USER_ID); } @Test public void shouldRemoveAListOfDummyObjectsByAPaginatedQuery() throws Exception { RxRepository<String, TestUser, PaginatedQuery> repository = givenARxWithPaginatedQueryRepository(); TestUser testUserOne = givenDummyTestUser("one", "dummy_one"); TestUser testUserTwo = givenDummyTestUser("two", "dummy_two"); List<TestUser> testUsersToPut = new ArrayList<>(2); testUsersToPut.add(testUserOne); testUsersToPut.add(testUserTwo); PaginatedQuery paginatedQuery = new PaginatedQuery("test.user.paginated", 0, 10); List<TestUser> testUsersPut = repository.put(paginatedQuery, testUsersToPut).toObservable().toBlocking().first(); Collection<String> keysRemoved = repository.removeByQuery(paginatedQuery).toObservable().toBlocking().first(); assertThat(keysRemoved).isNotNull(); } @Test public void shouldRemoveAListOfDummyObjectsByADefaultQuery() throws Exception { RxRepository<String, TestUser, DefaultQuery> repository = givenARxWithDefaultQueryRepository(); TestUser testUserOne = givenDummyTestUser("one", "dummy_one"); TestUser testUserTwo = givenDummyTestUser("two", "dummy_two"); List<TestUser> testUsersToPut = new ArrayList<>(2); testUsersToPut.add(testUserOne); testUsersToPut.add(testUserTwo); DefaultQuery query = givenADefaultQuery("test.fake.id"); List<TestUser> testUsersPut = repository.put(query, testUsersToPut).toObservable().toBlocking().first(); Collection<String> keysRemoved = repository.removeByQuery(query).toObservable().toBlocking().first(); assertThat(keysRemoved).isNotNull(); } private List<TestUser> givenListOfDummyTestUser() { int size = 3; List<TestUser> testUsers = new ArrayList<>(3); for (int i = 0; i < size; i++) { TestUser testUser = new TestUser(String.valueOf(i), "fake.name" + i); testUsers.add(testUser); } return testUsers; } private TestUser givenDummyTestUser(String id, String name) { return new TestUser(id, name); } private TestUser givenDummyTestUser() { return givenDummyTestUser(FAKE_TEST_USER_ID, FAKE_TEST_USER_NAME); } private RxRepository<String, TestUser, PaginatedQuery> givenARxWithPaginatedQueryRepository() { RxCache<String, TestUser> cache = cacheIO.newRxCache(String.class, TestUser.class); RxCache<PaginatedQuery, StringList> queryCache = cacheIO.newRxCache(PaginatedQuery.class, StringList.class); return new StringKeyedRxRepository.Builder<TestUser, PaginatedQuery>().setCache(cache) .setQueryCache(queryCache) .build(); } private RxRepository<String, TestUser, DefaultQuery> givenARxWithDefaultQueryRepository() { RxCache<String, TestUser> cache = cacheIO.newRxCache(String.class, TestUser.class); RxCache<DefaultQuery, StringList> queryCache = cacheIO.newRxCache(DefaultQuery.class, StringList.class); return new StringKeyedRxRepository.Builder<TestUser, DefaultQuery>().setCache(cache) .setQueryCache(queryCache) .build(); } @NonNull private PaginatedQuery givenAFakePaginatedQuery(String test, int offset, int limit) { return new PaginatedQuery(test, offset, limit); } @NonNull private DefaultQuery givenADefaultQuery(String id) { return new DefaultQuery(id); } }