package org.glucosio.android.adapter;
import android.content.res.Resources;
import android.support.annotation.IdRes;
import android.support.v7.app.AppCompatActivity;
import android.view.ViewGroup;
import android.widget.TextView;
import org.glucosio.android.R;
import org.glucosio.android.RobolectricTest;
import org.glucosio.android.object.ActionTip;
import org.glucosio.android.presenter.AssistantPresenter;
import org.junit.Before;
import org.junit.Test;
import org.mockito.Mock;
import org.robolectric.Robolectric;
import java.util.ArrayList;
import java.util.List;
import static org.assertj.android.api.Assertions.assertThat;
import static org.mockito.Mockito.verify;
import static org.mockito.MockitoAnnotations.initMocks;
public class AssistantAdapterTest extends RobolectricTest {
private AppCompatActivity activity;
private ViewGroup viewGroup;
private AssistantAdapter adapter;
private String[] actionTipTitles;
@Mock
private AssistantPresenter presenterMock;
private String[] actionTipDescriptions;
private String[] actionTipActions;
@Before
public void setUp() throws Exception {
initMocks(this);
activity = Robolectric.buildActivity(AppCompatActivity.class).create().get();
viewGroup = (ViewGroup) activity.findViewById(android.R.id.content);
List<ActionTip> tips = prepareTips();
adapter = new AssistantAdapter(presenterMock, activity.getResources(), tips);
}
private List<ActionTip> prepareTips() {
List<ActionTip> actionTips = new ArrayList<>();
Resources r = activity.getResources();
actionTipTitles = r.getStringArray(R.array.assistant_titles);
actionTipDescriptions = r.getStringArray(R.array.assistant_descriptions);
actionTipActions = r.getStringArray(R.array.assistant_actions);
for (int i = 0; i < actionTipTitles.length; i++) {
String actionTipTitle = actionTipTitles[i];
String actionTipDescription = actionTipDescriptions[i];
String actionTipAction = actionTipActions[i];
ActionTip actionTip = new ActionTip();
actionTip.setTipTitle(actionTipTitle);
actionTip.setTipDescription(actionTipDescription);
actionTip.setTipAction(actionTipAction);
actionTips.add(actionTip);
}
return actionTips;
}
@Test
public void CorrectlyBindRows() throws Exception {
for (int i = 0; i < actionTipTitles.length; i++) {
AssistantAdapter.ViewHolder holder = createAndBindViewHolder(i);
assertThat(getTextView(holder, R.id.fragment_assistant_item_title))
.hasText(actionTipTitles[i]);
assertThat(getTextView(holder, R.id.fragment_assistant_item_description))
.hasText(actionTipDescriptions[i]);
assertThat(getTextView(holder, R.id.fragment_assistant_item_action))
.hasText(actionTipActions[i]);
}
}
private TextView getTextView(AssistantAdapter.ViewHolder holder, @IdRes int viewId) {
return (TextView) holder.mView.findViewById(viewId);
}
@Test
public void CallPresenter_WhenFeedbackAsked() throws Exception {
int position = findIndex(activity.getString(R.string.assistant_feedback_title));
AssistantAdapter.ViewHolder holder = createAndBindViewHolder(position);
clickActionButton(holder);
verify(presenterMock).userSupportAsked();
}
private boolean clickActionButton(AssistantAdapter.ViewHolder holder) {
return holder.mView.findViewById(R.id.fragment_assistant_item_action).performClick();
}
private AssistantAdapter.ViewHolder createAndBindViewHolder(int position) {
final AssistantAdapter.ViewHolder holder = adapter.onCreateViewHolder(viewGroup, -1);
adapter.onBindViewHolder(holder, position);
return holder;
}
private int findIndex(String titleString) {
for (int i = 0; i < actionTipTitles.length; i++) {
if (actionTipTitles[i].equals(titleString)) {
return i;
}
}
return -1;
}
@Test
public void CallPresenter_WhenExportAsked() throws Exception {
int position = findIndex(activity.getString(R.string.assistant_export_title));
AssistantAdapter.ViewHolder holder = createAndBindViewHolder(position);
clickActionButton(holder);
verify(presenterMock).userAskedExport();
}
@Test
public void CallPresenter_WhenA1CCalculatorAsked() throws Exception {
int position = findIndex(activity.getString(R.string.assistant_calculator_a1c_title));
AssistantAdapter.ViewHolder holder = createAndBindViewHolder(position);
clickActionButton(holder);
verify(presenterMock).userAskedA1CCalculator();
}
@Test
public void CallPresenter_WhenAddReadingAsked() throws Exception {
int position = findIndex(activity.getString(R.string.assistant_reading_title));
AssistantAdapter.ViewHolder holder = createAndBindViewHolder(position);
clickActionButton(holder);
verify(presenterMock).userAskedAddReading();
}
}