package com.github.florent37.rxandroidorm.sample;
import com.github.florent37.rxandroidorm.sample.model.Cat;
import com.github.florent37.rxandroidorm.sample.model.CatDatabase;
import com.github.florent37.rxandroidorm.sample.model.Dog;
import com.github.florent37.rxandroidorm.sample.model.DogDatabase;
import com.github.florent37.rxandroidorm.sample.model.User;
import com.github.florent37.rxandroidorm.sample.model.UserDatabase;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import java.util.Arrays;
import java.util.List;
import io.reactivex.ObservableSource;
import io.reactivex.Scheduler;
import io.reactivex.annotations.NonNull;
import io.reactivex.functions.Function;
import io.reactivex.schedulers.Schedulers;
import static com.google.common.truth.Truth.assertThat;
import static org.mockito.Mockito.spy;
/**
* Created by florentchampigny on 05/02/2016.
*/
@RunWith(CustomRobolectricTestRunner.class)
public class UserEntityManagerTest {
@Rule
public RxJavaSchedulersTestRule rxJavaSchedulersTestRule = new RxJavaSchedulersTestRule();
UserDatabase userEntityManager;
CatDatabase CarEntityManager;
DogDatabase dogEntityManager;
private Scheduler scheduler = Schedulers.trampoline();
@Before
public void setUp() throws Exception {
userEntityManager = spy(new UserDatabase());
userEntityManager.deleteAll().subscribeOn(scheduler).subscribe();
CarEntityManager = spy(new CatDatabase());
CarEntityManager.deleteAll().subscribeOn(scheduler).subscribe();
dogEntityManager = spy(new DogDatabase());
dogEntityManager.deleteAll().subscribeOn(scheduler).subscribe();
}
@Test
public void shouldAddUser() {
//given
final User user = new User(21, "florent");
//when
userEntityManager.add(user).subscribe();
//then
userEntityManager.count().test().assertValue(1);
}
@Test
public void shouldAddUsers_flatmap() {
//given
final User user = new User(21, "florent");
final User user2 = new User(22, "kevin");
//when
userEntityManager.add(user)
.flatMap(new Function<User, ObservableSource<User>>() {
@Override
public ObservableSource<User> apply(@NonNull User user) throws Exception {
return userEntityManager.add(user2);
}
})
.subscribe();
//then
userEntityManager.count().test().assertValue(2);
}
@Test
public void shouldAddUsers() {
//given
final List<User> users = Arrays.asList(
new User(21, "florent", new Cat("Java"), Arrays.asList(new Dog("Loulou")), true),
new User(30, "kevin", new Cat("Futé"), Arrays.asList(new Dog("Darty")), true),
new User(10, "alex", new Cat("Yellow"), Arrays.asList(new Dog("Darty"), new Dog("Sasha")), false)
);
//when
userEntityManager.add(users).subscribeOn(scheduler).subscribe();
//then
userEntityManager.count().test().assertValue(3);
CarEntityManager.count().test().assertValue(3);
dogEntityManager.count().test().assertValue(4);
}
@Test
public void shouldAddUsers_withCatDogs() {
//given
User user = new User(21, "florent", new Cat("Java"), Arrays.asList(new Dog("Loulou")), true);
//when
userEntityManager.add(user)
.subscribeOn(scheduler)
.subscribe();
User userFromBase = userEntityManager.select().first().blockingFirst();
//then
assertThat(userFromBase).isNotNull();
assertThat(userFromBase.getAge()).isEqualTo(21);
assertThat(userFromBase.getName()).isEqualTo("florent");
assertThat(userFromBase.isHacker()).isTrue();
assertThat(userFromBase.getCat()).isNotNull();
assertThat(userFromBase.getCat().getShortName()).isEqualTo("Java");
assertThat(userFromBase.getDogs()).hasSize(1);
assertThat(userFromBase.getDogs().get(0).getName()).isEqualTo("Loulou");
}
@Test
public void testUpdateUser_onlyFields() throws Exception {
//given
userEntityManager.add(new User(30, "blob", null, null, true)).subscribeOn(scheduler).subscribe();
//when
User userFromBase = userEntityManager.select().name().equalsTo("blob").first().blockingFirst();
userFromBase.setAge(10);
userEntityManager.update(userFromBase).subscribe();
//then
userEntityManager.count().test().assertValue(1);
User userFromBase2 = userEntityManager.select().name().equalsTo("blob").first().blockingFirst();
assertThat(userFromBase2.getAge()).isEqualTo(10);
}
@Test
public void testUpdateUser_oneToOne_nullToValue() throws Exception {
//given
userEntityManager.add(new User(30, "blob", null, null, true)).subscribeOn(scheduler).subscribe();
//when
User userFromBase = userEntityManager.select().name().equalsTo("blob").first().blockingFirst();
userFromBase.setCat(new Cat("java"));
userEntityManager.update(userFromBase).subscribe();
//then
userEntityManager.count().test().assertValue(1);
CarEntityManager.count().test().assertValue(1);
User userFromBase2 = userEntityManager.select().name().equalsTo("blob").first().blockingFirst();
assertThat(userFromBase2.getCat()).isNotNull();
assertThat(userFromBase2.getCat().getShortName()).isEqualTo("java");
}
@Test
public void testUpdateUser_oneToOne_valueToNull() throws Exception {
//given
userEntityManager.add(new User(30, "blob", new Cat("java"), null, true)).subscribeOn(scheduler).subscribe();
//when
User userFromBase = userEntityManager.select().name().equalsTo("blob").first().blockingFirst();
userFromBase.setCat(null);
userEntityManager.update(userFromBase).subscribe();
//then
userEntityManager.count().test().assertValue(1);
CarEntityManager.count().test().assertValue(1);
User userFromBase2 = userEntityManager.select().name().equalsTo("blob").first().blockingFirst();
assertThat(userFromBase2.getCat()).isNull();
}
@Test
public void testUpdateUser_oneToOne_updateValue() throws Exception {
//given
userEntityManager.add(new User(30, "blob", new Cat("java"), null, true)).subscribeOn(scheduler).subscribe();
//when
User userFromBase = userEntityManager.select().name().equalsTo("blob").first().blockingFirst();
userFromBase.getCat().setShortName("lili");
userEntityManager.update(userFromBase).subscribe();
//then
userEntityManager.count().test().assertValue(1);
CarEntityManager.count().test().assertValue(1);
User userFromBase2 = userEntityManager.select().name().equalsTo("blob").first().blockingFirst();
assertThat(userFromBase2.getCat()).isNotNull();
assertThat(userFromBase2.getCat().getShortName()).isEqualTo("lili");
}
@Test
public void testUpdateUser_oneToMany_nullToValue() throws Exception {
//given
userEntityManager.add(new User(30, "blob", null, null, true))
.subscribeOn(scheduler)
.subscribe();
//when
User userFromBase = userEntityManager.select().name().equalsTo("blob").first().blockingFirst();
userFromBase.setDogs(Arrays.asList(new Dog("a"), new Dog("b")));
userEntityManager.update(userFromBase).subscribe();
//then
userEntityManager.count().test().assertValue(1);
dogEntityManager.count().test().assertValue(2);
User userFromBase2 = userEntityManager.select().name().equalsTo("blob").first().blockingFirst();
assertThat(userFromBase2.getDogs()).hasSize(2);
assertThat(userFromBase2.getDogs().get(0).getName()).isEqualTo("a");
assertThat(userFromBase2.getDogs().get(1).getName()).isEqualTo("b");
}
@Test
public void testUpdateUser_oneToMany_valueToNull() throws Exception {
//given
userEntityManager.add(new User(30, "blob", null, Arrays.asList(new Dog("a"), new Dog("b")), true))
.subscribeOn(scheduler)
.subscribe();
//when
User userFromBase = userEntityManager.select().name().equalsTo("blob").first().blockingFirst();
assertThat(userFromBase.getDogs()).hasSize(2);
userFromBase.setDogs(null);
userEntityManager.update(userFromBase).subscribe();
//then
userEntityManager.count().test().assertValue(1);
dogEntityManager.count().test().assertValue(2); //TODO
User userFromBase2 = userEntityManager.select().name().equalsTo("blob").first().blockingFirst();
assertThat(userFromBase2.getDogs()).isNull();
}
@Test
public void testUpdateUser_oneToMany_valueAdded() throws Exception {
//given
userEntityManager.add(new User(30, "blob", null, Arrays.asList(new Dog("a"), new Dog("b")), true))
.subscribeOn(scheduler)
.subscribe();
//when
User userFromBase = userEntityManager.select().name().equalsTo("blob").first().blockingFirst();
assertThat(userFromBase.getDogs()).hasSize(2);
userFromBase.getDogs().add(new Dog("c"));
userEntityManager.update(userFromBase).subscribe();
//then
userEntityManager.count().test().assertValue(1);
//TODO assertThat(dogEntityManager.count()).isEqualTo(2);
User userFromBase2 = userEntityManager.select().name().equalsTo("blob").first().blockingFirst();
assertThat(userFromBase2.getDogs()).hasSize(3);
}
@Test
public void testUpdateUser_oneToMany_valueRemoved() throws Exception {
//given
userEntityManager.add(new User(30, "blob", null, Arrays.asList(new Dog("a"), new Dog("b")), true))
.subscribeOn(scheduler)
.subscribe();
//when
User userFromBase = userEntityManager.select().name().equalsTo("blob").first().blockingFirst();
assertThat(userFromBase.getDogs()).hasSize(2);
userFromBase.getDogs().remove(0);
userEntityManager.update(userFromBase).subscribe();
//then
userEntityManager.count().test().assertValue(1);
dogEntityManager.count().test().assertValue(2); //TODO
User userFromBase2 = userEntityManager.select().name().equalsTo("blob").first().blockingFirst();
assertThat(userFromBase2.getDogs()).hasSize(1);
}
@Test
public void testUpdateUser_oneToMany_valueUpdated() throws Exception {
//given
userEntityManager.add(new User(30, "blob", null, Arrays.asList(new Dog("a"), new Dog("b")), true))
.subscribeOn(scheduler)
.subscribe();
//when
User userFromBase = userEntityManager.select().name().equalsTo("blob").first().blockingFirst();
assertThat(userFromBase.getDogs()).hasSize(2);
userFromBase.getDogs().get(0).setName("ddd");
userEntityManager.update(userFromBase).subscribe();
//then
userEntityManager.count().test().assertValue(1);
dogEntityManager.count().test().assertValue(2);
User userFromBase2 = userEntityManager.select().name().equalsTo("blob").first().blockingFirst();
assertThat(userFromBase2.getDogs()).hasSize(2);
assertThat(userFromBase2.getDogs().get(0).getName()).isEqualTo("ddd");
assertThat(userFromBase2.getDogs().get(1).getName()).isEqualTo("b");
}
}