package org.commcare.android.tests;
import android.content.Intent;
import org.commcare.CommCareApplication;
import org.commcare.CommCareTestApplication;
import org.commcare.activities.StandardHomeActivity;
import org.commcare.activities.DispatchActivity;
import org.commcare.activities.EntitySelectActivity;
import org.commcare.activities.LoginActivity;
import org.commcare.adapters.EntityListAdapter;
import org.commcare.android.CommCareTestRunner;
import org.commcare.android.database.app.models.UserKeyRecord;
import org.commcare.android.util.CaseLoadUtils;
import org.commcare.android.util.TestAppInstaller;
import org.commcare.android.util.UpdateUtils;
import org.commcare.engine.resource.AppInstallStatus;
import org.commcare.models.database.AndroidSandbox;
import org.javarosa.core.model.instance.FormInstance;
import org.javarosa.core.services.storage.IStorageUtilityIndexed;
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 static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
/**
* Tests logging in as demo user with and without an app-level demo user
* restore files
*
* @author Phillip Mates (pmates@dimagi.com)
*/
@Config(application = CommCareTestApplication.class)
@RunWith(CommCareTestRunner.class)
public class DemoUserRestoreTest {
private final static String REF_BASE_DIR =
"jr://resource/commcare-apps/demo_user_restore/";
@Test
public void loginUsingDemoUserWithoutRestore() {
TestAppInstaller.installApp(REF_BASE_DIR +
"app_without_demo_user_restore/profile.ccpr");
CommCareApplication.instance().getCurrentApp().setMMResourcesValidated();
loginAsDemoUser();
launchHomeActivityForDemoUser();
}
private static void loginAsDemoUser() {
Intent loginActivityIntent =
new Intent(RuntimeEnvironment.application, LoginActivity.class);
LoginActivity loginActivity =
Robolectric.buildActivity(LoginActivity.class)
.withIntent(loginActivityIntent).setup().get();
ShadowActivity shadowActivity = Shadows.shadowOf(loginActivity);
shadowActivity.clickMenuItem(LoginActivity.MENU_DEMO);
}
private static void launchHomeActivityForDemoUser() {
Intent homeActivityIntent =
new Intent(RuntimeEnvironment.application, StandardHomeActivity.class);
homeActivityIntent.putExtra(DispatchActivity.START_FROM_LOGIN, true);
StandardHomeActivity homeActivity =
Robolectric.buildActivity(StandardHomeActivity.class)
.withIntent(homeActivityIntent).setup().get();
ShadowActivity shadowActivity = Shadows.shadowOf(homeActivity);
// Demo users shouldn't have an options menu
assertFalse(shadowActivity.getOptionsMenu().hasVisibleItems());
}
/**
* Install app w/ demo user restore file, login as demo user. Perform app
* update that changes the user restore (including the username), assert
* that associated fixture and case data is correctly updated
*/
@Test
public void demoUserRestoreAndUpdateTest() {
TestAppInstaller.installApp(REF_BASE_DIR +
"app_with_demo_user_restore/profile.ccpr");
CommCareApplication.instance().getCurrentApp().setMMResourcesValidated();
loginAsDemoUser();
launchHomeActivityForDemoUser();
AndroidSandbox sandbox = new AndroidSandbox(CommCareApplication.instance());
IStorageUtilityIndexed<FormInstance> userFixtureStorage = sandbox.getUserFixtureStorage();
assertEquals(1, userFixtureStorage.getNumRecords());
assertEquals(1, CommCareApplication.instance().getCurrentApp().getStorage(UserKeyRecord.class).getNumRecords());
EntitySelectActivity entitySelectActivity =
CaseLoadUtils.launchEntitySelectActivity("m0-f0");
// check that the demo user has 2 entries in the case list
EntityListAdapter adapter = CaseLoadUtils.loadList(entitySelectActivity);
assertEquals(2, adapter.getCount());
// update the app to a version with a new demo user restore
String profileRef = UpdateUtils.buildResourceRef(REF_BASE_DIR,
"update_user_restore", "profile.ccpr");
UpdateUtils.installUpdate(profileRef,
AppInstallStatus.UpdateStaged,
AppInstallStatus.Installed);
loginAsDemoUser();
launchHomeActivityForDemoUser();
// check that the user fixtures were updated
userFixtureStorage = sandbox.getUserFixtureStorage();
assertEquals(0, userFixtureStorage.getNumRecords());
assertEquals(1, CommCareApplication.instance().getCurrentApp().getStorage(UserKeyRecord.class).getNumRecords());
// make sure there is only 1 case after updating the demo user restore
entitySelectActivity = CaseLoadUtils.launchEntitySelectActivity("m0-f0");
adapter = CaseLoadUtils.loadList(entitySelectActivity);
assertEquals(1, adapter.getCount());
}
}