package com.novoda.bonfire.helpers;
import android.support.annotation.NonNull;
import com.google.firebase.database.DataSnapshot;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.novoda.bonfire.rx.FirebaseObservableListeners;
import rx.Observable;
import rx.functions.Func1;
import rx.observers.TestSubscriber;
import static org.mockito.Matchers.*;
import static org.mockito.Mockito.when;
public class FirebaseTestHelpers {
public static void setupDatabaseStubsFor(String databaseName, DatabaseReference databaseReference, FirebaseDatabase firebaseDatabase) {
when(firebaseDatabase.getReference(databaseName)).thenReturn(databaseReference);
when(databaseReference.child(anyString())).thenReturn(databaseReference);
when(databaseReference.push()).thenReturn(databaseReference);
when(databaseReference.limitToLast(anyInt())).thenReturn(databaseReference);
}
public static <T> void setupValueEventListenerFor(
FirebaseObservableListeners listeners,
DatabaseReference databaseReference,
T returnValue) {
setupValueEventListenerWithObservable(listeners, databaseReference, Observable.just(returnValue));
}
public static void setupErroringValueEventListenerFor(
FirebaseObservableListeners listeners,
DatabaseReference databaseReference,
Throwable throwable) {
setupValueEventListenerWithObservable(listeners, databaseReference, Observable.error(throwable));
}
private static <T> void setupValueEventListenerWithObservable(
FirebaseObservableListeners listeners,
DatabaseReference databaseReference,
Observable<T> observable) {
when(listeners.listenToValueEvents(
eq(databaseReference),
any(FirebaseTestHelpers.<T>marshallerType())
)
).thenReturn(observable);
}
public static <T> void setupSingleValueEventListenerFor(
FirebaseObservableListeners listeners,
DatabaseReference databaseReference,
T returnValue) {
when(listeners.listenToSingleValueEvents(
eq(databaseReference),
any(FirebaseTestHelpers.<T>marshallerType())
)
).thenReturn(Observable.just(returnValue));
}
public static <T> void assertValueReceivedOnNext(Observable<T> observable, T expectedValue) {
TestSubscriber<T> testSubscriber = testSubscriberFor(observable);
testSubscriber.assertValue(expectedValue);
}
public static <T> void assertThrowableReceivedOnError(Observable<T> observable, Throwable throwable) {
TestSubscriber<T> testSubscriber = testSubscriberFor(observable);
testSubscriber.assertError(throwable);
}
@NonNull
private static <T> TestSubscriber<T> testSubscriberFor(Observable<T> observable) {
TestSubscriber<T> testSubscriber = new TestSubscriber<>();
observable.subscribe(testSubscriber);
return testSubscriber;
}
private static <T> Class<Func1<DataSnapshot, T>> marshallerType() {
return (Class<Func1<DataSnapshot, T>>) (Class) Func1.class;
}
}