package org.iilab.pb.common;
import android.content.Intent;
import android.database.Cursor;
import android.net.Uri;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
import android.widget.EditText;
import android.widget.ImageButton;
import org.iilab.pb.R;
import org.iilab.pb.common.ContactPickerFragment;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.robolectric.RobolectricTestRunner;
import org.robolectric.shadows.ShadowActivity;
import org.robolectric.tester.android.database.SimpleTestCursor;
import static android.app.Activity.RESULT_CANCELED;
import static android.app.Activity.RESULT_OK;
import static android.content.Intent.ACTION_GET_CONTENT;
import static android.provider.ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE;
import static org.hamcrest.CoreMatchers.equalTo;
import static org.iilab.pb.R.id.contact_picker_button;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertThat;
import static org.robolectric.Robolectric.shadowOf;
@RunWith(RobolectricTestRunner.class)
public class ContactPickerFragmentTest {
private ContactPickerFragment contactPickerFragment;
private final String expectedPhoneNumber = "123456789";
private EditText contactEditText;
@Before
public void setUp() {
contactPickerFragment = new ContactPickerFragment() {
Cursor getCursor(Uri contactData, String[] projection) {
SimpleTestCursor simpleTestCursor = new SimpleTestCursor();
simpleTestCursor.setResults(new Object[][]{new Object[]{expectedPhoneNumber}});
return simpleTestCursor;
}
};
FragmentManager fragmentManager = new FragmentActivity().getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.add(contactPickerFragment, null);
fragmentTransaction.commit();
contactEditText = (EditText) contactPickerFragment.getView().findViewById(R.id.contact_edit_text);
}
@Test
public void shouldOpenContactsOnClick() {
ImageButton contactPickerButton = (ImageButton) contactPickerFragment.getView().findViewById(contact_picker_button);
contactPickerButton.performClick();
ShadowActivity shadowActivity = shadowOf(contactPickerFragment.getActivity());
ShadowActivity.IntentForResult startedIntentForResult = shadowActivity.getNextStartedActivityForResult();
Intent intent = startedIntentForResult.intent;
assertThat(intent.getAction(), equalTo(ACTION_GET_CONTENT));
assertThat(intent.getType(), equalTo(CONTENT_ITEM_TYPE));
}
@Test
public void shouldDisplayTheSelectedContactNumber() {
Uri.Builder uriBuilder = Uri.parse("content://com.android.contacts/data/6802").buildUpon();
Uri contactURI = uriBuilder.build();
Intent intent = new Intent();
intent.setData(contactURI);
contactPickerFragment.onActivityResult(100, RESULT_OK, intent);
assertEquals(expectedPhoneNumber, contactEditText.getText().toString());
}
@Test
public void shouldNotChangeThePhoneForNonContactApplication() {
contactPickerFragment.onActivityResult(7, RESULT_OK, new Intent());
assertEquals("", contactEditText.getText().toString());
}
@Test
public void shouldNotChangeThePhoneWhenContactApplicationIsCanceled() {
contactPickerFragment.onActivityResult(100, RESULT_CANCELED, new Intent());
assertEquals("", contactEditText.getText().toString());
}
}