package com.badoo.chateau.example.data.repos.messages;
import android.support.annotation.NonNull;
import android.support.v4.content.LocalBroadcastManager;
import com.badoo.chateau.core.repos.messages.MessageDataSource.Update;
import com.badoo.chateau.core.repos.messages.MessageQueries;
import com.badoo.chateau.example.data.model.ExampleMessage;
import com.badoo.chateau.example.data.repos.messages.ParseMessageDataSource.ImageUploader;
import com.badoo.chateau.example.data.util.ParseHelper;
import com.badoo.chateau.example.data.util.ParseUtils;
import com.badoo.chateau.example.data.util.ParseUtils.MessagesTable;
import com.badoo.unittest.rx.BaseRxTestCase;
import com.parse.ParseObject;
import com.parse.ParseUser;
import org.hamcrest.CustomMatcher;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.runners.MockitoJUnitRunner;
import rx.Observable;
import rx.observers.TestSubscriber;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.argThat;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
@RunWith(MockitoJUnitRunner.class)
public class ParseMessageDataSourceTest extends BaseRxTestCase {
private static final String TEST_CHAT_ID = "chatId";
@Mock
private ImageUploader mImageUploader;
@Mock
private ParseHelper mMockParseHelper;
@Mock
private LocalBroadcastManager mBroadcastManager;
@Mock
private ParseUser mUser;
private ParseMessageDataSource mTarget;
// Use to listen for publishes of sent messages
private Observable<Update<ExampleMessage>> mUpdates;
@Before
public void beforeTest() {
super.beforeTest();
mTarget = new ParseMessageDataSource(mBroadcastManager, mImageUploader, mMockParseHelper);
mUpdates = mTarget.subscribe(new MessageQueries.SubscribeQuery<>(TEST_CHAT_ID));
mockCurrentUser("userId");
}
@Test
public void sendTextMessage() {
// Setup
ExampleMessage message = ExampleMessage.createOutgoingTextMessage(TEST_CHAT_ID, "Hello world");
final MessageQueries.SendQuery<ExampleMessage> sendQuery = new MessageQueries.SendQuery<>(TEST_CHAT_ID, message);
final TestSubscriber<Update<ExampleMessage>> testSubscriber = new TestSubscriber<>();
// Execute
mUpdates.subscribe(testSubscriber);
mTarget.send(sendQuery).subscribe();
// Assert
verify(mMockParseHelper).save(argThat(new CustomMatcher<ParseObject>("") {
@Override
public boolean matches(Object item) {
final ParseObject parseMessage = (ParseObject) item;
return parseMessage.getClassName().equals(MessagesTable.NAME);
}
}));
testSubscriber.assertValueCount(2);
}
private ParseUser mockCurrentUser(@NonNull String userId) {
final ParseUser mockUser = mock(ParseUser.class);
when(mockUser.getObjectId()).thenReturn(userId);
when(mMockParseHelper.getCurrentUser()).thenReturn(mockUser);
return mockUser;
}
}