package org.commcare.android.tests.activities; import android.content.Intent; import android.os.Environment; import android.widget.ListView; import org.commcare.CommCareTestApplication; import org.commcare.activities.StandardHomeActivity; import org.commcare.activities.FormEntryActivity; import org.commcare.activities.FormRecordListActivity; import org.commcare.adapters.IncompleteFormListAdapter; import org.commcare.android.CommCareTestRunner; import org.commcare.android.database.user.models.FormRecord; import org.commcare.android.util.SavedFormLoader; import org.commcare.android.util.TestAppInstaller; import org.commcare.dalvik.R; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.robolectric.Robolectric; import org.robolectric.RuntimeEnvironment; import org.robolectric.Shadows; import org.robolectric.annotation.Config; import org.robolectric.shadows.ShadowActivity; import org.robolectric.shadows.ShadowEnvironment; import org.robolectric.shadows.ShadowListView; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; /** * @author Phillip Mates (pmates@dimagi.com) */ @Config(application = CommCareTestApplication.class) @RunWith(CommCareTestRunner.class) public class FormRecordListActivityTest { @Before public void setup() { TestAppInstaller.installAppAndLogin( "jr://resource/commcare-apps/form_nav_tests/profile.ccpr", "test", "123"); SavedFormLoader.loadFormsFromPayload("/commcare-apps/form_nav_tests/form_instances_restore.xml", FormRecord.STATUS_SAVED); } /** * Opens up the saved form list activity, checks that 2 forms are listed, * and opens the first one */ @Test public void openSavedFormViewTest() { openASavedForm(2, 0); } public static void openASavedForm(int expectedFormCount, int formIndexToSelect) { Intent savedFormsIntent = new Intent(RuntimeEnvironment.application, FormRecordListActivity.class); ShadowActivity homeActivityShadow = prepSavedFormsActivity(savedFormsIntent); FormRecordListActivity savedFormsActivity = Robolectric.buildActivity(FormRecordListActivity.class) .withIntent(savedFormsIntent).create().start() .resume().get(); // wait for saved forms to load Robolectric.flushBackgroundThreadScheduler(); Robolectric.flushForegroundThreadScheduler(); ShadowListView shadowEntityList = assertSavedFormEntries(expectedFormCount, savedFormsActivity); shadowEntityList.performItemClick(formIndexToSelect); launchFormEntryForSavedForm(homeActivityShadow, savedFormsIntent, savedFormsActivity); } private static ShadowActivity prepSavedFormsActivity(Intent savedFormsIntent) { StandardHomeActivity homeActivity = Robolectric.buildActivity(StandardHomeActivity.class).create().get(); ShadowActivity homeActivityShadow = Shadows.shadowOf(homeActivity); homeActivityShadow.startActivityForResult(savedFormsIntent, StandardHomeActivity.GET_INCOMPLETE_FORM); // Call this to remove activity from stack, so we can access future activities... homeActivityShadow.getNextStartedActivityForResult(); return homeActivityShadow; } private static ShadowListView assertSavedFormEntries(int expectedFormCount, FormRecordListActivity savedFormActivity) { ListView entityList = (ListView)savedFormActivity.findViewById(R.id.screen_entity_select_list); IncompleteFormListAdapter adapter = (IncompleteFormListAdapter)entityList.getAdapter(); adapter.setFormFilter(FormRecordListActivity.FormRecordFilter.Submitted); adapter.resetRecords(); assertEquals(expectedFormCount, adapter.getCount()); return Shadows.shadowOf(entityList); } private static void launchFormEntryForSavedForm(ShadowActivity homeActivityShadow, Intent savedFormsIntent, FormRecordListActivity savedFormsActivity) { ShadowEnvironment.setExternalStorageState(Environment.MEDIA_MOUNTED); ShadowActivity formRecordShadow = Shadows.shadowOf(savedFormsActivity); homeActivityShadow.receiveResult(savedFormsIntent, formRecordShadow.getResultCode(), formRecordShadow.getResultIntent()); ShadowActivity.IntentForResult formEntryIntent = homeActivityShadow.getNextStartedActivityForResult(); Robolectric.buildActivity(FormEntryActivity.class) .withIntent(formEntryIntent.intent) .create().start().resume().get(); Robolectric.flushBackgroundThreadScheduler(); Robolectric.flushForegroundThreadScheduler(); assertNotNull(FormEntryActivity.mFormController); } }