From fdde14e744be3c2531f3a62d200a0b29f74858a6 Mon Sep 17 00:00:00 2001 From: Andy Valdez Date: Wed, 6 Mar 2024 12:05:14 -0500 Subject: [PATCH 1/4] [Test] Updated BaseTest to allow for using a specific feature mock. This is necessary to allow for testing specific features. --- .../org/wordpress/android/e2e/StatsTests.kt | 2 +- .../wordpress/android/support/BaseTest.java | 16 +++++++-- .../{mobile => features}/feature-flags.json | 0 .../wpcom/features/stats-feature-flags.json | 34 +++++++++++++++++++ .../android/mocks/AssetFileSource.java | 32 +++++++++++++---- 5 files changed, 74 insertions(+), 10 deletions(-) rename libs/mocks/src/main/assets/mocks/mappings/wpcom/{mobile => features}/feature-flags.json (100%) create mode 100644 libs/mocks/src/main/assets/mocks/mappings/wpcom/features/stats-feature-flags.json diff --git a/WordPress/src/androidTest/java/org/wordpress/android/e2e/StatsTests.kt b/WordPress/src/androidTest/java/org/wordpress/android/e2e/StatsTests.kt index 1e9495f14b3e..3159c01cc930 100644 --- a/WordPress/src/androidTest/java/org/wordpress/android/e2e/StatsTests.kt +++ b/WordPress/src/androidTest/java/org/wordpress/android/e2e/StatsTests.kt @@ -35,7 +35,7 @@ class StatsTests : BaseTest() { Espresso.pressBack() } } - + @Test fun e2eAllDayStatsLoad() { val todayVisits = StatsVisitsData("97", "28", "14", "11") diff --git a/WordPress/src/androidTest/java/org/wordpress/android/support/BaseTest.java b/WordPress/src/androidTest/java/org/wordpress/android/support/BaseTest.java index e1c967f4029b..948df6241074 100644 --- a/WordPress/src/androidTest/java/org/wordpress/android/support/BaseTest.java +++ b/WordPress/src/androidTest/java/org/wordpress/android/support/BaseTest.java @@ -2,6 +2,7 @@ import android.app.Instrumentation; +import androidx.annotation.Nullable; import androidx.compose.ui.test.junit4.ComposeTestRule; import androidx.test.espresso.accessibility.AccessibilityChecks; import androidx.test.ext.junit.rules.ActivityScenarioRule; @@ -70,12 +71,21 @@ public class BaseTest { @Rule(order = 4) public WireMockRule wireMockRule; - { - Instrumentation instrumentation = InstrumentationRegistry.getInstrumentation(); + public BaseTest() { + this(null); + } + /** + * Constructor + * + * @param wireMockFeatureFileName the wiremock feature flag file to use for this specific test. + */ + public BaseTest (@Nullable final String wireMockFeatureFileName) { + Instrumentation instrumentation = InstrumentationRegistry.getInstrumentation(); wireMockRule = new WireMockRule( options().port(WIREMOCK_PORT) - .fileSource(new AssetFileSource(instrumentation.getContext().getAssets())) + .fileSource(new AssetFileSource(instrumentation.getContext().getAssets(), wireMockFeatureFileName)) + .extensions(new ResponseTemplateTransformer(true, new HashMap() { { put("fnow", new UnlocalizedDateHelper()); diff --git a/libs/mocks/src/main/assets/mocks/mappings/wpcom/mobile/feature-flags.json b/libs/mocks/src/main/assets/mocks/mappings/wpcom/features/feature-flags.json similarity index 100% rename from libs/mocks/src/main/assets/mocks/mappings/wpcom/mobile/feature-flags.json rename to libs/mocks/src/main/assets/mocks/mappings/wpcom/features/feature-flags.json diff --git a/libs/mocks/src/main/assets/mocks/mappings/wpcom/features/stats-feature-flags.json b/libs/mocks/src/main/assets/mocks/mappings/wpcom/features/stats-feature-flags.json new file mode 100644 index 000000000000..b2b881346977 --- /dev/null +++ b/libs/mocks/src/main/assets/mocks/mappings/wpcom/features/stats-feature-flags.json @@ -0,0 +1,34 @@ +{ + "request": { + "urlPathPattern": "/wpcom/v2/mobile/feature-flags/?", + "method": "GET", + "queryParameters": { + "build_number": { + "matches": "(.*)" + }, + "device_id": { + "matches": "(.*)" + }, + "identifier": { + "matches": "(.*)" + }, + "marketing_version": { + "matches": "(.*)" + }, + "platform": { + "matches": "android" + }, + "_locale": { + "matches": "(.*)" + } + } + }, + "response": { + "status": 200, + "jsonBody": { + "dashboard_card_activity_log": true, + "dashboard_card_pages": true, + "stats_traffic_tab": true + } + } +} diff --git a/libs/mocks/src/main/java/org/wordpress/android/mocks/AssetFileSource.java b/libs/mocks/src/main/java/org/wordpress/android/mocks/AssetFileSource.java index 4d2851d7a683..87f5a5d9abcf 100644 --- a/libs/mocks/src/main/java/org/wordpress/android/mocks/AssetFileSource.java +++ b/libs/mocks/src/main/java/org/wordpress/android/mocks/AssetFileSource.java @@ -1,6 +1,8 @@ package org.wordpress.android.mocks; import android.content.res.AssetManager; +import android.text.TextUtils; +import android.util.Log; import com.github.tomakehurst.wiremock.common.BinaryFile; import com.github.tomakehurst.wiremock.common.FileSource; @@ -21,18 +23,28 @@ * WireMock has no Android specific behaviour so we must implement asset loading here. */ public class AssetFileSource implements FileSource { - private static final String MOCKS_PATH = "mocks"; + static final String MOCKS_PATH = "mocks"; private final AssetManager mAssetManager; private final String mPath; - public AssetFileSource(AssetManager assetManager) { - this(assetManager, MOCKS_PATH); + private static String FEATURES_PATH = MOCKS_PATH + "/" + "mappings" + "/" + "wpcom/features"; + static String DEFAULT_FEATURE_FILE = "feature-flags.json"; + + final String featureFile; + + public AssetFileSource(AssetManager assetManager, final String featureFile) { + this(assetManager, MOCKS_PATH, featureFile); } - public AssetFileSource(AssetManager assetManager, String path) { + public AssetFileSource(AssetManager assetManager, String path, String featureFile) { mAssetManager = assetManager; mPath = path; + if (TextUtils.isEmpty(featureFile)) { + this.featureFile = DEFAULT_FEATURE_FILE; + } else { + this.featureFile = featureFile; + } } @Override public BinaryFile getBinaryFileNamed(String name) { @@ -47,7 +59,7 @@ public AssetFileSource(AssetManager assetManager, String path) { } @Override public FileSource child(String subDirectoryName) { - return new AssetFileSource(mAssetManager, mPath + "/" + subDirectoryName); + return new AssetFileSource(mAssetManager, mPath + "/" + subDirectoryName, featureFile); } @Override public String getPath() { @@ -95,7 +107,9 @@ private void recursivelyAddFilePathsToList(String root, List filePaths) if (isDirectory(path)) { recursivelyAddFilePathsToList(path, filePaths); } else { - filePaths.add(path); + if (!this.skipAddingFile(root, name)) { + filePaths.add(path); + } } } } catch (IOException e) { @@ -103,6 +117,12 @@ private void recursivelyAddFilePathsToList(String root, List filePaths) } } + boolean skipAddingFile(final String root, final String fileName) { + Log.d("BLOOP", "Skipping file ("+ root + ", " + fileName + "): " + (root.equals(FEATURES_PATH) && !featureFile.equals(fileName))); + return root.equals(FEATURES_PATH) && !featureFile.equals(fileName); +// return false; + } + private List toTextFileList(List filePaths) { return newArrayList(transform(filePaths, new Function() { public TextFile apply(String input) { From f6628c10518d7e73bbf7629831ba86b65755025c Mon Sep 17 00:00:00 2001 From: Andy Valdez Date: Wed, 6 Mar 2024 16:08:03 -0500 Subject: [PATCH 2/4] [Test] Add simple new stats traffic test and fix checkstyle issues. --- .../wordpress/android/e2e/StatsNewTests.kt | 46 +++++++++++++++++++ .../wordpress/android/e2e/pages/StatsPage.kt | 18 ++++++++ .../wordpress/android/support/BaseTest.java | 6 ++- .../android/mocks/AssetFileSource.java | 17 +++---- 4 files changed, 75 insertions(+), 12 deletions(-) create mode 100644 WordPress/src/androidTest/java/org/wordpress/android/e2e/StatsNewTests.kt diff --git a/WordPress/src/androidTest/java/org/wordpress/android/e2e/StatsNewTests.kt b/WordPress/src/androidTest/java/org/wordpress/android/e2e/StatsNewTests.kt new file mode 100644 index 000000000000..cb7a62b3850e --- /dev/null +++ b/WordPress/src/androidTest/java/org/wordpress/android/e2e/StatsNewTests.kt @@ -0,0 +1,46 @@ +package org.wordpress.android.e2e + +import androidx.test.espresso.Espresso +import androidx.test.espresso.matcher.ViewMatchers +import dagger.hilt.android.testing.HiltAndroidTest +import org.junit.After +import org.junit.Assume +import org.junit.Before +import org.junit.Test +import org.wordpress.android.BuildConfig +import org.wordpress.android.R +import org.wordpress.android.e2e.pages.MySitesPage +import org.wordpress.android.support.BaseTest +import org.wordpress.android.support.ComposeEspressoLink +import org.wordpress.android.support.WPSupportUtils +import org.wordpress.android.util.StatsKeyValueData +import org.wordpress.android.util.StatsMocksReader +import org.wordpress.android.util.StatsVisitsData + +@HiltAndroidTest +class StatsNewTests : BaseTest("stats-feature-flags.json") { + @Before + fun setUp() { + Assume.assumeTrue(BuildConfig.IS_JETPACK_APP) + ComposeEspressoLink().unregister() + logoutIfNecessary() + wpLogin() + } + + @After + fun tearDown() { + // "tabLayout" is a Tab switcher for stats. + // We need to leave stats at the end of test. + if (WPSupportUtils.isElementDisplayed(Espresso.onView(ViewMatchers.withId(R.id.tabLayout)))) { + Espresso.pressBack() + } + } + + @Test + fun e2eAllDayStatsLoad() { + MySitesPage() + .go() + .goToStats() + .hasNewStatTabs() + } +} diff --git a/WordPress/src/androidTest/java/org/wordpress/android/e2e/pages/StatsPage.kt b/WordPress/src/androidTest/java/org/wordpress/android/e2e/pages/StatsPage.kt index 76c2c4d8a054..6096099be7ee 100644 --- a/WordPress/src/androidTest/java/org/wordpress/android/e2e/pages/StatsPage.kt +++ b/WordPress/src/androidTest/java/org/wordpress/android/e2e/pages/StatsPage.kt @@ -14,6 +14,24 @@ import org.wordpress.android.util.StatsKeyValueData import org.wordpress.android.util.StatsVisitsData class StatsPage { + /** + * Matcher to check that the right tabs exist. + */ + fun hasNewStatTabs(): StatsPage { + Espresso.onView( + Matchers.allOf( + ViewMatchers.isDescendantOfA(ViewMatchers.withId(R.id.tabLayout)), + ViewMatchers.withText("Traffic") + ) + ).check(ViewAssertions.matches(ViewMatchers.isDisplayed())) + Espresso.onView( + Matchers.allOf( + ViewMatchers.isDescendantOfA(ViewMatchers.withId(R.id.tabLayout)), + ViewMatchers.withText("Insights") + ) + ).check(ViewAssertions.matches(ViewMatchers.isDisplayed())) + return this + } fun openDayStats(): StatsPage { val daysStatsTab = Espresso.onView( Matchers.allOf( diff --git a/WordPress/src/androidTest/java/org/wordpress/android/support/BaseTest.java b/WordPress/src/androidTest/java/org/wordpress/android/support/BaseTest.java index 948df6241074..7c826483880b 100644 --- a/WordPress/src/androidTest/java/org/wordpress/android/support/BaseTest.java +++ b/WordPress/src/androidTest/java/org/wordpress/android/support/BaseTest.java @@ -80,11 +80,13 @@ public BaseTest() { * * @param wireMockFeatureFileName the wiremock feature flag file to use for this specific test. */ - public BaseTest (@Nullable final String wireMockFeatureFileName) { + public BaseTest(@Nullable final String wireMockFeatureFileName) { Instrumentation instrumentation = InstrumentationRegistry.getInstrumentation(); wireMockRule = new WireMockRule( options().port(WIREMOCK_PORT) - .fileSource(new AssetFileSource(instrumentation.getContext().getAssets(), wireMockFeatureFileName)) + .fileSource( + new AssetFileSource(instrumentation.getContext().getAssets(), wireMockFeatureFileName) + ) .extensions(new ResponseTemplateTransformer(true, new HashMap() { { diff --git a/libs/mocks/src/main/java/org/wordpress/android/mocks/AssetFileSource.java b/libs/mocks/src/main/java/org/wordpress/android/mocks/AssetFileSource.java index 87f5a5d9abcf..426f67b0de24 100644 --- a/libs/mocks/src/main/java/org/wordpress/android/mocks/AssetFileSource.java +++ b/libs/mocks/src/main/java/org/wordpress/android/mocks/AssetFileSource.java @@ -2,7 +2,6 @@ import android.content.res.AssetManager; import android.text.TextUtils; -import android.util.Log; import com.github.tomakehurst.wiremock.common.BinaryFile; import com.github.tomakehurst.wiremock.common.FileSource; @@ -28,10 +27,10 @@ public class AssetFileSource implements FileSource { private final AssetManager mAssetManager; private final String mPath; - private static String FEATURES_PATH = MOCKS_PATH + "/" + "mappings" + "/" + "wpcom/features"; - static String DEFAULT_FEATURE_FILE = "feature-flags.json"; + private static final String FEATURES_PATH = MOCKS_PATH + "/" + "mappings" + "/" + "wpcom/features"; + static final String DEFAULT_FEATURE_FILE = "feature-flags.json"; - final String featureFile; + private final String mFeatureFile; public AssetFileSource(AssetManager assetManager, final String featureFile) { this(assetManager, MOCKS_PATH, featureFile); @@ -41,9 +40,9 @@ public AssetFileSource(AssetManager assetManager, String path, String featureFil mAssetManager = assetManager; mPath = path; if (TextUtils.isEmpty(featureFile)) { - this.featureFile = DEFAULT_FEATURE_FILE; + this.mFeatureFile = DEFAULT_FEATURE_FILE; } else { - this.featureFile = featureFile; + this.mFeatureFile = featureFile; } } @@ -59,7 +58,7 @@ public AssetFileSource(AssetManager assetManager, String path, String featureFil } @Override public FileSource child(String subDirectoryName) { - return new AssetFileSource(mAssetManager, mPath + "/" + subDirectoryName, featureFile); + return new AssetFileSource(mAssetManager, mPath + "/" + subDirectoryName, mFeatureFile); } @Override public String getPath() { @@ -118,9 +117,7 @@ private void recursivelyAddFilePathsToList(String root, List filePaths) } boolean skipAddingFile(final String root, final String fileName) { - Log.d("BLOOP", "Skipping file ("+ root + ", " + fileName + "): " + (root.equals(FEATURES_PATH) && !featureFile.equals(fileName))); - return root.equals(FEATURES_PATH) && !featureFile.equals(fileName); -// return false; + return root.equals(FEATURES_PATH) && !mFeatureFile.equals(fileName); } private List toTextFileList(List filePaths) { From 7fa14b260ad949d9b50de69aaa3d8fce98de04df Mon Sep 17 00:00:00 2001 From: Andy Valdez Date: Mon, 11 Mar 2024 18:45:44 -0400 Subject: [PATCH 3/4] [Test] Undid previous AssetFileSource edit and instead use WirMock stubFor --- .../wordpress/android/e2e/StatsNewTests.kt | 2 +- .../wordpress/android/support/BaseTest.java | 16 ++++++++- .../resources/new-stats-feature-response.json | 3 ++ .../wpcom/features/stats-feature-flags.json | 34 ------------------- .../{features => mobile}/feature-flags.json | 0 .../android/mocks/AssetFileSource.java | 29 ++++------------ 6 files changed, 25 insertions(+), 59 deletions(-) create mode 100644 WordPress/src/androidTest/resources/new-stats-feature-response.json delete mode 100644 libs/mocks/src/main/assets/mocks/mappings/wpcom/features/stats-feature-flags.json rename libs/mocks/src/main/assets/mocks/mappings/wpcom/{features => mobile}/feature-flags.json (100%) diff --git a/WordPress/src/androidTest/java/org/wordpress/android/e2e/StatsNewTests.kt b/WordPress/src/androidTest/java/org/wordpress/android/e2e/StatsNewTests.kt index cb7a62b3850e..8d9331eeb5f1 100644 --- a/WordPress/src/androidTest/java/org/wordpress/android/e2e/StatsNewTests.kt +++ b/WordPress/src/androidTest/java/org/wordpress/android/e2e/StatsNewTests.kt @@ -18,7 +18,7 @@ import org.wordpress.android.util.StatsMocksReader import org.wordpress.android.util.StatsVisitsData @HiltAndroidTest -class StatsNewTests : BaseTest("stats-feature-flags.json") { +class StatsNewTests : BaseTest("new-stats-feature-response.json") { @Before fun setUp() { Assume.assumeTrue(BuildConfig.IS_JETPACK_APP) diff --git a/WordPress/src/androidTest/java/org/wordpress/android/support/BaseTest.java b/WordPress/src/androidTest/java/org/wordpress/android/support/BaseTest.java index 7c826483880b..6adaa6af4bd3 100644 --- a/WordPress/src/androidTest/java/org/wordpress/android/support/BaseTest.java +++ b/WordPress/src/androidTest/java/org/wordpress/android/support/BaseTest.java @@ -11,6 +11,7 @@ import com.fasterxml.jackson.databind.util.ISO8601Utils; import com.github.jknack.handlebars.Helper; import com.github.jknack.handlebars.Options; +import com.github.tomakehurst.wiremock.client.WireMock; import com.github.tomakehurst.wiremock.extension.responsetemplating.ResponseTemplateTransformer; import com.github.tomakehurst.wiremock.extension.responsetemplating.helpers.DateOffset; import com.github.tomakehurst.wiremock.extension.responsetemplating.helpers.HandlebarsHelper; @@ -29,6 +30,7 @@ import org.wordpress.android.e2e.flows.LoginFlow; import org.wordpress.android.e2e.pages.MePage; import org.wordpress.android.e2e.pages.MySitesPage; +import org.wordpress.android.editor.Utils; import org.wordpress.android.mocks.AndroidNotifier; import org.wordpress.android.mocks.AssetFileSource; import org.wordpress.android.ui.WPLaunchActivity; @@ -85,7 +87,7 @@ public BaseTest(@Nullable final String wireMockFeatureFileName) { wireMockRule = new WireMockRule( options().port(WIREMOCK_PORT) .fileSource( - new AssetFileSource(instrumentation.getContext().getAssets(), wireMockFeatureFileName) + new AssetFileSource(instrumentation.getContext().getAssets()) ) .extensions(new ResponseTemplateTransformer(true, new HashMap() { @@ -94,6 +96,18 @@ public BaseTest(@Nullable final String wireMockFeatureFileName) { } })) .notifier(new AndroidNotifier())); + if (wireMockFeatureFileName != null) { + try { + final String result = Utils.getStringFromInputStream(instrumentation.getContext().getClassLoader() + .getResourceAsStream( + wireMockFeatureFileName)); + // This is where we can stub out + wireMockRule.stubFor(WireMock.get(WireMock.urlPathMatching("/wpcom/v2/mobile/feature-flags/")) + .willReturn(WireMock.aResponse().withBody(result))); + } catch (final Exception exception) { + // do nothing + } + } } @Before diff --git a/WordPress/src/androidTest/resources/new-stats-feature-response.json b/WordPress/src/androidTest/resources/new-stats-feature-response.json new file mode 100644 index 000000000000..6caeb0a839bd --- /dev/null +++ b/WordPress/src/androidTest/resources/new-stats-feature-response.json @@ -0,0 +1,3 @@ +{ + "stats_traffic_tab": true +} diff --git a/libs/mocks/src/main/assets/mocks/mappings/wpcom/features/stats-feature-flags.json b/libs/mocks/src/main/assets/mocks/mappings/wpcom/features/stats-feature-flags.json deleted file mode 100644 index b2b881346977..000000000000 --- a/libs/mocks/src/main/assets/mocks/mappings/wpcom/features/stats-feature-flags.json +++ /dev/null @@ -1,34 +0,0 @@ -{ - "request": { - "urlPathPattern": "/wpcom/v2/mobile/feature-flags/?", - "method": "GET", - "queryParameters": { - "build_number": { - "matches": "(.*)" - }, - "device_id": { - "matches": "(.*)" - }, - "identifier": { - "matches": "(.*)" - }, - "marketing_version": { - "matches": "(.*)" - }, - "platform": { - "matches": "android" - }, - "_locale": { - "matches": "(.*)" - } - } - }, - "response": { - "status": 200, - "jsonBody": { - "dashboard_card_activity_log": true, - "dashboard_card_pages": true, - "stats_traffic_tab": true - } - } -} diff --git a/libs/mocks/src/main/assets/mocks/mappings/wpcom/features/feature-flags.json b/libs/mocks/src/main/assets/mocks/mappings/wpcom/mobile/feature-flags.json similarity index 100% rename from libs/mocks/src/main/assets/mocks/mappings/wpcom/features/feature-flags.json rename to libs/mocks/src/main/assets/mocks/mappings/wpcom/mobile/feature-flags.json diff --git a/libs/mocks/src/main/java/org/wordpress/android/mocks/AssetFileSource.java b/libs/mocks/src/main/java/org/wordpress/android/mocks/AssetFileSource.java index 426f67b0de24..4d2851d7a683 100644 --- a/libs/mocks/src/main/java/org/wordpress/android/mocks/AssetFileSource.java +++ b/libs/mocks/src/main/java/org/wordpress/android/mocks/AssetFileSource.java @@ -1,7 +1,6 @@ package org.wordpress.android.mocks; import android.content.res.AssetManager; -import android.text.TextUtils; import com.github.tomakehurst.wiremock.common.BinaryFile; import com.github.tomakehurst.wiremock.common.FileSource; @@ -22,28 +21,18 @@ * WireMock has no Android specific behaviour so we must implement asset loading here. */ public class AssetFileSource implements FileSource { - static final String MOCKS_PATH = "mocks"; + private static final String MOCKS_PATH = "mocks"; private final AssetManager mAssetManager; private final String mPath; - private static final String FEATURES_PATH = MOCKS_PATH + "/" + "mappings" + "/" + "wpcom/features"; - static final String DEFAULT_FEATURE_FILE = "feature-flags.json"; - - private final String mFeatureFile; - - public AssetFileSource(AssetManager assetManager, final String featureFile) { - this(assetManager, MOCKS_PATH, featureFile); + public AssetFileSource(AssetManager assetManager) { + this(assetManager, MOCKS_PATH); } - public AssetFileSource(AssetManager assetManager, String path, String featureFile) { + public AssetFileSource(AssetManager assetManager, String path) { mAssetManager = assetManager; mPath = path; - if (TextUtils.isEmpty(featureFile)) { - this.mFeatureFile = DEFAULT_FEATURE_FILE; - } else { - this.mFeatureFile = featureFile; - } } @Override public BinaryFile getBinaryFileNamed(String name) { @@ -58,7 +47,7 @@ public AssetFileSource(AssetManager assetManager, String path, String featureFil } @Override public FileSource child(String subDirectoryName) { - return new AssetFileSource(mAssetManager, mPath + "/" + subDirectoryName, mFeatureFile); + return new AssetFileSource(mAssetManager, mPath + "/" + subDirectoryName); } @Override public String getPath() { @@ -106,9 +95,7 @@ private void recursivelyAddFilePathsToList(String root, List filePaths) if (isDirectory(path)) { recursivelyAddFilePathsToList(path, filePaths); } else { - if (!this.skipAddingFile(root, name)) { - filePaths.add(path); - } + filePaths.add(path); } } } catch (IOException e) { @@ -116,10 +103,6 @@ private void recursivelyAddFilePathsToList(String root, List filePaths) } } - boolean skipAddingFile(final String root, final String fileName) { - return root.equals(FEATURES_PATH) && !mFeatureFile.equals(fileName); - } - private List toTextFileList(List filePaths) { return newArrayList(transform(filePaths, new Function() { public TextFile apply(String input) { From d91cbf98d782446f6278d668f42e1598d2c62c18 Mon Sep 17 00:00:00 2001 From: Andy Valdez Date: Wed, 13 Mar 2024 15:26:10 -0400 Subject: [PATCH 4/4] [Test] Refactored a bit to allow stubbing more than one endpoint. --- .../android/e2e/StatsGranularTabsTest.kt | 62 +++++++++++++++++++ .../wordpress/android/e2e/StatsNewTests.kt | 46 -------------- .../org/wordpress/android/e2e/StatsTests.kt | 29 ++------- .../wordpress/android/support/BaseTest.java | 32 ++++++---- .../android/wiremock/WireMockStub.kt | 18 ++++++ 5 files changed, 106 insertions(+), 81 deletions(-) create mode 100644 WordPress/src/androidTest/java/org/wordpress/android/e2e/StatsGranularTabsTest.kt delete mode 100644 WordPress/src/androidTest/java/org/wordpress/android/e2e/StatsNewTests.kt create mode 100644 WordPress/src/androidTest/java/org/wordpress/android/wiremock/WireMockStub.kt diff --git a/WordPress/src/androidTest/java/org/wordpress/android/e2e/StatsGranularTabsTest.kt b/WordPress/src/androidTest/java/org/wordpress/android/e2e/StatsGranularTabsTest.kt new file mode 100644 index 000000000000..ada96b9c90c6 --- /dev/null +++ b/WordPress/src/androidTest/java/org/wordpress/android/e2e/StatsGranularTabsTest.kt @@ -0,0 +1,62 @@ +package org.wordpress.android.e2e + +import androidx.test.espresso.Espresso +import androidx.test.espresso.matcher.ViewMatchers +import dagger.hilt.android.testing.HiltAndroidTest +import org.junit.After +import org.junit.Assume.assumeTrue +import org.junit.Before +import org.junit.Test +import org.wordpress.android.BuildConfig +import org.wordpress.android.R +import org.wordpress.android.e2e.pages.MySitesPage +import org.wordpress.android.support.BaseTest +import org.wordpress.android.support.ComposeEspressoLink +import org.wordpress.android.support.WPSupportUtils +import org.wordpress.android.util.StatsKeyValueData +import org.wordpress.android.util.StatsMocksReader +import org.wordpress.android.util.StatsVisitsData + +@HiltAndroidTest +class StatsGranularTabsTest : BaseTest() { + @Before + fun setUp() { + assumeTrue(BuildConfig.IS_JETPACK_APP) + ComposeEspressoLink().unregister() + logoutIfNecessary() + wpLogin() + } + + @After + fun tearDown() { + // "tabLayout" is a Tab switcher for stats. + // We need to leave stats at the end of test. + if (WPSupportUtils.isElementDisplayed(Espresso.onView(ViewMatchers.withId(R.id.tabLayout)))) { + Espresso.pressBack() + } + } + + @Test + fun e2eAllDayStatsLoad() { + val todayVisits = StatsVisitsData("97", "28", "14", "11") + val postsList: List = StatsMocksReader().readDayTopPostsToList() + val referrersList: List = StatsMocksReader().readDayTopReferrersToList() + val clicksList: List = StatsMocksReader().readDayClicksToList() + val authorsList: List = StatsMocksReader().readDayAuthorsToList() + val countriesList: List = StatsMocksReader().readDayCountriesToList() + val videosList: List = StatsMocksReader().readDayVideoPlaysToList() + val downloadsList: List = StatsMocksReader().readDayFileDownloadsToList() + MySitesPage() + .go() + .goToStats() + .openDayStats() + .assertVisits(todayVisits) + .scrollToPosts().assertPosts(postsList) + .scrollToReferrers().assertReferrers(referrersList) + .scrollToClicks().assertClicks(clicksList) + .scrollToAuthors().assertAuthors(authorsList) + .scrollToCountries().assertCountries(countriesList) + .scrollToVideos().assertVideos(videosList) + .scrollToFileDownloads().assertDownloads(downloadsList) + } +} diff --git a/WordPress/src/androidTest/java/org/wordpress/android/e2e/StatsNewTests.kt b/WordPress/src/androidTest/java/org/wordpress/android/e2e/StatsNewTests.kt deleted file mode 100644 index 8d9331eeb5f1..000000000000 --- a/WordPress/src/androidTest/java/org/wordpress/android/e2e/StatsNewTests.kt +++ /dev/null @@ -1,46 +0,0 @@ -package org.wordpress.android.e2e - -import androidx.test.espresso.Espresso -import androidx.test.espresso.matcher.ViewMatchers -import dagger.hilt.android.testing.HiltAndroidTest -import org.junit.After -import org.junit.Assume -import org.junit.Before -import org.junit.Test -import org.wordpress.android.BuildConfig -import org.wordpress.android.R -import org.wordpress.android.e2e.pages.MySitesPage -import org.wordpress.android.support.BaseTest -import org.wordpress.android.support.ComposeEspressoLink -import org.wordpress.android.support.WPSupportUtils -import org.wordpress.android.util.StatsKeyValueData -import org.wordpress.android.util.StatsMocksReader -import org.wordpress.android.util.StatsVisitsData - -@HiltAndroidTest -class StatsNewTests : BaseTest("new-stats-feature-response.json") { - @Before - fun setUp() { - Assume.assumeTrue(BuildConfig.IS_JETPACK_APP) - ComposeEspressoLink().unregister() - logoutIfNecessary() - wpLogin() - } - - @After - fun tearDown() { - // "tabLayout" is a Tab switcher for stats. - // We need to leave stats at the end of test. - if (WPSupportUtils.isElementDisplayed(Espresso.onView(ViewMatchers.withId(R.id.tabLayout)))) { - Espresso.pressBack() - } - } - - @Test - fun e2eAllDayStatsLoad() { - MySitesPage() - .go() - .goToStats() - .hasNewStatTabs() - } -} diff --git a/WordPress/src/androidTest/java/org/wordpress/android/e2e/StatsTests.kt b/WordPress/src/androidTest/java/org/wordpress/android/e2e/StatsTests.kt index 3159c01cc930..77a26a4175b3 100644 --- a/WordPress/src/androidTest/java/org/wordpress/android/e2e/StatsTests.kt +++ b/WordPress/src/androidTest/java/org/wordpress/android/e2e/StatsTests.kt @@ -4,7 +4,7 @@ import androidx.test.espresso.Espresso import androidx.test.espresso.matcher.ViewMatchers import dagger.hilt.android.testing.HiltAndroidTest import org.junit.After -import org.junit.Assume.assumeTrue +import org.junit.Assume import org.junit.Before import org.junit.Test import org.wordpress.android.BuildConfig @@ -13,15 +13,14 @@ import org.wordpress.android.e2e.pages.MySitesPage import org.wordpress.android.support.BaseTest import org.wordpress.android.support.ComposeEspressoLink import org.wordpress.android.support.WPSupportUtils -import org.wordpress.android.util.StatsKeyValueData -import org.wordpress.android.util.StatsMocksReader -import org.wordpress.android.util.StatsVisitsData +import org.wordpress.android.wiremock.WireMockStub +import org.wordpress.android.wiremock.WireMockUrlPath @HiltAndroidTest -class StatsTests : BaseTest() { +class StatsTests : BaseTest(listOf(WireMockStub(urlPath = WireMockUrlPath.FEATURE_RESPONSE, fileName = "new-stats-feature-response.json"))) { @Before fun setUp() { - assumeTrue(BuildConfig.IS_JETPACK_APP) + Assume.assumeTrue(BuildConfig.IS_JETPACK_APP) ComposeEspressoLink().unregister() logoutIfNecessary() wpLogin() @@ -38,25 +37,9 @@ class StatsTests : BaseTest() { @Test fun e2eAllDayStatsLoad() { - val todayVisits = StatsVisitsData("97", "28", "14", "11") - val postsList: List = StatsMocksReader().readDayTopPostsToList() - val referrersList: List = StatsMocksReader().readDayTopReferrersToList() - val clicksList: List = StatsMocksReader().readDayClicksToList() - val authorsList: List = StatsMocksReader().readDayAuthorsToList() - val countriesList: List = StatsMocksReader().readDayCountriesToList() - val videosList: List = StatsMocksReader().readDayVideoPlaysToList() - val downloadsList: List = StatsMocksReader().readDayFileDownloadsToList() MySitesPage() .go() .goToStats() - .openDayStats() - .assertVisits(todayVisits) - .scrollToPosts().assertPosts(postsList) - .scrollToReferrers().assertReferrers(referrersList) - .scrollToClicks().assertClicks(clicksList) - .scrollToAuthors().assertAuthors(authorsList) - .scrollToCountries().assertCountries(countriesList) - .scrollToVideos().assertVideos(videosList) - .scrollToFileDownloads().assertDownloads(downloadsList) + .hasNewStatTabs() } } diff --git a/WordPress/src/androidTest/java/org/wordpress/android/support/BaseTest.java b/WordPress/src/androidTest/java/org/wordpress/android/support/BaseTest.java index 6adaa6af4bd3..95322a95a7ff 100644 --- a/WordPress/src/androidTest/java/org/wordpress/android/support/BaseTest.java +++ b/WordPress/src/androidTest/java/org/wordpress/android/support/BaseTest.java @@ -1,6 +1,7 @@ package org.wordpress.android.support; import android.app.Instrumentation; +import android.util.Log; import androidx.annotation.Nullable; import androidx.compose.ui.test.junit4.ComposeTestRule; @@ -34,11 +35,13 @@ import org.wordpress.android.mocks.AndroidNotifier; import org.wordpress.android.mocks.AssetFileSource; import org.wordpress.android.ui.WPLaunchActivity; +import org.wordpress.android.wiremock.WireMockStub; import java.io.IOException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.HashMap; +import java.util.List; import java.util.Locale; import java.util.TimeZone; @@ -55,6 +58,7 @@ import dagger.hilt.android.testing.HiltAndroidRule; public class BaseTest { + static final String TAG = BaseTest.class.getSimpleName(); public static final int WIREMOCK_PORT = 8080; @Rule(order = 0) @@ -80,9 +84,9 @@ public BaseTest() { /** * Constructor * - * @param wireMockFeatureFileName the wiremock feature flag file to use for this specific test. + * @param wireMockStubs the wiremock stubs to use for this specific test. */ - public BaseTest(@Nullable final String wireMockFeatureFileName) { + public BaseTest(@Nullable final List wireMockStubs) { Instrumentation instrumentation = InstrumentationRegistry.getInstrumentation(); wireMockRule = new WireMockRule( options().port(WIREMOCK_PORT) @@ -96,16 +100,20 @@ public BaseTest(@Nullable final String wireMockFeatureFileName) { } })) .notifier(new AndroidNotifier())); - if (wireMockFeatureFileName != null) { - try { - final String result = Utils.getStringFromInputStream(instrumentation.getContext().getClassLoader() - .getResourceAsStream( - wireMockFeatureFileName)); - // This is where we can stub out - wireMockRule.stubFor(WireMock.get(WireMock.urlPathMatching("/wpcom/v2/mobile/feature-flags/")) - .willReturn(WireMock.aResponse().withBody(result))); - } catch (final Exception exception) { - // do nothing + if (wireMockStubs != null && !wireMockStubs.isEmpty()) { + for (WireMockStub wireMockStub : wireMockStubs) { + try { + final String result = Utils.getStringFromInputStream( + instrumentation.getContext().getClassLoader().getResourceAsStream( + wireMockStub.getFileName() + ) + ); + // This is where we can stub out + wireMockRule.stubFor(WireMock.get(WireMock.urlPathMatching(wireMockStub.getUrlPath().getPath())) + .willReturn(WireMock.aResponse().withBody(result))); + } catch (final Exception exception) { + Log.e(TAG, "Problem stubbing endpoint", exception); + } } } } diff --git a/WordPress/src/androidTest/java/org/wordpress/android/wiremock/WireMockStub.kt b/WordPress/src/androidTest/java/org/wordpress/android/wiremock/WireMockStub.kt new file mode 100644 index 000000000000..516d915f0ef5 --- /dev/null +++ b/WordPress/src/androidTest/java/org/wordpress/android/wiremock/WireMockStub.kt @@ -0,0 +1,18 @@ +package org.wordpress.android.wiremock + +/** + * Represents a WireMock#stubFor call on a WireMockServer. + * @property apiPathUrl The API path we are matching against. + * @property fileName The filename used to return as the body stored in the androidTest resources sub directory. + */ +data class WireMockStub( + val urlPath: WireMockUrlPath, + val fileName: String, +) + +/** + * Enum used to represent supported URLs we can stub. + */ +enum class WireMockUrlPath(val path: String) { + FEATURE_RESPONSE("/wpcom/v2/mobile/feature-flags/") +}