package org.commcare.android.tests.formentry; import android.content.Intent; import android.os.Environment; import android.view.View; import android.widget.ImageButton; import org.commcare.CommCareTestApplication; import org.commcare.activities.FormEntryActivity; import org.commcare.android.CommCareTestRunner; import org.commcare.android.util.ActivityLaunchUtils; import org.commcare.android.util.TestAppInstaller; import org.commcare.dalvik.R; import org.commcare.utils.CompoundIntentList; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.robolectric.Robolectric; import org.robolectric.annotation.Config; import org.robolectric.shadows.ShadowActivity; import org.robolectric.shadows.ShadowEnvironment; import java.util.ArrayList; import static junit.framework.Assert.assertEquals; import static junit.framework.Assert.assertTrue; import static junit.framework.Assert.assertNull; /** * @author Clayton Sims */ @Config(application = CommCareTestApplication.class) @RunWith(CommCareTestRunner.class) public class FormIntentTests { @Before public void setup() { TestAppInstaller.installAppAndLogin( "jr://resource/commcare-apps/form_entry_tests/profile.ccpr", "test", "123"); ShadowEnvironment.setExternalStorageState(Environment.MEDIA_MOUNTED); } /** * Test different behaviors for possibly grouped intent callout views */ @Test public void testIntentCalloutAggregation() { ShadowActivity shadowActivity = ActivityLaunchUtils.buildHomeActivityForFormEntryLaunch("m0-f0"); Intent formEntryIntent = shadowActivity.getNextStartedActivity(); // make sure the form entry activity should be launched String intentActivityName = formEntryIntent.getComponent().getClassName(); assertTrue(intentActivityName.equals(FormEntryActivity.class.getName())); navigateFormStructure(formEntryIntent); } private void navigateFormStructure(Intent formEntryIntent) { // launch form entry FormEntryActivity formEntryActivity = Robolectric.buildActivity(FormEntryActivity.class).withIntent(formEntryIntent) .create().start().resume().get(); ImageButton nextButton = (ImageButton)formEntryActivity.findViewById(R.id.nav_btn_next); testStandaloneIntent(formEntryActivity); nextButton.performClick(); testMultipleIntent(formEntryActivity); nextButton.performClick(); testMixedIntents(formEntryActivity); } private void testStandaloneIntent(FormEntryActivity formEntryActivity) { CompoundIntentList callout = formEntryActivity.getODKView().getAggregateIntentCallout(); assertNull("incorrectly aggregated intent callout", callout); assertEquals("Dispatch button visibility", View.GONE, formEntryActivity.findViewById(R.id.multiple_intent_dispatch_button).getVisibility()); } private void testMultipleIntent(FormEntryActivity formEntryActivity) { CompoundIntentList callout = formEntryActivity.getODKView().getAggregateIntentCallout(); assertEquals("Incorrect number of callout aggregations", 3, callout.getNumberOfCallouts()); Intent compoundIntentObject = callout.getCompoundedIntent(); String action = compoundIntentObject.getAction(); ArrayList<String> indices = compoundIntentObject.getStringArrayListExtra(CompoundIntentList.EXTRA_COMPOUND_DATA_INDICES); assertEquals("Incorreclty aggregated callout action", "org.commcare.dalvik.action.PRINT", action); String testIndex = "1,1_0,0"; assertTrue("Compound index set missing element: " + testIndex, indices.contains(testIndex)); String contextualizedBundleValue = compoundIntentObject.getBundleExtra(testIndex).getString("contextualized_value"); assertEquals("Contextualized bundle value reference", "1", contextualizedBundleValue); assertEquals("Dispatch button visibility", View.VISIBLE, formEntryActivity.findViewById(R.id.multiple_intent_dispatch_button).getVisibility()); } private void testMixedIntents(FormEntryActivity formEntryActivity) { CompoundIntentList callout = formEntryActivity.getODKView().getAggregateIntentCallout(); assertNull("Should not have aggregated mixed intents", callout); assertEquals("Dispatch button visibility", View.GONE, formEntryActivity.findViewById(R.id.multiple_intent_dispatch_button).getVisibility()); } }