/******************************************************************************* * Copyright 2011 The Regents of the University of California * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. ******************************************************************************/ package org.ohmage.activity.test; import com.jayway.android.robotium.solo.Solo; import org.ohmage.OhmageApplication; import org.ohmage.R; import org.ohmage.activity.CampaignInfoActivity; import org.ohmage.db.DbContract; import org.ohmage.db.DbContract.Campaigns; import org.ohmage.db.Models.Campaign; import org.ohmage.db.Models.Response; import org.ohmage.db.test.CampaignContentProvider; import org.ohmage.db.test.CampaignCursor; import org.ohmage.db.test.NotifyingMockContentResolver; import org.ohmage.db.test.OhmageUriMatcher; import org.ohmage.db.test.ResponseCursor; import android.content.Intent; import android.database.Cursor; import android.net.Uri; import android.test.ActivityInstrumentationTestCase2; import android.test.suitebuilder.annotation.MediumTest; import android.test.suitebuilder.annotation.SmallTest; import android.view.View; import android.widget.Button; import android.widget.ImageView; import android.widget.TextView; /** * <p>This class contains tests for the {@link CampaignInfoActivity}</p> * * <p>TODO: mock the trigger db</p> * * @author cketcham * */ public class CampaignInfoActivityTest extends ActivityInstrumentationTestCase2<CampaignInfoActivity> { private static final String FAKE_TITLE = "This Campaign"; private static final String CAMPAIGN_URN_W_ONE_RESPONSE = "urn:one:response"; private View mLoadingView; private View mEntityHeader; private ImageView mIconView; private TextView mHeaderText; private TextView mSubtext; private Button surveysButton; private Button participateButton; private Button removeButton; private TextView mErrorBox; private TextView mPrivacyValue; private TextView mStatusValue; private TextView mResponsesValue; private TextView mTriggersValue; private CampaignContentProvider provider; private Solo solo; private CampaignInfoActivity mActivity; private final Response[] responses = new Response[9]; public CampaignInfoActivityTest() { super(CampaignInfoActivity.class); } @Override protected void setUp() throws Exception { super.setUp(); setActivityIntent(new Intent(Intent.ACTION_VIEW, Campaigns.buildCampaignUri("blah"))); getInstrumentation().waitForIdleSync(); NotifyingMockContentResolver fake = new NotifyingMockContentResolver(this); provider = new CampaignContentProvider(OhmageApplication.getContext(), DbContract.CONTENT_AUTHORITY) { @Override public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { switch(OhmageUriMatcher.getMatcher().match(uri)) { case OhmageUriMatcher.CAMPAIGN_RESPONSES: if(Campaigns.getCampaignUrn(uri).equals(CAMPAIGN_URN_W_ONE_RESPONSE)) return new ResponseCursor(projection, new Response()); return new ResponseCursor(projection, responses); default: return super.query(uri, projection, selection, selectionArgs, sortOrder); } } }; provider.addToContentResolver(fake); OhmageApplication.setFakeContentResolver(fake); solo = new Solo(getInstrumentation(), getActivity()); mActivity = getActivity(); mLoadingView = mActivity.getWindow().getDecorView().findViewById(R.id.info_loading_bar); mEntityHeader = mActivity.findViewById(R.id.entity_header_content); mIconView = (ImageView) mActivity.findViewById(R.id.entity_icon); mHeaderText = (TextView) mActivity.findViewById(R.id.entity_header); mSubtext = (TextView) mActivity.findViewById(R.id.entity_header_sub1); surveysButton = (Button) mActivity.findViewById(R.id.campaign_info_button_surveys); participateButton = (Button) mActivity.findViewById(R.id.campaign_info_button_particpate); removeButton = (Button) mActivity.findViewById(R.id.campaign_info_button_remove); mErrorBox = (TextView) mActivity.findViewById(R.id.campaign_info_errorbox); mPrivacyValue = (TextView) mActivity.findViewById(R.id.campaign_info_privacy_value); mStatusValue = (TextView) mActivity.findViewById(R.id.campaign_info_status_value); mResponsesValue = (TextView) mActivity.findViewById(R.id.campaign_info_responses_value); mTriggersValue = (TextView) mActivity.findViewById(R.id.campaign_info_triggers_value); } @Override protected void tearDown() throws Exception{ try { solo.finalize(); } catch (Throwable e) { e.printStackTrace(); } getActivity().finish(); super.tearDown(); } private Campaign getBasicCampaign() { Campaign c = new Campaign(); c.mName = FAKE_TITLE; c.mStatus = Campaign.STATUS_READY; c.mUrn = CampaignCursor.DEFAULT_CAMPAIGN_URN; c.mPrivacy = "unknown"; return c; } @SmallTest public void testPreconditions() { assertNotNull(mLoadingView); assertNotNull(mEntityHeader); assertNotNull(mIconView); assertNotNull(mHeaderText); assertNotNull(mSubtext); assertNotNull(surveysButton); assertNotNull(participateButton); assertNotNull(removeButton); assertNotNull(mErrorBox); assertNotNull(mPrivacyValue); assertNotNull(mStatusValue); assertNotNull(mResponsesValue); assertNotNull(mTriggersValue); } @SmallTest public void testLoadingState() { assertEquals(true, mLoadingView.getVisibility() == View.VISIBLE); provider.setCampaigns(getBasicCampaign()); solo.searchText(FAKE_TITLE); assertEquals(false, mLoadingView.getVisibility() == View.VISIBLE); } @SmallTest public void testHeaderText() { provider.setCampaigns(getBasicCampaign()); solo.searchText(FAKE_TITLE); assertEquals(FAKE_TITLE, mHeaderText.getText()); assertEquals(CampaignCursor.DEFAULT_CAMPAIGN_URN, mSubtext.getText()); } @MediumTest public void testDeletedState() { Campaign c = getBasicCampaign(); c.mStatus = Campaign.STATUS_NO_EXIST; provider.setCampaigns(c); solo.searchText(FAKE_TITLE); assertEquals("deleted on server", mStatusValue.getText()); assertEquals(true, mErrorBox.getVisibility() == View.VISIBLE); assertEquals(false, surveysButton.getVisibility() == View.VISIBLE); assertEquals(false, participateButton.getVisibility() == View.VISIBLE); assertEquals(true, removeButton.getVisibility() == View.VISIBLE); } @MediumTest public void testStateStopped() { Campaign c = getBasicCampaign(); c.mStatus = Campaign.STATUS_STOPPED; provider.setCampaigns(c); solo.searchText(FAKE_TITLE); assertEquals(true, mErrorBox.getVisibility() == View.VISIBLE); assertEquals("stopped", mStatusValue.getText()); assertEquals("warning: this campaign is stopped, meaning that you can no longer submit surveys for it.", mErrorBox.getText().toString()); assertEquals(false, surveysButton.getVisibility() == View.VISIBLE); assertEquals(false, participateButton.getVisibility() == View.VISIBLE); assertEquals(true, removeButton.getVisibility() == View.VISIBLE); } @MediumTest public void testStateDownloading() { Campaign c = getBasicCampaign(); c.mStatus = Campaign.STATUS_DOWNLOADING; provider.setCampaigns(c); solo.searchText(FAKE_TITLE); assertEquals("downloading...", mStatusValue.getText()); assertEquals(false, mErrorBox.getVisibility() == View.VISIBLE); assertEquals(false, surveysButton.getVisibility() == View.VISIBLE); assertEquals(false, participateButton.getVisibility() == View.VISIBLE); assertEquals(true, removeButton.getVisibility() == View.VISIBLE); } @MediumTest public void testStateInvalidUserRole() { Campaign c = getBasicCampaign(); c.mStatus = Campaign.STATUS_INVALID_USER_ROLE; provider.setCampaigns(c); solo.searchText(FAKE_TITLE); assertEquals("invalid role", mStatusValue.getText()); assertEquals(true, mErrorBox.getVisibility() == View.VISIBLE); assertEquals(false, surveysButton.getVisibility() == View.VISIBLE); assertEquals(false, participateButton.getVisibility() == View.VISIBLE); assertEquals(true, removeButton.getVisibility() == View.VISIBLE); } @MediumTest public void testStateOutOfDate() { Campaign c = getBasicCampaign(); c.mStatus = Campaign.STATUS_OUT_OF_DATE; provider.setCampaigns(c); solo.searchText(FAKE_TITLE); assertEquals("out of date", mStatusValue.getText()); assertEquals(true, mErrorBox.getVisibility() == View.VISIBLE); assertEquals(false, surveysButton.getVisibility() == View.VISIBLE); assertEquals(false, participateButton.getVisibility() == View.VISIBLE); assertEquals(true, removeButton.getVisibility() == View.VISIBLE); } @MediumTest public void testStateReady() { Campaign c = getBasicCampaign(); c.mStatus = Campaign.STATUS_READY; provider.setCampaigns(c); solo.searchText(FAKE_TITLE); assertEquals("participating", mStatusValue.getText()); assertEquals(false, mErrorBox.getVisibility() == View.VISIBLE); assertEquals(true, surveysButton.getVisibility() == View.VISIBLE); assertEquals(false, participateButton.getVisibility() == View.VISIBLE); assertEquals(true, removeButton.getVisibility() == View.VISIBLE); } @MediumTest public void testStateRemote() { Campaign c = getBasicCampaign(); c.mStatus = Campaign.STATUS_REMOTE; provider.setCampaigns(c); solo.searchText(FAKE_TITLE); assertEquals("available for participation", mStatusValue.getText()); assertEquals(false, mErrorBox.getVisibility() == View.VISIBLE); assertEquals(false, surveysButton.getVisibility() == View.VISIBLE); assertEquals(true, participateButton.getVisibility() == View.VISIBLE); assertEquals(false, removeButton.getVisibility() == View.VISIBLE); } @MediumTest public void testStateVague() { Campaign c = getBasicCampaign(); c.mStatus = Campaign.STATUS_VAGUE; provider.setCampaigns(c); solo.searchText(FAKE_TITLE); assertEquals("not available", mStatusValue.getText()); assertEquals(false, mErrorBox.getVisibility() == View.VISIBLE); assertEquals(false, surveysButton.getVisibility() == View.VISIBLE); assertEquals(false, participateButton.getVisibility() == View.VISIBLE); assertEquals(true, removeButton.getVisibility() == View.VISIBLE); } @MediumTest public void testCampaignPrivacyStatePrivate() { Campaign c = getBasicCampaign(); c.mPrivacy = Campaign.PRIVACY_PRIVATE; provider.setCampaigns(c); solo.searchText(FAKE_TITLE); assertEquals("private", mPrivacyValue.getText()); } @MediumTest public void testCampaignPrivacyStateUnknown() { Campaign c = getBasicCampaign(); c.mPrivacy = Campaign.PRIVACY_UNKNOWN; provider.setCampaigns(c); solo.searchText(FAKE_TITLE); assertEquals("unknown", mPrivacyValue.getText()); } @MediumTest public void testCampaignPrivacyStateInvalid() { Campaign c = getBasicCampaign(); c.mPrivacy = "not real privacy state"; provider.setCampaigns(c); solo.searchText(FAKE_TITLE); assertEquals("unknown", mPrivacyValue.getText()); } @MediumTest public void testCampaignPrivacyStateInvalid2() { Campaign c = getBasicCampaign(); c.mPrivacy = "8"; provider.setCampaigns(c); solo.searchText(FAKE_TITLE); assertEquals("unknown", mPrivacyValue.getText()); } @MediumTest public void testCampaignPrivacyStateShared() { Campaign c = getBasicCampaign(); c.mPrivacy = Campaign.PRIVACY_SHARED; provider.setCampaigns(c); solo.searchText(FAKE_TITLE); assertEquals("shared", mPrivacyValue.getText()); } @MediumTest public void testResponseCount() { provider.setCampaigns(getBasicCampaign()); solo.searchText(FAKE_TITLE); assertEquals(responses.length + " responses submitted", mResponsesValue.getText()); } @MediumTest public void testResponseCount1() { Campaign c = getBasicCampaign(); c.mUrn = CAMPAIGN_URN_W_ONE_RESPONSE; provider.setCampaigns(c); solo.searchText(FAKE_TITLE); assertEquals("1 response submitted", mResponsesValue.getText()); } // /** // * Just tests to make sure the count is what we are getting from the db // */ // @MediumTest // public void testTriggerCount() { // mLoaderHelper.waitForLoader(); // // // get the number of triggers for this campaign // TriggerDB trigDB = new TriggerDB(mActivity); // if (trigDB.open()) { // Cursor triggers = trigDB.getAllTriggers(CAMPAIGN_URN); // assertEquals(triggers.getCount() + " trigger(s) configured", mTriggersValue.getText()); // triggers.close(); // trigDB.close(); // } // } }