package org.commcare.android.tests.activities;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.TextView;
import org.commcare.CommCareApplication;
import org.commcare.CommCareTestApplication;
import org.commcare.activities.QueryRequestActivity;
import org.commcare.android.CommCareTestRunner;
import org.commcare.android.mocks.ModernHttpRequesterMock;
import org.commcare.android.util.TestAppInstaller;
import org.commcare.dalvik.R;
import org.commcare.models.AndroidSessionWrapper;
import org.commcare.session.CommCareSession;
import org.javarosa.core.services.locale.Localization;
import org.junit.Assert;
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.ShadowToast;
import org.robolectric.util.ActivityController;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
/**
* @author Phillip Mates (pmates@dimagi.com)
*/
@Config(application = CommCareTestApplication.class)
@RunWith(CommCareTestRunner.class)
public class QueryRequestActivityTest {
@Before
public void setup() {
TestAppInstaller.installAppAndLogin(
"jr://resource/commcare-apps/case_search_and_claim/profile.ccpr",
"test", "123");
}
/**
* Launch the query activity when a query datum isn't at the next needed
* datum in the session
*/
@Test
public void launchQueryActivityAtWrongTimeTest() {
Intent queryActivityIntent =
new Intent(RuntimeEnvironment.application, QueryRequestActivity.class);
QueryRequestActivity queryRequestActivity =
Robolectric.buildActivity(QueryRequestActivity.class)
.withIntent(queryActivityIntent).setup().get();
assertEquals(Activity.RESULT_CANCELED,
Shadows.shadowOf(queryRequestActivity).getResultCode());
assertTrue(queryRequestActivity.isFinishing());
}
/**
* Launch query activity, fill out query prompts, make request, and store
* result in session. Checks request URL is built correctly.
*/
@Test
public void makeSuccessfulQueryRequestTest() {
setSessionCommand("patient-search");
ModernHttpRequesterMock.setResponseCodes(new Integer[]{200});
ModernHttpRequesterMock.setExpectedUrls(
new String[]{"https://www.fake.com/patient_search/?patient_id=123&name=francisco&device_id=000000000000000"});
ModernHttpRequesterMock.setRequestPayloads(
new String[]{"jr://resource/commcare-apps/case_search_and_claim/good-query-result.xml"});
Intent queryActivityIntent =
new Intent(RuntimeEnvironment.application, QueryRequestActivity.class);
QueryRequestActivity queryRequestActivity =
Robolectric.buildActivity(QueryRequestActivity.class)
.withIntent(queryActivityIntent).setup().get();
LinearLayout promptsLayout =
(LinearLayout)queryRequestActivity.findViewById(R.id.query_prompts);
EditText patientName = (EditText)promptsLayout.getChildAt(1);
patientName.setText("francisco");
EditText patientId = (EditText)promptsLayout.getChildAt(3);
patientId.setText("123");
Button queryButton = (Button)queryRequestActivity.findViewById(R.id.request_button);
queryButton.performClick();
assertEquals(Activity.RESULT_OK,
Shadows.shadowOf(queryRequestActivity).getResultCode());
assertTrue(queryRequestActivity.isFinishing());
}
/**
* Make query whose response isn't in the correct format and check the
* error message displayed
*/
@Test
public void makeQueryWithBadServerPayloadTest() {
setSessionCommand("patient-search");
ModernHttpRequesterMock.setResponseCodes(new Integer[]{200});
ModernHttpRequesterMock.setExpectedUrls(
new String[]{"https://www.fake.com/patient_search/?patient_id=123&name=francisco&device_id=000000000000000"});
ModernHttpRequesterMock.setRequestPayloads(
new String[]{"jr://resource/commcare-apps/case_search_and_claim/bad-query-result.xml"});
Intent queryActivityIntent =
new Intent(RuntimeEnvironment.application, QueryRequestActivity.class);
ActivityController<QueryRequestActivity> controller =
Robolectric.buildActivity(QueryRequestActivity.class)
.withIntent(queryActivityIntent).setup();
QueryRequestActivity queryRequestActivity = controller.get();
LinearLayout promptsLayout =
(LinearLayout)queryRequestActivity.findViewById(R.id.query_prompts);
EditText patientName = (EditText)promptsLayout.getChildAt(1);
patientName.setText("francisco");
EditText patientId = (EditText)promptsLayout.getChildAt(3);
patientId.setText("123");
Button queryButton =
(Button)queryRequestActivity.findViewById(R.id.request_button);
queryButton.performClick();
TextView errorMessage = (TextView)queryRequestActivity.findViewById(R.id.error_message);
assertEquals(View.VISIBLE, errorMessage.getVisibility());
String expectedErrorPart = Localization.get("query.response.format.error", "");
assertTrue(((String)errorMessage.getText()).contains(expectedErrorPart));
// serialize app state into bundle
Bundle savedInstanceState = new Bundle();
controller.saveInstanceState(savedInstanceState);
// start new activity with serialized app state
queryRequestActivity = Robolectric.buildActivity(QueryRequestActivity.class)
.withIntent(queryActivityIntent).setup(savedInstanceState).get();
// check that the error message is still there
errorMessage = (TextView)queryRequestActivity.findViewById(R.id.error_message);
assertEquals(View.VISIBLE, errorMessage.getVisibility());
assertTrue(((String)errorMessage.getText()).contains(expectedErrorPart));
}
/**
* Start filling out query parameters and then 'rotate' the screen to see
* if text entry is restored
*/
@Test
public void reloadQueryActivityStateTest() {
setSessionCommand("patient-search");
Intent queryActivityIntent =
new Intent(RuntimeEnvironment.application, QueryRequestActivity.class);
ActivityController<QueryRequestActivity> controller =
Robolectric.buildActivity(QueryRequestActivity.class)
.withIntent(queryActivityIntent).create().start().resume();
QueryRequestActivity queryRequestActivity = controller.get();
LinearLayout promptsLayout =
(LinearLayout)queryRequestActivity.findViewById(R.id.query_prompts);
EditText patientId = (EditText)promptsLayout.getChildAt(1);
patientId.setText("123");
// serialize app state into bundle
Bundle savedInstanceState = new Bundle();
controller.saveInstanceState(savedInstanceState);
// start new activity with serialized app state
queryRequestActivity = Robolectric.buildActivity(QueryRequestActivity.class)
.withIntent(queryActivityIntent).setup(savedInstanceState).get();
// check that the query prompts are filled out still
promptsLayout = (LinearLayout)queryRequestActivity.findViewById(R.id.query_prompts);
patientId = (EditText)promptsLayout.getChildAt(1);
assertEquals("123", patientId.getText().toString());
patientId = (EditText)promptsLayout.getChildAt(3);
assertEquals("", patientId.getText().toString());
}
/**
* Make query with empty response, which should result in a toast, not advancing forward
*/
@Test
public void receiveEmptyQueryResultTest() {
setSessionCommand("patient-search");
ModernHttpRequesterMock.setResponseCodes(new Integer[]{200, 200, 200});
ModernHttpRequesterMock.setExpectedUrls(
new String[]{"https://www.fake.com/patient_search/?name=francisco&device_id=000000000000000"});
ModernHttpRequesterMock.setRequestPayloads(
new String[]{"jr://resource/commcare-apps/case_search_and_claim/empty-query-result-one-tag.xml",
"jr://resource/commcare-apps/case_search_and_claim/empty-query-result-two-tags.xml",
"jr://resource/commcare-apps/case_search_and_claim/single-query-result.xml"});
Intent queryActivityIntent =
new Intent(RuntimeEnvironment.application, QueryRequestActivity.class);
ActivityController<QueryRequestActivity> controller =
Robolectric.buildActivity(QueryRequestActivity.class)
.withIntent(queryActivityIntent).setup();
QueryRequestActivity queryRequestActivity = controller.get();
LinearLayout promptsLayout =
(LinearLayout)queryRequestActivity.findViewById(R.id.query_prompts);
EditText patientName = (EditText)promptsLayout.getChildAt(1);
patientName.setText("francisco");
Button queryButton =
(Button)queryRequestActivity.findViewById(R.id.request_button);
queryButton.performClick();
Assert.assertEquals(Localization.get("query.response.empty"),
ShadowToast.getTextOfLatestToast());
queryButton.performClick();
Assert.assertEquals(Localization.get("query.response.empty"),
ShadowToast.getTextOfLatestToast());
queryButton.performClick();
assertEquals(Activity.RESULT_OK,
Shadows.shadowOf(queryRequestActivity).getResultCode());
assertTrue(queryRequestActivity.isFinishing());
}
private static void setSessionCommand(String command) {
AndroidSessionWrapper sessionWrapper =
CommCareApplication.instance().getCurrentSessionWrapper();
CommCareSession session = sessionWrapper.getSession();
session.setCommand(command);
}
}