package org.commcare.android.tests.caselist; import android.app.Activity; import android.content.Intent; import android.widget.ImageButton; import com.simprints.libsimprints.Identification; import com.simprints.libsimprints.Tier; import org.commcare.CommCareApplication; import org.commcare.CommCareTestApplication; import org.commcare.activities.EntitySelectActivity; import org.commcare.activities.components.EntitySelectCalloutSetup; import org.commcare.adapters.EntityListAdapter; import org.commcare.android.CommCareTestRunner; import org.commcare.android.util.CaseLoadUtils; import org.commcare.android.util.TestAppInstaller; import org.commcare.android.util.TestUtils; import org.commcare.dalvik.R; import org.commcare.models.AndroidSessionWrapper; import org.commcare.session.CommCareSession; import org.commcare.suite.model.Callout; import org.commcare.suite.model.Detail; import org.commcare.suite.model.EntityDatum; import org.commcare.views.EntityView; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.robolectric.Shadows; import org.robolectric.annotation.Config; import org.robolectric.shadows.ShadowActivity; import java.util.ArrayList; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; /** * Test attaching callout data to entity select list * * @author Phillip Mates (pmates@dimagi.com) */ @Config(application = CommCareTestApplication.class) @RunWith(CommCareTestRunner.class) public class EntityListCalloutDataTest { private EntitySelectActivity entitySelectActivity; private EntityListAdapter adapter; @Before public void setup() { String appProfileResource = "jr://resource/commcare-apps/case_list_lookup/profile.ccpr"; TestAppInstaller.installAppAndLogin(appProfileResource, "test", "123"); TestUtils.processResourceTransactionIntoAppDb("/commcare-apps/case_list_lookup/restore.xml"); } @Test public void testAttachCalloutResultToListTest() { entitySelectActivity = CaseLoadUtils.launchEntitySelectActivity("m1-f0"); adapter = CaseLoadUtils.loadList(entitySelectActivity); assertEquals(8, adapter.getCount()); EntityView entityView = (EntityView)adapter.getView(0, null, null); int entityColumnCount = entityView.getChildCount(); performFingerprintCallout(); // ensure that the entity list is filtered by the received callout // result data (fingerprint identification list with confidence score) adapter = CaseLoadUtils.loadList(entitySelectActivity); assertEquals(5, adapter.getCurrentCount()); assertTrue(adapter.isFilteringByCalloutResult()); assertTrue(adapter.hasCalloutResponseData()); // ensure that entries in the entity list have extra data attached to them entityView = (EntityView)adapter.getView(0, null, null); assertEquals(entityColumnCount + 1, entityView.getChildCount()); clearCalloutResults(); entityView = (EntityView)adapter.getView(0, null, null); assertEquals(entityColumnCount, entityView.getChildCount()); assertEquals(8, adapter.getCurrentCount()); } @Test public void testCalloutResultWithNoColumnTest() { entitySelectActivity = CaseLoadUtils.launchEntitySelectActivity("m1-f1"); adapter = CaseLoadUtils.loadList(entitySelectActivity); assertEquals(8, adapter.getCount()); EntityView entityView = (EntityView)adapter.getView(0, null, null); int entityColumnCount = entityView.getChildCount(); performFingerprintCallout(); // ensure that the entity list is filtered by the received callout // result data (fingerprint identification list with confidence score) adapter = CaseLoadUtils.loadList(entitySelectActivity); assertEquals(5, adapter.getCurrentCount()); assertTrue(adapter.isFilteringByCalloutResult()); assertTrue(adapter.hasCalloutResponseData()); // Ensure response data isn't shown to the user, since the width is set to 0 entityView = (EntityView)adapter.getView(0, null, null); assertEquals(entityColumnCount, entityView.getChildCount()); } private void performFingerprintCallout() { // make entity list callout to 'fingerprint identification' entitySelectActivity.barcodeScanOnClickListener.onClick(null); // receive the (faked) callout result Callout identificationScanCallout = getEntitySelectCallout(); Intent calloutIntent = EntitySelectCalloutSetup.buildCalloutIntent( identificationScanCallout, entitySelectActivity.evalContext()); Intent responseIntent = buildIdentificationResultIntent(); ShadowActivity shadowEntitySelect = Shadows.shadowOf(entitySelectActivity); shadowEntitySelect.receiveResult(calloutIntent, Activity.RESULT_OK, responseIntent); } private static Intent buildIdentificationResultIntent() { Intent i = new Intent(); ArrayList<Identification> matchingList = new ArrayList<>(); matchingList.add(new Identification("b319e951-03f1-4172-b662-4fb3964a0be7", 99, Tier.TIER_1)); // stan matchingList.add(new Identification("8e011880-602f-4017-b9d6-ed9dcbba7516", 55, Tier.TIER_3)); // ellen matchingList.add(new Identification("c44c7ade-0cec-4401-b422-4c475f0043ae", 25, Tier.TIER_4)); // pat matchingList.add(new Identification("6b09e558-604c-4735-ac34-efbb2783b784", 22, Tier.TIER_4)); // aria matchingList.add(new Identification("16d31048-e8f8-40d5-a3e9-b35e9cde20da", 10, Tier.TIER_5)); // gilbert return i.putExtra("identification", matchingList); } private static Callout getEntitySelectCallout() { AndroidSessionWrapper sessionWrapper = CommCareApplication.instance().getCurrentSessionWrapper(); CommCareSession session = sessionWrapper.getSession(); EntityDatum selectDatum = (EntityDatum)session.getNeededDatum(); Detail shortSelect = session.getDetail(selectDatum.getShortDetail()); return shortSelect.getCallout(); } private void clearCalloutResults() { // clear the callout data and make sure the extra column is removed and // all the entities are shown ImageButton clearSearchButton = (ImageButton)entitySelectActivity.findViewById(R.id.clear_search_button); clearSearchButton.performClick(); } }