package com.badoo.chateau.example.ui.conversations.create.selectusers;
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.data.model.ExampleUser;
import com.badoo.chateau.example.ui.Injector;
import com.badoo.chateau.example.ui.conversations.create.selectusers.SelectUserActivity.DefaultConfiguration;
import com.badoo.chateau.ui.conversations.create.selectusers.UserListPresenter;
import com.badoo.chateau.ui.conversations.create.selectusers.UserListPresenter.UserListFlowListener;
import com.badoo.chateau.ui.conversations.create.selectusers.UserListPresenter.UserListView;
import org.junit.Test;
import org.junit.runner.RunWith;
import java.util.ArrayList;
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.contrib.RecyclerViewActions.actionOnItemAtPosition;
import static android.support.test.espresso.matcher.ViewMatchers.withId;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
@RunWith(AndroidJUnit4.class)
public class SelectUserActivityTest extends BaseTestCase<SelectUserActivity> {
private UserListPresenter<ExampleUser> mPresenter;
private UserListView<ExampleUser> mView;
@Override
protected Class<SelectUserActivity> getActivityClass() {
return SelectUserActivity.class;
}
@Override
protected void beforeActivityLaunched() {
//noinspection unchecked
mPresenter = mock(UserListPresenter.class);
Injector.register(SelectUserActivity.class, new DefaultConfiguration() {
protected UserListView<ExampleUser> createView(@NonNull SelectUserActivity activity) {
mView = super.createView(activity);
return mView;
}
@Override
protected UserListPresenter createUserListPresenter(@NonNull UserListView<ExampleUser> userListView, @NonNull UserListFlowListener<ExampleConversation, ExampleUser> flowListener) {
return mPresenter;
}
});
}
@Test
public void startNewConversationWithUser() {
// Given
final List<ExampleUser> users = createUsers(5);
runOnUiThread(() -> mView.showUsers(users));
// When
onView(withId(R.id.createConversation_userList)).perform(actionOnItemAtPosition(0, click()));
// Then
verify(mPresenter).onUsersSelected(users.subList(0,1));
}
@Test
public void startNewConversationWithMultipleUsers() {
// Given
final List<ExampleUser> users = createUsers(5);
runOnUiThread(() -> mView.showUsers(users));
// When
onView(withId(R.id.createConversation_groupAction)).perform(click());
onView(withId(R.id.createConversation_userList)).perform(actionOnItemAtPosition(1, click()));
onView(withId(R.id.createConversation_userList)).perform(actionOnItemAtPosition(0, click()));
onView(withId(R.id.createConversation_groupAction)).perform(click());
// Then
verify(mPresenter).onUsersSelected(users.subList(0, 2));
}
@Test
public void startNewConversationWithUserAfterExitingMultiUserSelect() {
// Given
final List<ExampleUser> users = createUsers(5);
runOnUiThread(() -> mView.showUsers(users));
// When
onView(withId(R.id.createConversation_groupAction)).perform(click());
pressBack();
onView(withId(R.id.createConversation_userList)).perform(actionOnItemAtPosition(0, click()));
// Then
verify(mPresenter).onUsersSelected(users.subList(0, 1));
}
@Test
public void startNewConversationWithMultipleUsersAfterSelectionChange() {
// Given
final List<ExampleUser> users = createUsers(5);
runOnUiThread(() -> mView.showUsers(users));
// When
onView(withId(R.id.createConversation_groupAction)).perform(click());
onView(withId(R.id.createConversation_userList)).perform(actionOnItemAtPosition(1, click()));
onView(withId(R.id.createConversation_userList)).perform(actionOnItemAtPosition(0, click()));
onView(withId(R.id.createConversation_userList)).perform(actionOnItemAtPosition(2, click()));
onView(withId(R.id.createConversation_userList)).perform(actionOnItemAtPosition(2, click()));
onView(withId(R.id.createConversation_groupAction)).perform(click());
// Then
verify(mPresenter).onUsersSelected(users.subList(0, 2));
}
private List<ExampleUser> createUsers(int count) {
List<ExampleUser> users = new ArrayList<>();
for (int i = 0; i < count; i++) {
users.add(new ExampleUser(Integer.toString(count), "User " + i));
}
return users;
}
}