package com.novoda.bonfire.user.database;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.novoda.bonfire.rx.FirebaseObservableListeners;
import com.novoda.bonfire.user.data.model.User;
import com.novoda.bonfire.user.data.model.Users;
import java.util.Arrays;
import org.junit.Before;
import org.junit.Test;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import rx.Observable;
import static com.novoda.bonfire.helpers.FirebaseTestHelpers.*;
import static org.mockito.Mockito.verify;
public class FirebaseUserDatabaseTest {
private static final String USER_ID = "test user id";
private static final String ANOTHER_USER_ID = "another user id";
private final User user = new User(USER_ID, "test username", "http://test.photo/url");
private final User anotherUser = new User(ANOTHER_USER_ID, "another username", "http://another.url");
private final Users users = new Users(Arrays.asList(user, anotherUser));
@Mock
FirebaseDatabase mockFirebaseDatabase;
@Mock
DatabaseReference mockUsersDatabase;
@Mock
FirebaseObservableListeners mockListeners;
FirebaseUserDatabase firebaseUserDatabase;
@Before
public void setup() {
MockitoAnnotations.initMocks(this);
setupDatabaseStubsFor("users", mockUsersDatabase, mockFirebaseDatabase);
setupValueEventListenerFor(mockListeners, mockUsersDatabase, users);
setupSingleValueEventListenerFor(mockListeners, mockUsersDatabase, user);
firebaseUserDatabase = new FirebaseUserDatabase(mockFirebaseDatabase, mockListeners);
}
@Test
public void canObserveUsers() {
Observable<Users> usersObservable = firebaseUserDatabase.observeUsers();
assertValueReceivedOnNext(usersObservable, users);
}
@Test
public void whenUsersCannotBeObservedOnErrorIsCalled() {
Throwable testThrowable = new Throwable("test error");
setupErroringValueEventListenerFor(mockListeners, mockUsersDatabase, testThrowable);
Observable<Users> usersObservable = firebaseUserDatabase.observeUsers();
assertThrowableReceivedOnError(usersObservable, testThrowable);
}
@Test
public void canRetrieveUserObjectFromId() {
Observable<User> userObservable = firebaseUserDatabase.readUserFrom(USER_ID);
assertValueReceivedOnNext(userObservable, user);
}
@Test
public void canObserveUserObjectFromId() {
setupValueEventListenerFor(mockListeners, mockUsersDatabase, user);
Observable<User> userObservable = firebaseUserDatabase.observeUser(USER_ID);
assertValueReceivedOnNext(userObservable, user);
}
@Test
public void canSetNewUserValue() {
firebaseUserDatabase.writeCurrentUser(anotherUser);
verify(mockUsersDatabase).setValue(anotherUser);
}
}