package com.novoda.bonfire.chat.database;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.novoda.bonfire.channel.data.model.Channel;
import com.novoda.bonfire.chat.data.model.Chat;
import com.novoda.bonfire.chat.data.model.Message;
import com.novoda.bonfire.rx.FirebaseObservableListeners;
import com.novoda.bonfire.user.data.model.User;
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 FirebaseChatDatabaseTest {
private final Channel channel = new Channel("a channel", Channel.Access.PUBLIC);
private final User user = new User("user id", "user", "http://photo");
private final User anotherUser = new User("another user id", "another user", "http://photo");
private final Chat chatForChannel = new Chat(Arrays.asList(new Message(user, "hey!"), new Message(anotherUser, "hey yourself")));
@Mock
FirebaseObservableListeners mockListeners;
@Mock
FirebaseDatabase mockFirebaseDatabase;
@Mock
DatabaseReference mockMessagesDatabase;
FirebaseChatDatabase firebaseChatDatabase;
@Before
public void setup() {
MockitoAnnotations.initMocks(this);
setupDatabaseStubsFor("messages", mockMessagesDatabase, mockFirebaseDatabase);
setupValueEventListenerFor(mockListeners, mockMessagesDatabase, chatForChannel);
firebaseChatDatabase = new FirebaseChatDatabase(mockFirebaseDatabase, mockListeners);
}
@Test
public void subscriberReceivesChatWhenObserving() {
Observable<Chat> chatObservable = firebaseChatDatabase.observeChat(channel);
assertValueReceivedOnNext(chatObservable, chatForChannel);
}
@Test
public void subscriberReceivesErrorWhenChatCannotBeObserved() {
Throwable testThrowable = new Throwable("test throwable");
setupErroringValueEventListenerFor(mockListeners, mockMessagesDatabase, testThrowable);
Observable<Chat> observable = firebaseChatDatabase.observeChat(channel);
assertThrowableReceivedOnError(observable, testThrowable);
}
@Test
public void newMessagesArePushedThenSet() {
Message message = new Message(anotherUser, "another message");
firebaseChatDatabase.sendMessage(channel, message);
verify(mockMessagesDatabase).push();
verify(mockMessagesDatabase).setValue(message);
}
}