From f1366bdefa4d32b7bf27da02e4b40168d3b268f0 Mon Sep 17 00:00:00 2001 From: Adam Jones Date: Sat, 16 Mar 2019 18:09:25 +0000 Subject: [PATCH 01/11] Fix SettingsActivityTest --- app/build.gradle | 8 ++--- .../nrw/commons/SettingsActivityTest.java | 32 ++++++++++--------- 2 files changed, 21 insertions(+), 19 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 0b3b1b1c1b..edb98dbb34 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -66,11 +66,11 @@ dependencies { // Android testing androidTestImplementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$KOTLIN_VERSION" + androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.1' + androidTestImplementation 'androidx.test:runner:1.1.1' + androidTestImplementation 'androidx.test:rules:1.1.1' + androidTestImplementation 'androidx.annotation:annotation:1.0.2' androidTestImplementation 'com.squareup.okhttp3:mockwebserver:3.10.0' - androidTestImplementation 'androidx.test:rules:1.1.2-alpha02' - androidTestImplementation 'androidx.test:runner:1.1.2-alpha02' - androidTestImplementation "androidx.annotation:annotation:1.0.2" - androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0-alpha02' androidTestImplementation 'org.mockito:mockito-core:2.10.0' // Debugging diff --git a/app/src/androidTest/java/fr/free/nrw/commons/SettingsActivityTest.java b/app/src/androidTest/java/fr/free/nrw/commons/SettingsActivityTest.java index 5232605bb1..19dd83c70b 100644 --- a/app/src/androidTest/java/fr/free/nrw/commons/SettingsActivityTest.java +++ b/app/src/androidTest/java/fr/free/nrw/commons/SettingsActivityTest.java @@ -1,18 +1,20 @@ package fr.free.nrw.commons; import android.content.Context; -import androidx.test.InstrumentationRegistry; -import androidx.test.espresso.Espresso; -import androidx.test.espresso.matcher.PreferenceMatchers; -import androidx.test.filters.LargeTest; -import androidx.test.rule.ActivityTestRule; -import androidx.test.runner.AndroidJUnit4; + +import com.google.gson.Gson; import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; +import androidx.test.InstrumentationRegistry; +import androidx.test.espresso.Espresso; +import androidx.test.espresso.matcher.PreferenceMatchers; +import androidx.test.filters.LargeTest; +import androidx.test.rule.ActivityTestRule; +import androidx.test.runner.AndroidJUnit4; import fr.free.nrw.commons.kvstore.JsonKvStore; import fr.free.nrw.commons.settings.Prefs; import fr.free.nrw.commons.settings.SettingsActivity; @@ -28,7 +30,7 @@ @LargeTest @RunWith(AndroidJUnit4.class) public class SettingsActivityTest { - BasicKvStore prefs; + JsonKvStore defaultKvStore; @Rule public ActivityTestRule activityRule = @@ -38,11 +40,11 @@ public class SettingsActivityTest { public void setup() { Context context = InstrumentationRegistry.getTargetContext(); String storeName = context.getPackageName() + "_preferences"; - prefs = new BasicKvStore(context, storeName); + defaultKvStore = new JsonKvStore(context, storeName, new Gson()); } @Test - public void setRecentUploadLimitTo100() { + public void setRecentUploadLimitTo123() { // Open "Use external storage" preference Espresso.onData(PreferenceMatchers.withKey("uploads")) .inAdapterView(withId(android.R.id.list)) @@ -50,22 +52,22 @@ public void setRecentUploadLimitTo100() { // Try setting it to 100 Espresso.onView(withId(android.R.id.edit)) - .perform(replaceText("100")); + .perform(replaceText("123")); // Click "OK" Espresso.onView(allOf(withId(android.R.id.button1), withText("OK"))) .perform(click()); - // Check setting set to 100 in SharedPreferences + // Check setting set to 123 in SharedPreferences assertEquals( - 100, - prefs.getInt(Prefs.UPLOADS_SHOWING, 0) + 123, + defaultKvStore.getInt(Prefs.UPLOADS_SHOWING, 0) ); - // Check displaying 100 in summary text + // Check displaying 123 in summary text Espresso.onData(PreferenceMatchers.withKey("uploads")) .inAdapterView(withId(android.R.id.list)) .onChildView(withId(android.R.id.summary)) - .check(matches(withText("100"))); + .check(matches(withText("123"))); } } From a078d446dd24d5754a2836ed706212323bb78f59 Mon Sep 17 00:00:00 2001 From: Adam Jones Date: Sat, 16 Mar 2019 18:10:11 +0000 Subject: [PATCH 02/11] Add test in SettingsActivity to set recent upload limit to 0 --- .../nrw/commons/SettingsActivityTest.java | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/app/src/androidTest/java/fr/free/nrw/commons/SettingsActivityTest.java b/app/src/androidTest/java/fr/free/nrw/commons/SettingsActivityTest.java index 19dd83c70b..c961dd0162 100644 --- a/app/src/androidTest/java/fr/free/nrw/commons/SettingsActivityTest.java +++ b/app/src/androidTest/java/fr/free/nrw/commons/SettingsActivityTest.java @@ -70,4 +70,32 @@ public void setRecentUploadLimitTo123() { .onChildView(withId(android.R.id.summary)) .check(matches(withText("123"))); } + + @Test + public void setRecentUploadLimitTo0() { + // Open "Use external storage" preference + Espresso.onData(PreferenceMatchers.withKey("uploads")) + .inAdapterView(withId(android.R.id.list)) + .perform(click()); + + // Try setting it to 100 + Espresso.onView(withId(android.R.id.edit)) + .perform(replaceText("0")); + + // Click "OK" + Espresso.onView(allOf(withId(android.R.id.button1), withText("OK"))) + .perform(click()); + + // Check setting set to 100 in SharedPreferences + assertEquals( + 100, + defaultKvStore.getInt(Prefs.UPLOADS_SHOWING, 0) + ); + + // Check displaying 100 in summary text + Espresso.onData(PreferenceMatchers.withKey("uploads")) + .inAdapterView(withId(android.R.id.list)) + .onChildView(withId(android.R.id.summary)) + .check(matches(withText("100"))); + } } From a83ab178f452e24b273e56babce4e78dab5b185b Mon Sep 17 00:00:00 2001 From: Adam Jones Date: Sat, 16 Mar 2019 18:40:49 +0000 Subject: [PATCH 03/11] Add tests to recent upload limit setting --- .../nrw/commons/SettingsActivityTest.java | 64 ++++++++++++++++++- 1 file changed, 62 insertions(+), 2 deletions(-) diff --git a/app/src/androidTest/java/fr/free/nrw/commons/SettingsActivityTest.java b/app/src/androidTest/java/fr/free/nrw/commons/SettingsActivityTest.java index c961dd0162..754c3df467 100644 --- a/app/src/androidTest/java/fr/free/nrw/commons/SettingsActivityTest.java +++ b/app/src/androidTest/java/fr/free/nrw/commons/SettingsActivityTest.java @@ -22,9 +22,11 @@ import static androidx.test.espresso.action.ViewActions.click; import static androidx.test.espresso.action.ViewActions.replaceText; import static androidx.test.espresso.assertion.ViewAssertions.matches; +import static androidx.test.espresso.matcher.ViewMatchers.isEnabled; import static androidx.test.espresso.matcher.ViewMatchers.withId; import static androidx.test.espresso.matcher.ViewMatchers.withText; import static org.hamcrest.Matchers.allOf; +import static org.hamcrest.core.IsNot.not; import static org.junit.Assert.assertEquals; @LargeTest @@ -50,7 +52,7 @@ public void setRecentUploadLimitTo123() { .inAdapterView(withId(android.R.id.list)) .perform(click()); - // Try setting it to 100 + // Try setting it to 123 Espresso.onView(withId(android.R.id.edit)) .perform(replaceText("123")); @@ -78,7 +80,7 @@ public void setRecentUploadLimitTo0() { .inAdapterView(withId(android.R.id.list)) .perform(click()); - // Try setting it to 100 + // Try setting it to 0 Espresso.onView(withId(android.R.id.edit)) .perform(replaceText("0")); @@ -98,4 +100,62 @@ public void setRecentUploadLimitTo0() { .onChildView(withId(android.R.id.summary)) .check(matches(withText("100"))); } + + @Test + public void setRecentUploadLimitTo700() { + // Open "Use external storage" preference + Espresso.onData(PreferenceMatchers.withKey("uploads")) + .inAdapterView(withId(android.R.id.list)) + .perform(click()); + + // Try setting it to 700 + Espresso.onView(withId(android.R.id.edit)) + .perform(replaceText("700")); + + // Click "OK" + Espresso.onView(allOf(withId(android.R.id.button1), withText("OK"))) + .perform(click()); + + // Check setting set to 500 in SharedPreferences + assertEquals( + 500, + defaultKvStore.getInt(Prefs.UPLOADS_SHOWING, 0) + ); + + // Check displaying 100 in summary text + Espresso.onData(PreferenceMatchers.withKey("uploads")) + .inAdapterView(withId(android.R.id.list)) + .onChildView(withId(android.R.id.summary)) + .check(matches(withText("500"))); + } + + @Test + public void useAuthorNameTogglesOn() { + // Turn on "Use external storage" preference if currently off + if (!defaultKvStore.getBoolean("useAuthorName", true)) { + Espresso.onData(PreferenceMatchers.withKey("useAuthorName")) + .inAdapterView(withId(android.R.id.list)) + .perform(click()); + } + + // Check authorName preference is enabled + Espresso.onData(PreferenceMatchers.withKey("authorName")) + .inAdapterView(withId(android.R.id.list)) + .check(matches(isEnabled())); + } + + @Test + public void useAuthorNameTogglesOff() { + // Turn off "Use external storage" preference if currently on + if (defaultKvStore.getBoolean("useAuthorName", false)) { + Espresso.onData(PreferenceMatchers.withKey("useAuthorName")) + .inAdapterView(withId(android.R.id.list)) + .perform(click()); + } + + // Check authorName preference is enabled + Espresso.onData(PreferenceMatchers.withKey("authorName")) + .inAdapterView(withId(android.R.id.list)) + .check(matches(not(isEnabled()))); + } } From b0a0fe7aa77efabff174c1abf59ba782805a23a5 Mon Sep 17 00:00:00 2001 From: Adam Jones Date: Sat, 16 Mar 2019 18:48:03 +0000 Subject: [PATCH 04/11] Simplify activity test rule --- .../java/fr/free/nrw/commons/SettingsActivityTest.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/app/src/androidTest/java/fr/free/nrw/commons/SettingsActivityTest.java b/app/src/androidTest/java/fr/free/nrw/commons/SettingsActivityTest.java index 754c3df467..299c42c97c 100644 --- a/app/src/androidTest/java/fr/free/nrw/commons/SettingsActivityTest.java +++ b/app/src/androidTest/java/fr/free/nrw/commons/SettingsActivityTest.java @@ -35,8 +35,7 @@ public class SettingsActivityTest { JsonKvStore defaultKvStore; @Rule - public ActivityTestRule activityRule = - new ActivityTestRule<>(SettingsActivity.class, false, true); + public ActivityTestRule activityRule = new ActivityTestRule<>(SettingsActivity.class); @Before public void setup() { From af1dcf87c3b650446290d0e6315e472079c93e0e Mon Sep 17 00:00:00 2001 From: Adam Jones Date: Sun, 17 Mar 2019 00:19:37 +0000 Subject: [PATCH 05/11] Add UploadTest --- app/build.gradle | 1 + .../java/fr/free/nrw/commons/UploadTest.java | 126 ++++++++++++++++++ 2 files changed, 127 insertions(+) create mode 100644 app/src/androidTest/java/fr/free/nrw/commons/UploadTest.java diff --git a/app/build.gradle b/app/build.gradle index edb98dbb34..72803a4a4d 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -67,6 +67,7 @@ dependencies { // Android testing androidTestImplementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$KOTLIN_VERSION" androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.1' + androidTestImplementation 'androidx.test.espresso:espresso-intents:3.1.1' androidTestImplementation 'androidx.test:runner:1.1.1' androidTestImplementation 'androidx.test:rules:1.1.1' androidTestImplementation 'androidx.annotation:annotation:1.0.2' diff --git a/app/src/androidTest/java/fr/free/nrw/commons/UploadTest.java b/app/src/androidTest/java/fr/free/nrw/commons/UploadTest.java new file mode 100644 index 0000000000..01d2d25869 --- /dev/null +++ b/app/src/androidTest/java/fr/free/nrw/commons/UploadTest.java @@ -0,0 +1,126 @@ +package fr.free.nrw.commons; + +import android.app.Activity; +import android.app.Instrumentation.ActivityResult; +import android.content.Intent; +import android.net.Uri; + +import org.junit.Rule; +import org.junit.Test; +import org.junit.runner.RunWith; + +import java.text.SimpleDateFormat; +import java.util.Date; + +import androidx.test.espresso.NoMatchingViewException; +import androidx.test.espresso.intent.rule.IntentsTestRule; +import androidx.test.filters.LargeTest; +import androidx.test.rule.ActivityTestRule; +import androidx.test.runner.AndroidJUnit4; +import fr.free.nrw.commons.contributions.MainActivity; +import fr.free.nrw.commons.utils.ConfigUtils; + +import static androidx.test.espresso.Espresso.onView; +import static androidx.test.espresso.action.ViewActions.click; +import static androidx.test.espresso.action.ViewActions.replaceText; +import static androidx.test.espresso.assertion.ViewAssertions.matches; +import static androidx.test.espresso.intent.Intents.intended; +import static androidx.test.espresso.intent.Intents.intending; +import static androidx.test.espresso.intent.matcher.IntentMatchers.hasAction; +import static androidx.test.espresso.intent.matcher.IntentMatchers.hasType; +import static androidx.test.espresso.matcher.ViewMatchers.isDisplayed; +import static androidx.test.espresso.matcher.ViewMatchers.withId; +import static androidx.test.espresso.matcher.ViewMatchers.withParent; +import static androidx.test.espresso.matcher.ViewMatchers.withText; +import static org.hamcrest.core.AllOf.allOf; + +@LargeTest +@RunWith(AndroidJUnit4.class) +public class UploadTest { + @Rule + public ActivityTestRule activityRule = new IntentsTestRule<>(MainActivity.class); + + @Test + public void uploadTest() { + if (!ConfigUtils.isBetaFlavour()) { + throw new Error("This test should only be run in Beta!"); + } + + // Uri to return by our mock gallery selector + // Requires file 'image.jpg' to be placed at root of file structure + Uri imageUri = Uri.parse("file://mnt/sdcard/image.jpg"); + + // Build a result to return from the Camera app + Intent intent = new Intent(); + intent.setData(imageUri); + ActivityResult result = new ActivityResult(Activity.RESULT_OK, intent); + + // Stub out the File picker. When an intent is sent to the File picker, this tells + // Espresso to respond with the ActivityResult we just created + intending(allOf(hasAction(Intent.ACTION_GET_CONTENT), hasType("image/*"))).respondWith(result); + + // Open FAB + onView(allOf(withId(R.id.fab_plus), isDisplayed())) + .perform(click()); + + // Click gallery + onView(allOf(withId(R.id.fab_gallery), isDisplayed())) + .perform(click()); + + // Validate that an intent to get an image is sent + intended(allOf(hasAction(Intent.ACTION_GET_CONTENT), hasType("image/*"))); + + // Create filename with the current time (to prevent overwrites) + SimpleDateFormat dateFormat = new SimpleDateFormat("yyMMdd-hhmmss"); + String commonsFileName = "MobileTest " + dateFormat.format(new Date()); + + // Try to dismiss the error, if there is one (probably about duplicate files on Commons) + try { + onView(withText("Yes")) + .check(matches(isDisplayed())) + .perform(click()); + } catch (NoMatchingViewException ignored) {} + + onView(allOf(withId(R.id.description_item_edit_text), withParent(withParent(withId(R.id.image_title_container))))) + .perform(replaceText(commonsFileName)); + + onView(withId(R.id.bottom_card_next)) + .perform(click()); + + try { + Thread.sleep(500); + } catch (InterruptedException e) { + e.printStackTrace(); + } + + onView(withId(R.id.category_search)) + .perform(replaceText("Uploaded with Mobile/Android Tests")); + + try { + Thread.sleep(3000); + } catch (InterruptedException e) { + e.printStackTrace(); + } + + onView(withParent(withId(R.id.categories))) + .perform(click()); + + onView(withId(R.id.category_next)) + .perform(click()); + + try { + Thread.sleep(500); + } catch (InterruptedException e) { + e.printStackTrace(); + } + + onView(withId(R.id.submit)) + .perform(click()); + + try { + Thread.sleep(10000); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } +} \ No newline at end of file From 8da3ae426c582be0541742ebfbc33d26ed1733f5 Mon Sep 17 00:00:00 2001 From: Adam Jones Date: Sun, 17 Mar 2019 00:31:54 +0000 Subject: [PATCH 06/11] Log the URL where the file should be uploaded --- app/src/androidTest/java/fr/free/nrw/commons/UploadTest.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/app/src/androidTest/java/fr/free/nrw/commons/UploadTest.java b/app/src/androidTest/java/fr/free/nrw/commons/UploadTest.java index 01d2d25869..9f9ceeda52 100644 --- a/app/src/androidTest/java/fr/free/nrw/commons/UploadTest.java +++ b/app/src/androidTest/java/fr/free/nrw/commons/UploadTest.java @@ -19,6 +19,7 @@ import androidx.test.runner.AndroidJUnit4; import fr.free.nrw.commons.contributions.MainActivity; import fr.free.nrw.commons.utils.ConfigUtils; +import timber.log.Timber; import static androidx.test.espresso.Espresso.onView; import static androidx.test.espresso.action.ViewActions.click; @@ -122,5 +123,9 @@ public void uploadTest() { } catch (InterruptedException e) { e.printStackTrace(); } + + String fileUrl = "https://commons.wikimedia.beta.wmflabs.org/wiki/File:" + + commonsFileName.replace(' ', '_') + ".jpg"; + Timber.i("File should be uploaded to " + fileUrl); } } \ No newline at end of file From 58fb8c6ec9c72fa011855d72cbad449c601542a5 Mon Sep 17 00:00:00 2001 From: Vivek Maskara Date: Mon, 18 Mar 2019 10:59:07 +0530 Subject: [PATCH 07/11] Generate an image file before testing uploads --- .../java/fr/free/nrw/commons/UploadTest.java | 54 +++++++++++++++++++ .../commons/contributions/MainActivity.java | 18 +++---- 2 files changed, 63 insertions(+), 9 deletions(-) diff --git a/app/src/androidTest/java/fr/free/nrw/commons/UploadTest.java b/app/src/androidTest/java/fr/free/nrw/commons/UploadTest.java index 9f9ceeda52..8d5a609baf 100644 --- a/app/src/androidTest/java/fr/free/nrw/commons/UploadTest.java +++ b/app/src/androidTest/java/fr/free/nrw/commons/UploadTest.java @@ -2,19 +2,29 @@ import android.app.Activity; import android.app.Instrumentation.ActivityResult; +import android.content.Context; +import android.content.ContextWrapper; import android.content.Intent; +import android.graphics.Bitmap; import android.net.Uri; +import android.os.Environment; +import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; import java.text.SimpleDateFormat; import java.util.Date; +import java.util.Random; import androidx.test.espresso.NoMatchingViewException; import androidx.test.espresso.intent.rule.IntentsTestRule; import androidx.test.filters.LargeTest; +import androidx.test.platform.app.InstrumentationRegistry; import androidx.test.rule.ActivityTestRule; import androidx.test.runner.AndroidJUnit4; import fr.free.nrw.commons.contributions.MainActivity; @@ -38,9 +48,53 @@ @LargeTest @RunWith(AndroidJUnit4.class) public class UploadTest { +// @Rule +// public GrantPermissionRule permissionRule = GrantPermissionRule.grant(Manifest.permission.WRITE_EXTERNAL_STORAGE); + @Rule public ActivityTestRule activityRule = new IntentsTestRule<>(MainActivity.class); + @Before + public void setup() { + saveToInternalStorage(); + } + + private void saveToInternalStorage() { + Bitmap bitmapImage = getRandomBitmap(); + Context applicationContext = InstrumentationRegistry.getInstrumentation().getTargetContext().getApplicationContext(); + ContextWrapper cw = new ContextWrapper(applicationContext); + // path to /data/data/yourapp/app_data/imageDir + File mypath = new File(Environment.getExternalStorageDirectory(), "image.jpg"); + + Timber.d("Filepath: %s", mypath.getPath()); + + Timber.d("Absolute Filepath: %s", mypath.getAbsolutePath()); + + FileOutputStream fos = null; + try { + fos = new FileOutputStream(mypath); + // Use the compress method on the BitMap object to write image to the OutputStream + bitmapImage.compress(Bitmap.CompressFormat.JPEG, 100, fos); + } catch (Exception e) { + e.printStackTrace(); + } finally { + try { + if (fos != null) { + fos.close(); + } + } catch (IOException e) { + e.printStackTrace(); + } + } + } + + private Bitmap getRandomBitmap() { + Random random = new Random(); + Bitmap bitmap = Bitmap.createBitmap(200, 200, Bitmap.Config.ARGB_8888); + bitmap.eraseColor(random.nextInt(255)); + return bitmap; + } + @Test public void uploadTest() { if (!ConfigUtils.isBetaFlavour()) { diff --git a/app/src/main/java/fr/free/nrw/commons/contributions/MainActivity.java b/app/src/main/java/fr/free/nrw/commons/contributions/MainActivity.java index 465856e4e1..447710b8d5 100644 --- a/app/src/main/java/fr/free/nrw/commons/contributions/MainActivity.java +++ b/app/src/main/java/fr/free/nrw/commons/contributions/MainActivity.java @@ -5,13 +5,6 @@ import android.content.Intent; import android.content.pm.PackageManager; import android.os.Bundle; -import com.google.android.material.tabs.TabLayout; -import androidx.fragment.app.Fragment; -import androidx.fragment.app.FragmentManager; -import androidx.fragment.app.FragmentPagerAdapter; -import androidx.core.view.GravityCompat; -import androidx.viewpager.widget.ViewPager; -import androidx.drawerlayout.widget.DrawerLayout; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuInflater; @@ -20,18 +13,24 @@ import android.widget.ImageView; import android.widget.TextView; +import com.google.android.material.tabs.TabLayout; + import java.util.List; import javax.inject.Inject; -import javax.inject.Named; +import androidx.core.view.GravityCompat; +import androidx.drawerlayout.widget.DrawerLayout; +import androidx.fragment.app.Fragment; +import androidx.fragment.app.FragmentManager; +import androidx.fragment.app.FragmentPagerAdapter; +import androidx.viewpager.widget.ViewPager; import butterknife.BindView; import butterknife.ButterKnife; import fr.free.nrw.commons.BuildConfig; import fr.free.nrw.commons.R; import fr.free.nrw.commons.auth.AuthenticatedActivity; import fr.free.nrw.commons.auth.SessionManager; -import fr.free.nrw.commons.kvstore.JsonKvStore; import fr.free.nrw.commons.location.LocationServiceManager; import fr.free.nrw.commons.nearby.NearbyFragment; import fr.free.nrw.commons.nearby.NearbyNotificationCardView; @@ -464,6 +463,7 @@ private void updateContributionFragmentTabContent(boolean isContributionsListFra @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { + Timber.d(data.toString()); super.onActivityResult(requestCode, resultCode, data); controller.handleActivityResult(this, requestCode, resultCode, data); } From 1f801be8088f4b0a61d24e0e8e4de28ae57b78b0 Mon Sep 17 00:00:00 2001 From: Vivek Maskara Date: Mon, 18 Mar 2019 11:18:31 +0530 Subject: [PATCH 08/11] With runtime permissions --- .../androidTest/java/fr/free/nrw/commons/UploadTest.java | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/app/src/androidTest/java/fr/free/nrw/commons/UploadTest.java b/app/src/androidTest/java/fr/free/nrw/commons/UploadTest.java index 8d5a609baf..cb38598877 100644 --- a/app/src/androidTest/java/fr/free/nrw/commons/UploadTest.java +++ b/app/src/androidTest/java/fr/free/nrw/commons/UploadTest.java @@ -1,5 +1,6 @@ package fr.free.nrw.commons; +import android.Manifest; import android.app.Activity; import android.app.Instrumentation.ActivityResult; import android.content.Context; @@ -26,6 +27,7 @@ import androidx.test.filters.LargeTest; import androidx.test.platform.app.InstrumentationRegistry; import androidx.test.rule.ActivityTestRule; +import androidx.test.rule.GrantPermissionRule; import androidx.test.runner.AndroidJUnit4; import fr.free.nrw.commons.contributions.MainActivity; import fr.free.nrw.commons.utils.ConfigUtils; @@ -48,8 +50,9 @@ @LargeTest @RunWith(AndroidJUnit4.class) public class UploadTest { -// @Rule -// public GrantPermissionRule permissionRule = GrantPermissionRule.grant(Manifest.permission.WRITE_EXTERNAL_STORAGE); + @Rule + public GrantPermissionRule permissionRule = GrantPermissionRule.grant(Manifest.permission.WRITE_EXTERNAL_STORAGE, + Manifest.permission.ACCESS_FINE_LOCATION); @Rule public ActivityTestRule activityRule = new IntentsTestRule<>(MainActivity.class); From f37405c9511031f5855332ca6b4328409ae7c851 Mon Sep 17 00:00:00 2001 From: Vivek Maskara Date: Mon, 18 Mar 2019 11:51:28 +0530 Subject: [PATCH 09/11] With automatic login --- .../java/fr/free/nrw/commons/UploadTest.java | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/app/src/androidTest/java/fr/free/nrw/commons/UploadTest.java b/app/src/androidTest/java/fr/free/nrw/commons/UploadTest.java index cb38598877..090848374d 100644 --- a/app/src/androidTest/java/fr/free/nrw/commons/UploadTest.java +++ b/app/src/androidTest/java/fr/free/nrw/commons/UploadTest.java @@ -55,7 +55,7 @@ public class UploadTest { Manifest.permission.ACCESS_FINE_LOCATION); @Rule - public ActivityTestRule activityRule = new IntentsTestRule<>(MainActivity.class); + public ActivityTestRule activityRule = new IntentsTestRule<>(WelcomeActivity.class); @Before public void setup() { @@ -98,6 +98,14 @@ private Bitmap getRandomBitmap() { return bitmap; } + private void getToMainActivity() { + //Skip tutorial + onView(withId(R.id.finishTutorialButton)) + .perform(click()); + //Perform Login + + } + @Test public void uploadTest() { if (!ConfigUtils.isBetaFlavour()) { From a1d870490e1b6b1546785e9b35286032b55076fc Mon Sep 17 00:00:00 2001 From: Vivek Maskara Date: Mon, 18 Mar 2019 20:25:55 +0530 Subject: [PATCH 10/11] With automatic login --- .../java/fr/free/nrw/commons/UploadTest.java | 27 ++++++++++++++----- 1 file changed, 21 insertions(+), 6 deletions(-) diff --git a/app/src/androidTest/java/fr/free/nrw/commons/UploadTest.java b/app/src/androidTest/java/fr/free/nrw/commons/UploadTest.java index 090848374d..3cdb803a11 100644 --- a/app/src/androidTest/java/fr/free/nrw/commons/UploadTest.java +++ b/app/src/androidTest/java/fr/free/nrw/commons/UploadTest.java @@ -9,6 +9,7 @@ import android.graphics.Bitmap; import android.net.Uri; import android.os.Environment; +import android.view.autofill.AutofillManager; import org.junit.Before; import org.junit.Rule; @@ -29,13 +30,15 @@ import androidx.test.rule.ActivityTestRule; import androidx.test.rule.GrantPermissionRule; import androidx.test.runner.AndroidJUnit4; -import fr.free.nrw.commons.contributions.MainActivity; +import fr.free.nrw.commons.auth.LoginActivity; import fr.free.nrw.commons.utils.ConfigUtils; import timber.log.Timber; import static androidx.test.espresso.Espresso.onView; +import static androidx.test.espresso.action.ViewActions.clearText; import static androidx.test.espresso.action.ViewActions.click; import static androidx.test.espresso.action.ViewActions.replaceText; +import static androidx.test.espresso.action.ViewActions.typeText; import static androidx.test.espresso.assertion.ViewAssertions.matches; import static androidx.test.espresso.intent.Intents.intended; import static androidx.test.espresso.intent.Intents.intending; @@ -55,10 +58,11 @@ public class UploadTest { Manifest.permission.ACCESS_FINE_LOCATION); @Rule - public ActivityTestRule activityRule = new IntentsTestRule<>(WelcomeActivity.class); + public ActivityTestRule activityRule = new IntentsTestRule<>(LoginActivity.class); @Before public void setup() { + saveToInternalStorage(); } @@ -99,11 +103,20 @@ private Bitmap getRandomBitmap() { } private void getToMainActivity() { - //Skip tutorial - onView(withId(R.id.finishTutorialButton)) - .perform(click()); - //Perform Login + try { + //Skip tutorial + onView(withId(R.id.finishTutorialButton)) + .perform(click()); + //Perform Login + onView(withId(R.id.loginUsername)) + .perform(clearText(), typeText("TestCommonsApp")); + onView(withId(R.id.loginPassword)) + .perform(clearText(), typeText("CommonsApp")); + onView(withId(R.id.loginButton)) + .perform(click()); + } catch (NoMatchingViewException ignored) { + } } @Test @@ -112,6 +125,8 @@ public void uploadTest() { throw new Error("This test should only be run in Beta!"); } + getToMainActivity(); + // Uri to return by our mock gallery selector // Requires file 'image.jpg' to be placed at root of file structure Uri imageUri = Uri.parse("file://mnt/sdcard/image.jpg"); From daaea6f4b74402027f36cc4a22370a082dcad37c Mon Sep 17 00:00:00 2001 From: Vivek Maskara Date: Tue, 19 Mar 2019 00:16:00 +0530 Subject: [PATCH 11/11] Get test credentials from travis --- app/build.gradle | 4 ++++ app/src/androidTest/java/fr/free/nrw/commons/UploadTest.java | 4 ++-- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 6250568bed..ba8559de39 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -194,6 +194,8 @@ android { buildConfigField "String", "BOOKMARK_AUTHORITY", "\"fr.free.nrw.commons.bookmarks.contentprovider\"" buildConfigField "String", "BOOKMARK_LOCATIONS_AUTHORITY", "\"fr.free.nrw.commons.bookmarks.locations.contentprovider\"" buildConfigField "String", "COMMIT_SHA", "\"" + getBuildVersion().toString() + "\"" + buildConfigField "String", "TEST_USERNAME", "\"" + System.getenv("test_user_name") + "\"" + buildConfigField "String", "TEST_PASSWORD", "\"" + System.getenv("test_user_password") + "\"" dimension 'tier' } @@ -224,6 +226,8 @@ android { buildConfigField "String", "BOOKMARK_AUTHORITY", "\"fr.free.nrw.commons.beta.bookmarks.contentprovider\"" buildConfigField "String", "BOOKMARK_LOCATIONS_AUTHORITY", "\"fr.free.nrw.commons.beta.bookmarks.locations.contentprovider\"" buildConfigField "String", "COMMIT_SHA", "\"" + getBuildVersion().toString() + "\"" + buildConfigField "String", "TEST_USERNAME", "\"" + System.getenv("test_user_name") + "\"" + buildConfigField "String", "TEST_PASSWORD", "\"" + System.getenv("test_user_password") + "\"" dimension 'tier' } diff --git a/app/src/androidTest/java/fr/free/nrw/commons/UploadTest.java b/app/src/androidTest/java/fr/free/nrw/commons/UploadTest.java index 3cdb803a11..9b29931a32 100644 --- a/app/src/androidTest/java/fr/free/nrw/commons/UploadTest.java +++ b/app/src/androidTest/java/fr/free/nrw/commons/UploadTest.java @@ -110,9 +110,9 @@ private void getToMainActivity() { //Perform Login onView(withId(R.id.loginUsername)) - .perform(clearText(), typeText("TestCommonsApp")); + .perform(clearText(), typeText(BuildConfig.TEST_USERNAME)); onView(withId(R.id.loginPassword)) - .perform(clearText(), typeText("CommonsApp")); + .perform(clearText(), typeText(BuildConfig.TEST_PASSWORD)); onView(withId(R.id.loginButton)) .perform(click()); } catch (NoMatchingViewException ignored) {