From 672c16f93106e111f9c7620bea73e2182a7f75b2 Mon Sep 17 00:00:00 2001 From: Branden Archer Date: Tue, 26 Jan 2016 21:24:27 -0500 Subject: [PATCH 1/5] Remove unneeded constant --- .../main/java/protect/gift_card_guard/GiftCardViewActivity.java | 1 - 1 file changed, 1 deletion(-) diff --git a/app/src/main/java/protect/gift_card_guard/GiftCardViewActivity.java b/app/src/main/java/protect/gift_card_guard/GiftCardViewActivity.java index 119f2c5..1456d77 100644 --- a/app/src/main/java/protect/gift_card_guard/GiftCardViewActivity.java +++ b/app/src/main/java/protect/gift_card_guard/GiftCardViewActivity.java @@ -27,7 +27,6 @@ public class GiftCardViewActivity extends AppCompatActivity { private static final String TAG = "GiftCardGuard"; private static final int REQUEST_IMAGE_CAPTURE = 1; - private static final String RECEIPT_IMAGE_DIR = "receipts"; private String capturedUncommittedReceipt = null; From 2abb346cb0a0d29593d0629325c9cdd33544335f Mon Sep 17 00:00:00 2001 From: Branden Archer Date: Tue, 26 Jan 2016 21:24:49 -0500 Subject: [PATCH 2/5] Add unit test for updating a missing gift card --- .../java/protect/gift_card_guard/DatabaseTest.java | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/app/src/test/java/protect/gift_card_guard/DatabaseTest.java b/app/src/test/java/protect/gift_card_guard/DatabaseTest.java index c7f5b2a..f952d7c 100644 --- a/app/src/test/java/protect/gift_card_guard/DatabaseTest.java +++ b/app/src/test/java/protect/gift_card_guard/DatabaseTest.java @@ -68,6 +68,16 @@ public void updateGiftCard() assertEquals("receipt1", giftCard.receipt); } + @Test + public void updateMissingGiftCard() + { + assertEquals(0, db.getGiftCardCount()); + + boolean result = db.updateGiftCard(1, "store1", "cardId1", "value1", "receipt1"); + assertEquals(false, result); + assertEquals(0, db.getGiftCardCount()); + } + @Test public void emptyGiftCardValues() { From e5e3c8beb4b5d577b9936100e9cbb94c16e656ad Mon Sep 17 00:00:00 2001 From: Branden Archer Date: Tue, 26 Jan 2016 21:25:15 -0500 Subject: [PATCH 3/5] Add unit test for launching with a giftcard --- .../gift_card_guard/MainActivityTest.java | 34 +++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/app/src/test/java/protect/gift_card_guard/MainActivityTest.java b/app/src/test/java/protect/gift_card_guard/MainActivityTest.java index 7bb8d25..538a29d 100644 --- a/app/src/test/java/protect/gift_card_guard/MainActivityTest.java +++ b/app/src/test/java/protect/gift_card_guard/MainActivityTest.java @@ -3,6 +3,7 @@ import android.app.Activity; import android.content.ComponentName; import android.content.Intent; +import android.database.Cursor; import android.view.Menu; import android.view.View; import android.widget.ListView; @@ -13,8 +14,10 @@ import org.robolectric.Robolectric; import org.robolectric.RobolectricGradleTestRunner; import org.robolectric.annotation.Config; +import org.robolectric.util.ActivityController; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; import static org.robolectric.Shadows.shadowOf; @@ -62,4 +65,35 @@ public void clickAddLaunchesGiftCardViewActivity() assertEquals(new ComponentName(activity, GiftCardViewActivity.class), intent.getComponent()); assertNull(intent.getExtras()); } + + @Test + public void addOneGiftCard() + { + ActivityController activityController = Robolectric.buildActivity(MainActivity.class).create(); + + Activity mainActivity = (Activity)activityController.get(); + activityController.start(); + activityController.resume(); + + TextView helpText = (TextView)mainActivity.findViewById(R.id.helpText); + ListView list = (ListView)mainActivity.findViewById(R.id.list); + + assertEquals(0, list.getCount()); + + DBHelper db = new DBHelper(mainActivity); + db.insertGiftCard("store", "cardId", "value", "receipt"); + + assertEquals(View.VISIBLE, helpText.getVisibility()); + assertEquals(View.GONE, list.getVisibility()); + + activityController.pause(); + activityController.resume(); + + assertEquals(View.GONE, helpText.getVisibility()); + assertEquals(View.VISIBLE, list.getVisibility()); + + assertEquals(1, list.getAdapter().getCount()); + Cursor cursor = (Cursor)list.getAdapter().getItem(0); + assertNotNull(cursor); + } } \ No newline at end of file From 8ae202d69c767c51221847239a09be614fc90e34 Mon Sep 17 00:00:00 2001 From: Branden Archer Date: Tue, 26 Jan 2016 21:25:38 -0500 Subject: [PATCH 4/5] Add unit tests for GiftCardViewActivity --- .../GiftCardViewActivityTest.java | 479 ++++++++++++++++++ 1 file changed, 479 insertions(+) create mode 100644 app/src/test/java/protect/gift_card_guard/GiftCardViewActivityTest.java diff --git a/app/src/test/java/protect/gift_card_guard/GiftCardViewActivityTest.java b/app/src/test/java/protect/gift_card_guard/GiftCardViewActivityTest.java new file mode 100644 index 0000000..484fedc --- /dev/null +++ b/app/src/test/java/protect/gift_card_guard/GiftCardViewActivityTest.java @@ -0,0 +1,479 @@ +package protect.gift_card_guard; + +import android.app.Activity; +import android.content.Intent; +import android.content.pm.ActivityInfo; +import android.content.pm.ApplicationInfo; +import android.content.pm.ResolveInfo; +import android.net.Uri; +import android.os.Bundle; +import android.provider.MediaStore; +import android.view.View; +import android.widget.Button; +import android.widget.EditText; +import android.widget.TextView; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.robolectric.Robolectric; +import org.robolectric.RobolectricGradleTestRunner; +import org.robolectric.RuntimeEnvironment; +import org.robolectric.annotation.Config; +import org.robolectric.res.builder.RobolectricPackageManager; +import org.robolectric.shadows.ShadowActivity; +import org.robolectric.util.ActivityController; + +import java.io.File; +import java.io.IOException; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; +import static org.robolectric.Shadows.shadowOf; + +@RunWith(RobolectricGradleTestRunner.class) +@Config(constants = BuildConfig.class, sdk = 17) +public class GiftCardViewActivityTest +{ + /** + * Register a handler in the package manager for a image capture intent + */ + private void registerMediaStoreIntentHandler() + { + // Add something that will 'handle' the media capture intent + RobolectricPackageManager packageManager = (RobolectricPackageManager) shadowOf( + RuntimeEnvironment.application).getPackageManager(); + + ResolveInfo info = new ResolveInfo(); + info.isDefault = true; + + ApplicationInfo applicationInfo = new ApplicationInfo(); + applicationInfo.packageName = "does.not.matter"; + info.activityInfo = new ActivityInfo(); + info.activityInfo.applicationInfo = applicationInfo; + info.activityInfo.name = "DoesNotMatter"; + + Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); + + packageManager.addResolveInfoForIntent(intent, info); + } + + /** + * Save a gift card and check that the database contains the + * expected values + * + * @param activity + * @param store + * @param cardId + * @param value + * @param expectedReceipt + */ + private void saveGiftCardWithArguments(final Activity activity, + final String store, final String cardId, + final String value, final String expectedReceipt, + boolean creatingNewCard) + { + DBHelper db = new DBHelper(activity); + if(creatingNewCard) + { + assertEquals(0, db.getGiftCardCount()); + } + else + { + assertEquals(1, db.getGiftCardCount()); + } + + final EditText storeField = (EditText) activity.findViewById(R.id.storeName); + final EditText cardIdField = (EditText) activity.findViewById(R.id.cardId); + final EditText valueField = (EditText) activity.findViewById(R.id.value); + + final Button saveButton = (Button) activity.findViewById(R.id.saveButton); + + storeField.setText(store); + cardIdField.setText(cardId); + valueField.setText(value); + + assertEquals(false, activity.isFinishing()); + saveButton.performClick(); + assertEquals(true, activity.isFinishing()); + + assertEquals(1, db.getGiftCardCount()); + + GiftCard card = db.getGiftCard(1); + assertEquals(store, card.store); + assertEquals(cardId, card.cardId); + assertEquals(value, card.value); + assertEquals(expectedReceipt, card.receipt); + } + + /** + * Initiate and complete an image capture, returning the + * location of the resulting file if the capture was + * a success. + * + * @param success + * true if the image capture is a success, and a + * file is to be created at the requested location, + * false otherwise. + * @param buttonId + * id of the button to press to initiate the capture + * @return The URI pointing to the image file location, + * regardless if the operation was successful or not. + */ + private Uri captureImageWithResult(final Activity activity, final int buttonId, final boolean success) throws IOException + { + // Start image capture + final Button captureButton = (Button) activity.findViewById(buttonId); + captureButton.performClick(); + + ShadowActivity.IntentForResult intentForResult = shadowOf(activity).peekNextStartedActivityForResult(); + assertNotNull(intentForResult); + + Intent intent = intentForResult.intent; + assertNotNull(intent); + + String action = intent.getAction(); + assertNotNull(action); + assertEquals(MediaStore.ACTION_IMAGE_CAPTURE, action); + + Bundle bundle = intent.getExtras(); + assertNotNull(bundle); + + assertEquals(false, bundle.isEmpty()); + Uri argument = bundle.getParcelable(MediaStore.EXTRA_OUTPUT); + assertNotNull(argument); + assertTrue(argument.toString().length() > 0); + + // Respond to image capture, success + shadowOf(activity).receiveResult( + intent, + success ? Activity.RESULT_OK : Activity.RESULT_CANCELED, + null); + + if(success) + { + File imageFile = new File(argument.getPath()); + assertEquals(false, imageFile.exists()); + boolean result = imageFile.createNewFile(); + assertTrue(result); + } + + return argument; + } + + private void checkFieldProperties(final Activity activity, final int id, final int visibility, + final String contents) + { + final View view = (View) activity.findViewById(id); + assertNotNull(view); + assertEquals(visibility, view.getVisibility()); + if(contents != null) + { + TextView textView = (TextView)view; + assertEquals(contents, textView.getText().toString()); + } + } + + private void checkAllFields(final Activity activity, final String store, final String cardId, + final String value, final String comittedReceipt, boolean hasUncommitedReceipt) + { + final boolean hasReceipt = (comittedReceipt.length() > 0) || hasUncommitedReceipt; + + final int hasReceiptVisibility = hasReceipt ? View.VISIBLE : View.GONE; + final int noReceiptVisibility = hasReceipt ? View.GONE : View.VISIBLE; + + checkFieldProperties(activity, R.id.storeName, View.VISIBLE, store); + checkFieldProperties(activity, R.id.cardId, View.VISIBLE, cardId); + checkFieldProperties(activity, R.id.value, View.VISIBLE, value); + checkFieldProperties(activity, R.id.receiptLocation, View.GONE, comittedReceipt); + checkFieldProperties(activity, R.id.hasReceiptButtonLayout, hasReceiptVisibility, null); + checkFieldProperties(activity, R.id.noReceiptButtonLayout, noReceiptVisibility, null); + checkFieldProperties(activity, R.id.captureButton, View.VISIBLE, null); + checkFieldProperties(activity, R.id.updateButton, View.VISIBLE, null); + checkFieldProperties(activity, R.id.viewButton, View.VISIBLE, null); + checkFieldProperties(activity, R.id.saveButton, View.VISIBLE, null); + checkFieldProperties(activity, R.id.cancelButton, View.VISIBLE, null); + } + + @Test + public void startWithoutParametersCheckFieldsAvailable() + { + ActivityController activityController = Robolectric.buildActivity(GiftCardViewActivity.class).create(); + activityController.start(); + activityController.visible(); + activityController.resume(); + + Activity activity = (Activity)activityController.get(); + + checkAllFields(activity, "", "", "", "", false); + } + + @Test + public void startWithoutParametersCannotCreateGiftCard() + { + ActivityController activityController = Robolectric.buildActivity(GiftCardViewActivity.class).create(); + activityController.start(); + activityController.visible(); + activityController.resume(); + + Activity activity = (Activity)activityController.get(); + DBHelper db = new DBHelper(activity); + assertEquals(0, db.getGiftCardCount()); + + final EditText storeField = (EditText) activity.findViewById(R.id.storeName); + final EditText cardIdField = (EditText) activity.findViewById(R.id.cardId); + final TextView receiptField = (TextView) activity.findViewById(R.id.receiptLocation); + + final Button saveButton = (Button) activity.findViewById(R.id.saveButton); + + saveButton.performClick(); + assertEquals(0, db.getGiftCardCount()); + + storeField.setText("store"); + saveButton.performClick(); + assertEquals(0, db.getGiftCardCount()); + + cardIdField.setText("cardId"); + saveButton.performClick(); + assertEquals(0, db.getGiftCardCount()); + + receiptField.setText("receipt"); + saveButton.performClick(); + assertEquals(0, db.getGiftCardCount()); + } + + @Test + public void startWithoutParametersCancel() + { + ActivityController activityController = Robolectric.buildActivity(GiftCardViewActivity.class).create(); + activityController.start(); + activityController.visible(); + activityController.resume(); + + Activity activity = (Activity)activityController.get(); + + final Button cancelButton = (Button) activity.findViewById(R.id.cancelButton); + + assertEquals(false, activity.isFinishing()); + cancelButton.performClick(); + assertEquals(true, activity.isFinishing()); + } + + @Test + public void startWithoutParametersCreateGiftCardNoReceipt() + { + ActivityController activityController = Robolectric.buildActivity(GiftCardViewActivity.class).create(); + activityController.start(); + activityController.visible(); + activityController.resume(); + + Activity activity = (Activity)activityController.get(); + + saveGiftCardWithArguments(activity, "store", "cardId", "value", "", true); + } + + @Test + public void startWithoutParametersCaptureReceiptCreateGiftCard() throws IOException + { + ActivityController activityController = Robolectric.buildActivity(GiftCardViewActivity.class).create(); + activityController.start(); + activityController.visible(); + activityController.resume(); + + // Add something that will 'handle' the media capture intent + registerMediaStoreIntentHandler(); + + Activity activity = (Activity)activityController.get(); + + checkAllFields(activity, "", "", "", "", false); + + // Complete image capture successfully + Uri imageLocation = captureImageWithResult(activity, R.id.captureButton, true); + + checkAllFields(activity, "", "", "", "", true); + + // Save and check the gift card + saveGiftCardWithArguments(activity, "store", "cardId", "value", imageLocation.getPath(), true); + + // Ensure that the file still exists + File imageFile = new File(imageLocation.getPath()); + assertTrue(imageFile.isFile()); + + // Delete the file to cleanup + boolean result = imageFile.delete(); + assertTrue(result); + } + + @Test + public void startWithoutParametersCaptureReceiptFailureCreateGiftCard() throws IOException + { + ActivityController activityController = Robolectric.buildActivity(GiftCardViewActivity.class).create(); + activityController.start(); + activityController.visible(); + activityController.resume(); + + // Add something that will 'handle' the media capture intent + registerMediaStoreIntentHandler(); + + Activity activity = (Activity)activityController.get(); + + checkAllFields(activity, "", "", "", "", false); + + // Complete image capture in failure + Uri imageLocation = captureImageWithResult(activity, R.id.captureButton, false); + + checkAllFields(activity, "", "", "", "", false); + + // Save and check the gift card + saveGiftCardWithArguments(activity, "store", "cardId", "value", "", true); + + // Check that no file was created + File imageFile = new File(imageLocation.getPath()); + assertEquals(false, imageFile.exists()); + } + + @Test + public void startWithoutParametersCaptureReceiptCancel() throws IOException + { + ActivityController activityController = Robolectric.buildActivity(GiftCardViewActivity.class).create(); + activityController.start(); + activityController.visible(); + activityController.resume(); + + // Add something that will 'handle' the media capture intent + registerMediaStoreIntentHandler(); + + Activity activity = (Activity)activityController.get(); + + checkAllFields(activity, "", "", "", "", false); + + // Complete image capture successfully + Uri imageLocation = captureImageWithResult(activity, R.id.captureButton, true); + + checkAllFields(activity, "", "", "", "", true); + + // Cancel the gift card creation + final Button cancelButton = (Button) activity.findViewById(R.id.cancelButton); + assertEquals(false, activity.isFinishing()); + cancelButton.performClick(); + assertEquals(true, activity.isFinishing()); + activityController.destroy(); + + // Ensure the image has been deleted + File imageFile = new File(imageLocation.getPath()); + assertEquals(false, imageFile.exists()); + } + + private ActivityController createActivityWithGiftCard() + { + Intent intent = new Intent(); + final Bundle bundle = new Bundle(); + bundle.putInt("id", 1); + bundle.putBoolean("update", true); + intent.putExtras(bundle); + + return Robolectric.buildActivity(GiftCardViewActivity.class).withIntent(intent).create(); + } + + @Test + public void startWithGiftCardNoReceiptCheckDisplay() throws IOException + { + ActivityController activityController = createActivityWithGiftCard(); + Activity activity = (Activity)activityController.get(); + DBHelper db = new DBHelper(activity); + + db.insertGiftCard("store", "cardId", "value", ""); + + activityController.start(); + activityController.visible(); + activityController.resume(); + + checkAllFields(activity, "store", "cardId", "value", "", false); + } + + @Test + public void startWithGiftCardWithReceiptCheckDisplay() throws IOException + { + ActivityController activityController = createActivityWithGiftCard(); + Activity activity = (Activity)activityController.get(); + DBHelper db = new DBHelper(activity); + + db.insertGiftCard("store", "cardId", "value", "receipt"); + + activityController.start(); + activityController.visible(); + activityController.resume(); + + checkAllFields(activity, "store", "cardId", "value", "receipt", false); + } + + @Test + public void startWithGiftCardWithReceiptUpdateReceipt() throws IOException + { + ActivityController activityController = createActivityWithGiftCard(); + Activity activity = (Activity)activityController.get(); + DBHelper db = new DBHelper(activity); + + db.insertGiftCard("store", "cardId", "value", "receipt"); + + activityController.start(); + activityController.visible(); + activityController.resume(); + + checkAllFields(activity, "store", "cardId", "value", "receipt", false); + + // Add something that will 'handle' the media capture intent + registerMediaStoreIntentHandler(); + + // Complete image capture successfully + Uri imageLocation = captureImageWithResult(activity, R.id.updateButton, true); + + checkAllFields(activity, "store", "cardId", "value", "receipt", true); + + // Save and check the gift card + saveGiftCardWithArguments(activity, "store", "cardId", "value", imageLocation.getPath(), false); + + // Ensure that the file still exists + File imageFile = new File(imageLocation.getPath()); + assertTrue(imageFile.isFile()); + + // Delete the file to cleanup + boolean result = imageFile.delete(); + assertTrue(result); + } + + @Test + public void startWithGiftCardWithReceiptUpdateReceiptCancel() throws IOException + { + ActivityController activityController = createActivityWithGiftCard(); + Activity activity = (Activity)activityController.get(); + DBHelper db = new DBHelper(activity); + + db.insertGiftCard("store", "cardId", "value", "receipt"); + + activityController.start(); + activityController.visible(); + activityController.resume(); + + checkAllFields(activity, "store", "cardId", "value", "receipt", false); + + // Add something that will 'handle' the media capture intent + registerMediaStoreIntentHandler(); + + // Complete image capture successfully + Uri imageLocation = captureImageWithResult(activity, R.id.updateButton, true); + + checkAllFields(activity, "store", "cardId", "value", "receipt", true); + + // Cancel the gift card creation + final Button cancelButton = (Button) activity.findViewById(R.id.cancelButton); + assertEquals(false, activity.isFinishing()); + cancelButton.performClick(); + assertEquals(true, activity.isFinishing()); + activityController.destroy(); + + // Ensure the image has been deleted + File imageFile = new File(imageLocation.getPath()); + assertEquals(false, imageFile.exists()); + } +} From a3d9f5fe0159c815036df5829854c68086acacf0 Mon Sep 17 00:00:00 2001 From: Branden Archer Date: Tue, 26 Jan 2016 22:26:27 -0500 Subject: [PATCH 5/5] Update for release Previously the versionName was incorrect at 1.0. It was intended to be 0.1. --- app/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 64cc13f..94c2b34 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -8,8 +8,8 @@ android { applicationId "protect.gift_card_guard" minSdkVersion 17 targetSdkVersion 23 - versionCode 1 - versionName "1.0" + versionCode 2 + versionName "0.1.1" } buildTypes { release {