package jp.webpay.android.token.ui;
import android.app.AlertDialog;
import android.view.View;
import android.widget.Button;
import android.widget.LinearLayout;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.robolectric.Robolectric;
import org.robolectric.annotation.Config;
import org.robolectric.util.ActivityController;
import java.util.Arrays;
import jp.webpay.android.token.R;
import jp.webpay.android.token.model.CardType;
import jp.webpay.android.token.ui.field.NumberField;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
// This test is to check that Activities can directly use CardDialogFragment.
// Test logic and other behaviors in WebPayTokenFragmentTest.
@Config(manifest = "./src/main/AndroidManifestTest.xml", emulateSdk = 18)
@RunWith(RobolectricTestRunnerWithDummyResources.class)
public class CardDialogFragmentTest {
private static final String dummyKey = "test_public_dummykey";
private CardDialogActivity activity;
private CardDialogFragment dialogFragment;
private AlertDialog dialog;
@Test
public void testFragmentShowsOneSupportedCardType() throws Exception {
prepareActivity(CardDialogFragment.newInstance(dummyKey, Arrays.asList(CardType.JCB)));
LinearLayout layout = (LinearLayout) dialog.findViewById(R.id.cardTypeIconList);
assertEquals(View.VISIBLE, layout.getVisibility());
assertEquals(1, layout.getChildCount());
}
@Test
public void testFragmentHidesSupportedCardTypesRegionWhenNotGiven() throws Exception {
prepareActivity(CardDialogFragment.newInstance(dummyKey, null));
assertEquals(View.GONE, dialog.findViewById(R.id.cardTypeLabel).getVisibility());
assertEquals(View.GONE, dialog.findViewById(R.id.cardTypeIconList).getVisibility());
NumberField numberField = (NumberField) dialog.findViewById(R.id.cardNumberField);
numberField.requestFocus();
numberField.setText("378282246310005");
numberField.clearFocus();
assertTrue(numberField.isValid());
}
@Test
public void testSetSendButtonTextBeforeFragmentIsCreated() throws Exception {
CardDialogFragment fragment = CardDialogFragment.newInstance(dummyKey, CardType.VM());
// adding stub resource from test is difficult, substitute with indifferent string
fragment.setSendButtonTitle(R.string.field_name_hint);
prepareActivity(fragment);
assertEquals(activity.getString(R.string.field_name_hint), ((Button) dialog.findViewById(R.id.button_submit)).getText().toString());
}
@Test
public void testSetSendButtonTextAfterFragmentIsCreated() throws Exception {
CardDialogFragment fragment = CardDialogFragment.newInstance(dummyKey, CardType.VM());
prepareActivity(fragment);
Button button = (Button) dialog.findViewById(R.id.button_submit);
assertEquals(activity.getString(R.string.card_send), button.getText().toString());
fragment.setSendButtonTitle(R.string.field_name_hint);
assertEquals(activity.getString(R.string.field_name_hint), button.getText().toString());
}
@Test
public void testFragmentCallbackOnCancel() throws Exception {
prepareActivity(CardDialogFragment.newInstance(dummyKey, CardType.VM()));
assertFalse(activity.isCancelled());
assertTrue(dialogFragment.isAdded());
assertTrue(dialog.isShowing());
dialog.findViewById(R.id.button_cancel).performClick();
assertTrue(activity.isCancelled());
assertFalse(dialog.isShowing());
}
private void prepareActivity(CardDialogFragment fragment) {
ActivityController<CardDialogActivity> activityController = Robolectric.buildActivity(CardDialogActivity.class);
activityController.get().setFragment(fragment);
activity = activityController.create().visible().start().get();
dialogFragment = (CardDialogFragment) activity.getSupportFragmentManager().findFragmentByTag(CardDialogActivity.FRAGMENT_TAG);
dialog = (AlertDialog) dialogFragment.getDialog();
}
}