package com.badoo.chateau.example.ui.conversations.list;
import android.support.annotation.NonNull;
import android.support.test.runner.AndroidJUnit4;
import com.badoo.chateau.example.BaseTestCase;
import com.badoo.chateau.example.R;
import com.badoo.chateau.example.data.model.ExampleConversation;
import com.badoo.chateau.example.ui.Injector;
import com.badoo.chateau.example.ui.conversations.list.CreateConversationPresenter.CreateConversationFlowListener;
import com.badoo.chateau.example.ui.conversations.list.CreateConversationPresenter.CreateConversationView;
import com.badoo.chateau.ui.conversations.list.ConversationListPresenter;
import com.badoo.chateau.ui.conversations.list.ConversationListPresenter.ConversationListFlowListener;
import com.badoo.chateau.ui.conversations.list.ConversationListPresenter.ConversationListView;
import org.junit.Test;
import org.junit.runner.RunWith;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import static android.support.test.espresso.Espresso.onView;
import static android.support.test.espresso.Espresso.pressBack;
import static android.support.test.espresso.action.ViewActions.click;
import static android.support.test.espresso.action.ViewActions.longClick;
import static android.support.test.espresso.contrib.RecyclerViewActions.actionOnItemAtPosition;
import static android.support.test.espresso.matcher.ViewMatchers.withId;
import static com.badoo.chateau.example.ui.conversations.list.ConversationListActivity.*;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
@RunWith(AndroidJUnit4.class)
public class ConversationListActivityTest extends BaseTestCase<ConversationListActivity> {
private ConversationListPresenter<ExampleConversation> mListPresenter;
private ExampleConversationListView mListView;
private CreateConversationPresenter mCreateConversationPresenter;
@Override
protected Class<ConversationListActivity> getActivityClass() {
return ConversationListActivity.class;
}
@Override
protected void beforeActivityLaunched() {
mListPresenter = mock(ConversationListPresenter.class);
mCreateConversationPresenter = mock(CreateConversationPresenter.class);
Injector.register(ConversationListActivity.class, new DefaultConfiguration() {
@Override
protected ExampleConversationListView createConversationListView(@NonNull ConversationListActivity activity) {
mListView = super.createConversationListView(activity);
return mListView;
}
@Override
protected ConversationListPresenter<ExampleConversation> createConversationListPresenter(@NonNull ConversationListView<ExampleConversation> view, @NonNull ConversationListFlowListener<ExampleConversation> flowListener) {
return mListPresenter;
}
@Override
protected CreateConversationPresenter createCreateConversationPresenter(@NonNull CreateConversationView view, @NonNull CreateConversationFlowListener flowListener) {
return mCreateConversationPresenter;
}
});
}
@Test
public void startNewConversation() {
// When
onView(withId(R.id.conversations_start_new_chat_button)).perform(click());
// Then
verify(mCreateConversationPresenter).onCreateNewConversationClicked();
}
@Test
public void openConversation() {
// Given
List<ExampleConversation> conversations = createConversations(5);
runOnUiThread(() -> mListView.showConversations(conversations));
// When
onView(withId(R.id.conversations_list)).perform(actionOnItemAtPosition(0, click()));
// Then
verify(mListPresenter).onConversationClicked(conversations.get(0));
}
@Test
public void deleteSingleConversation() {
// Given
List<ExampleConversation> conversations = createConversations(5);
runOnUiThread(() -> mListView.showConversations(conversations));
// When
onView(withId(R.id.conversations_list)).perform(actionOnItemAtPosition(0, longClick()));
onView(withId(R.id.action_delete)).perform(click());
// Then
verify(mListPresenter).onDeleteConversations(Collections.singletonList(conversations.get(0)));
}
@Test
public void deleteMultipleConversations() {
// Given
List<ExampleConversation> conversations = createConversations(5);
runOnUiThread(() -> mListView.showConversations(conversations));
// When
onView(withId(R.id.conversations_list)).perform(actionOnItemAtPosition(0, longClick()));
onView(withId(R.id.conversations_list)).perform(actionOnItemAtPosition(2, click()));
onView(withId(R.id.action_delete)).perform(click());
// Then
List<ExampleConversation> expected = new ArrayList<>();
expected.add(conversations.get(0));
expected.add(conversations.get(2));
verify(mListPresenter).onDeleteConversations(expected);
}
@Test
public void backPressCancelsSelection() {
// Given
List<ExampleConversation> conversations = createConversations(5);
runOnUiThread(() -> mListView.showConversations(conversations));
// When
onView(withId(R.id.conversations_list)).perform(actionOnItemAtPosition(0, longClick())); // Enter selection mode
pressBack();
onView(withId(R.id.conversations_list)).perform(actionOnItemAtPosition(2, click())); // This should now open the conversation
// Then
verify(mListPresenter).onConversationClicked(conversations.get(2));
}
@Test
public void unselectingOnlySelectedItemCancelsSelection() {
// Given
List<ExampleConversation> conversations = createConversations(5);
runOnUiThread(() -> mListView.showConversations(conversations));
// When
onView(withId(R.id.conversations_list)).perform(actionOnItemAtPosition(1, longClick())); // Enter selection mode
onView(withId(R.id.conversations_list)).perform(actionOnItemAtPosition(1, click())); // This should cancel selection mode
onView(withId(R.id.conversations_list)).perform(actionOnItemAtPosition(1, click())); // This should now open the conversation
// Then
verify(mListPresenter).onConversationClicked(conversations.get(1));
}
private List<ExampleConversation> createConversations(int count) {
List<ExampleConversation> conversations = new ArrayList<>();
for (int i = 0; i < count; i++) {
conversations.add(new ExampleConversation(Integer.toString(i), Integer.toString(i), Collections.emptyList(), null, 0));
}
return conversations;
}
}