Эх сурвалжийг харах

Merge pull request #11248 from nextcloud/test-injection

Enable overriding injections in AndroidInjection classes during connected tests
Álvaro Brey 2 жил өмнө
parent
commit
bbedbc973a
39 өөрчлөгдсөн 360 нэмэгдсэн , 93 устгасан
  1. 1 3
      app/src/androidTest/java/com/nextcloud/client/AuthenticatorActivityIT.java
  2. 1 0
      app/src/androidTest/java/com/nextcloud/client/CommunityActivityIT.java
  3. 1 0
      app/src/androidTest/java/com/nextcloud/client/EndToEndRandomIT.java
  4. 1 0
      app/src/androidTest/java/com/nextcloud/client/FileDisplayActivityIT.kt
  5. 0 51
      app/src/androidTest/java/com/nextcloud/client/ScreenshotTestRunner.java
  6. 46 0
      app/src/androidTest/java/com/nextcloud/client/ScreenshotTestRunner.kt
  7. 1 0
      app/src/androidTest/java/com/nextcloud/client/SettingsActivityIT.kt
  8. 1 1
      app/src/androidTest/java/com/nextcloud/test/GrantStoragePermissionRule.kt
  9. 44 0
      app/src/androidTest/java/com/nextcloud/test/InjectionOverrideRule.kt
  10. 62 0
      app/src/androidTest/java/com/nextcloud/test/InjectionTestActivityTest.kt
  11. 1 1
      app/src/androidTest/java/com/nextcloud/test/RetryTestRule.kt
  12. 74 0
      app/src/androidTest/java/com/nextcloud/test/TestMainApp.kt
  13. 1 1
      app/src/androidTest/java/com/nextcloud/ui/BitmapIT.kt
  14. 1 1
      app/src/androidTest/java/com/owncloud/android/AbstractIT.java
  15. 1 1
      app/src/androidTest/java/com/owncloud/android/authentication/PassCodeManagerIT.kt
  16. 1 1
      app/src/androidTest/java/com/owncloud/android/files/FileMenuFilterIT.kt
  17. 1 1
      app/src/androidTest/java/com/owncloud/android/providers/UsersAndGroupsSearchProviderIT.kt
  18. 2 2
      app/src/androidTest/java/com/owncloud/android/ui/LoginIT.kt
  19. 1 1
      app/src/androidTest/java/com/owncloud/android/ui/activity/DrawerActivityIT.java
  20. 0 2
      app/src/androidTest/java/com/owncloud/android/ui/activity/FileDisplayActivityTest.java
  21. 1 1
      app/src/androidTest/java/com/owncloud/android/ui/activity/UploadFilesActivityIT.kt
  22. 1 1
      app/src/androidTest/java/com/owncloud/android/ui/dialog/SendFilesDialogTest.kt
  23. 1 1
      app/src/androidTest/java/com/owncloud/android/ui/dialog/SendShareDialogTest.kt
  24. 1 1
      app/src/androidTest/java/com/owncloud/android/ui/dialog/SetupEncryptionDialogFragmentIT.kt
  25. 1 1
      app/src/androidTest/java/com/owncloud/android/ui/fragment/AvatarIT.kt
  26. 1 1
      app/src/androidTest/java/com/owncloud/android/ui/fragment/FileDetailFragmentStaticServerIT.kt
  27. 2 2
      app/src/androidTest/java/com/owncloud/android/ui/fragment/FileDetailSharingFragmentIT.kt
  28. 1 1
      app/src/androidTest/java/com/owncloud/android/ui/fragment/GalleryFragmentIT.kt
  29. 2 2
      app/src/androidTest/java/com/owncloud/android/ui/fragment/OCFileListFragmentStaticServerIT.kt
  30. 1 1
      app/src/androidTest/java/com/owncloud/android/ui/fragment/UnifiedSearchFragmentIT.kt
  31. 1 1
      app/src/androidTest/java/com/owncloud/android/ui/helpers/UriUploaderIT.kt
  32. 1 1
      app/src/androidTest/java/com/owncloud/android/ui/preview/PreviewImageFragmentIT.kt
  33. 1 1
      app/src/androidTest/java/com/owncloud/android/ui/preview/pdf/PreviewPdfFragmentScreenshotIT.kt
  34. 1 1
      app/src/androidTest/java/com/owncloud/android/util/EncryptionTestIT.java
  35. 4 2
      app/src/debug/AndroidManifest.xml
  36. 10 8
      app/src/debug/java/com/nextcloud/client/di/BuildTypeComponentsModule.kt
  37. 46 0
      app/src/debug/java/com/nextcloud/test/InjectionTestActivity.kt
  38. 1 1
      app/src/debug/java/com/nextcloud/test/TestActivity.kt
  39. 42 0
      app/src/debug/res/layout/activity_injection_test.xml

+ 1 - 3
app/src/androidTest/java/com/nextcloud/client/AuthenticatorActivityIT.java

@@ -20,9 +20,9 @@
 
 package com.nextcloud.client;
 
-import android.Manifest;
 import android.widget.TextView;
 
+import com.nextcloud.test.GrantStoragePermissionRule;
 import com.owncloud.android.AbstractIT;
 import com.owncloud.android.R;
 import com.owncloud.android.authentication.AuthenticatorActivity;
@@ -34,8 +34,6 @@ import org.junit.rules.TestRule;
 
 import androidx.test.espresso.intent.rule.IntentsTestRule;
 
-import static androidx.test.espresso.Espresso.onView;
-import static androidx.test.espresso.action.ViewActions.typeText;
 import static androidx.test.espresso.matcher.ViewMatchers.withId;
 
 

+ 1 - 0
app/src/androidTest/java/com/nextcloud/client/CommunityActivityIT.java

@@ -24,6 +24,7 @@ package com.nextcloud.client;
 
 import android.app.Activity;
 
+import com.nextcloud.test.GrantStoragePermissionRule;
 import com.owncloud.android.AbstractIT;
 import com.owncloud.android.ui.activity.CommunityActivity;
 import com.owncloud.android.utils.ScreenshotTest;

+ 1 - 0
app/src/androidTest/java/com/nextcloud/client/EndToEndRandomIT.java

@@ -25,6 +25,7 @@ package com.nextcloud.client;
 import android.accounts.AccountManager;
 
 import com.nextcloud.test.RandomStringGenerator;
+import com.nextcloud.test.RetryTestRule;
 import com.owncloud.android.AbstractOnServerIT;
 import com.owncloud.android.datamodel.ArbitraryDataProvider;
 import com.owncloud.android.datamodel.ArbitraryDataProviderImpl;

+ 1 - 0
app/src/androidTest/java/com/nextcloud/client/FileDisplayActivityIT.kt

@@ -29,6 +29,7 @@ import androidx.test.espresso.contrib.NavigationViewActions
 import androidx.test.espresso.intent.rule.IntentsTestRule
 import androidx.test.espresso.matcher.ViewMatchers
 import androidx.test.platform.app.InstrumentationRegistry
+import com.nextcloud.test.RetryTestRule
 import com.owncloud.android.AbstractOnServerIT
 import com.owncloud.android.R
 import com.owncloud.android.lib.resources.files.CreateFolderRemoteOperation

+ 0 - 51
app/src/androidTest/java/com/nextcloud/client/ScreenshotTestRunner.java

@@ -1,51 +0,0 @@
-/*
- *
- * Nextcloud Android client application
- *
- * @author Tobias Kaminsky
- * Copyright (C) 2019 Tobias Kaminsky
- * Copyright (C) 2019 Nextcloud GmbH
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see <https://www.gnu.org/licenses/>.
- */
-
-package com.nextcloud.client;
-
-import android.app.Application;
-import android.content.Context;
-import android.os.Build;
-import android.os.Bundle;
-
-import com.facebook.testing.screenshot.ScreenshotRunner;
-import com.github.tmurakami.dexopener.DexOpener;
-
-import com.karumi.shot.ShotTestRunner;
-
-public class ScreenshotTestRunner extends ShotTestRunner {
-
-    @Override
-    public Application newApplication(ClassLoader cl, String className, Context context)
-        throws ClassNotFoundException, IllegalAccessException, InstantiationException {
-
-        /*
-         * Initialize DexOpener only on API below 28 to enable mocking of Kotlin classes.
-         * On API 28+ the platform supports mocking natively.
-         */
-        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.P) {
-            DexOpener.install(this);
-        }
-
-        return super.newApplication(cl, className, context);
-    }
-}

+ 46 - 0
app/src/androidTest/java/com/nextcloud/client/ScreenshotTestRunner.kt

@@ -0,0 +1,46 @@
+/*
+ * Nextcloud Android client application
+ *
+ *  @author Tobias Kaminsky
+ *  @author Álvaro Brey
+ *  Copyright (C) 2019 Tobias Kaminsky
+ *  Copyright (C) 2023 Álvaro Brey
+ *  Copyright (C) 2023 Nextcloud GmbH
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU AFFERO GENERAL PUBLIC LICENSE for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public
+ * License along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+package com.nextcloud.client
+
+import android.app.Application
+import android.app.Instrumentation
+import android.content.Context
+import android.os.Build
+import com.github.tmurakami.dexopener.DexOpener
+import com.karumi.shot.ShotTestRunner
+import com.nextcloud.test.TestMainApp
+
+class ScreenshotTestRunner : ShotTestRunner() {
+    @Throws(ClassNotFoundException::class, IllegalAccessException::class, InstantiationException::class)
+    override fun newApplication(cl: ClassLoader, className: String, context: Context): Application {
+        /*
+         * Initialize DexOpener only on API below 28 to enable mocking of Kotlin classes.
+         * On API 28+ the platform supports mocking natively.
+         */
+        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.P) {
+            DexOpener.install(this)
+        }
+        return Instrumentation.newApplication(TestMainApp::class.java, context)
+    }
+}

+ 1 - 0
app/src/androidTest/java/com/nextcloud/client/SettingsActivityIT.kt

@@ -25,6 +25,7 @@ import android.app.Activity
 import android.content.Intent
 import android.os.Looper
 import androidx.test.espresso.intent.rule.IntentsTestRule
+import com.nextcloud.test.GrantStoragePermissionRule
 import com.owncloud.android.AbstractIT
 import com.owncloud.android.datamodel.ArbitraryDataProviderImpl
 import com.owncloud.android.ui.activity.RequestCredentialsActivity

+ 1 - 1
app/src/androidTest/java/com/nextcloud/client/GrantStoragePermissionRule.kt → app/src/androidTest/java/com/nextcloud/test/GrantStoragePermissionRule.kt

@@ -19,7 +19,7 @@
  * along with this program. If not, see <https://www.gnu.org/licenses/>.
  */
 
-package com.nextcloud.client
+package com.nextcloud.test
 
 import android.Manifest
 import android.os.Build

+ 44 - 0
app/src/androidTest/java/com/nextcloud/test/InjectionOverrideRule.kt

@@ -0,0 +1,44 @@
+/*
+ * Nextcloud Android client application
+ *
+ *  @author Álvaro Brey
+ *  Copyright (C) 2023 Álvaro Brey
+ *  Copyright (C) 2023 Nextcloud GmbH
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU AFFERO GENERAL PUBLIC LICENSE for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public
+ * License along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+package com.nextcloud.test
+
+import android.app.Instrumentation
+import androidx.test.platform.app.InstrumentationRegistry
+import dagger.android.AndroidInjector
+import org.junit.rules.TestRule
+import org.junit.runner.Description
+import org.junit.runners.model.Statement
+
+class InjectionOverrideRule(private val overrideInjectors: Map<Class<*>, AndroidInjector<*>>) : TestRule {
+    override fun apply(base: Statement, description: Description): Statement = object : Statement() {
+        override fun evaluate() {
+            val instrumentation: Instrumentation = InstrumentationRegistry.getInstrumentation()
+            val testApp = instrumentation.targetContext.applicationContext as TestMainApp
+            overrideInjectors.entries.forEach {
+                testApp.addTestInjector(it.key, it.value)
+            }
+            base.evaluate()
+            testApp.clearTestInjectors()
+        }
+    }
+}

+ 62 - 0
app/src/androidTest/java/com/nextcloud/test/InjectionTestActivityTest.kt

@@ -0,0 +1,62 @@
+/*
+ * Nextcloud Android client application
+ *
+ *  @author Álvaro Brey
+ *  Copyright (C) 2023 Álvaro Brey
+ *  Copyright (C) 2023 Nextcloud GmbH
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU AFFERO GENERAL PUBLIC LICENSE for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public
+ * License along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+package com.nextcloud.test
+
+import androidx.test.core.app.launchActivity
+import androidx.test.espresso.Espresso.onView
+import androidx.test.espresso.assertion.ViewAssertions.matches
+import androidx.test.espresso.matcher.ViewMatchers.withId
+import androidx.test.espresso.matcher.ViewMatchers.withText
+import com.nextcloud.client.preferences.AppPreferences
+import com.owncloud.android.R
+import dagger.android.AndroidInjector
+import io.mockk.every
+import io.mockk.mockk
+import org.junit.Rule
+import org.junit.Test
+
+class InjectionTestActivityTest {
+
+    @get:Rule
+    val injectionOverrideRule =
+        InjectionOverrideRule(
+            mapOf(
+                InjectionTestActivity::class.java to AndroidInjector<InjectionTestActivity> { activity ->
+                    val appPreferencesMock = mockk<AppPreferences>()
+                    every { appPreferencesMock.lastUploadPath } returns INJECTED_STRING
+                    activity.appPreferences = appPreferencesMock
+                }
+            )
+        )
+
+    @Test
+    fun testInjectionOverride() {
+        launchActivity<InjectionTestActivity>().use { _ ->
+            onView(withId(R.id.text)).check(matches(withText(INJECTED_STRING)))
+        }
+    }
+
+    companion object {
+        private const val INJECTED_STRING = "injected string"
+    }
+}

+ 1 - 1
app/src/androidTest/java/com/nextcloud/client/RetryTestRule.kt → app/src/androidTest/java/com/nextcloud/test/RetryTestRule.kt

@@ -20,7 +20,7 @@
  * along with this program. If not, see <https://www.gnu.org/licenses/>.
  */
 
-package com.nextcloud.client
+package com.nextcloud.test
 
 import com.owncloud.android.BuildConfig
 import com.owncloud.android.lib.common.utils.Log_OC

+ 74 - 0
app/src/androidTest/java/com/nextcloud/test/TestMainApp.kt

@@ -0,0 +1,74 @@
+/*
+ * Nextcloud Android client application
+ *
+ *  @author Álvaro Brey
+ *  Copyright (C) 2023 Álvaro Brey
+ *  Copyright (C) 2023 Nextcloud GmbH
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU AFFERO GENERAL PUBLIC LICENSE for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public
+ * License along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+package com.nextcloud.test
+
+import com.owncloud.android.MainApp
+import com.owncloud.android.lib.common.utils.Log_OC
+import dagger.android.AndroidInjector
+import dagger.android.DispatchingAndroidInjector
+
+/**
+ * The purpose of this class is to allow overriding injections in Android classes (which use parameter injection instead
+ * of constructor injection).
+ *
+ * To automate its usage, pair with [InjectionOverrideRule]; or call [addTestInjector] manually for more control.
+ */
+class TestMainApp : MainApp() {
+
+    val foo = "BAR"
+    private var overrideInjectors: MutableMap<Class<*>, AndroidInjector<*>> = mutableMapOf()
+
+    /**
+     * If you call this before a test please remember to call [clearTestInjectors] afterwards
+     */
+    fun addTestInjector(clazz: Class<*>, injector: AndroidInjector<*>) {
+        Log_OC.d(TAG, "addTestInjector: added injector for $clazz")
+        overrideInjectors[clazz] = injector
+    }
+
+    fun clearTestInjectors() {
+        overrideInjectors.clear()
+    }
+
+    override fun androidInjector(): AndroidInjector<Any> {
+        @Suppress("UNCHECKED_CAST")
+        return InjectorWrapper(dispatchingAndroidInjector, overrideInjectors as Map<Class<*>, AndroidInjector<Any>>)
+    }
+
+    class InjectorWrapper(
+        private val baseInjector: DispatchingAndroidInjector<Any>,
+        private val overrideInjectors: Map<Class<*>, AndroidInjector<Any>>
+    ) : AndroidInjector<Any> {
+        override fun inject(instance: Any) {
+            baseInjector.inject(instance)
+            overrideInjectors[instance.javaClass]?.let { customInjector ->
+                Log_OC.d(TAG, "Injecting ${instance.javaClass} with ${customInjector.javaClass}")
+                customInjector.inject(instance)
+            }
+        }
+    }
+
+    companion object {
+        private const val TAG = "TestMainApp"
+    }
+}

+ 1 - 1
app/src/androidTest/java/com/nextcloud/ui/BitmapIT.kt

@@ -26,7 +26,7 @@ import android.graphics.BitmapFactory
 import android.widget.ImageView
 import android.widget.LinearLayout
 import androidx.test.espresso.intent.rule.IntentsTestRule
-import com.nextcloud.client.TestActivity
+import com.nextcloud.test.TestActivity
 import com.owncloud.android.AbstractIT
 import com.owncloud.android.R
 import com.owncloud.android.utils.BitmapUtils

+ 1 - 1
app/src/androidTest/java/com/owncloud/android/AbstractIT.java

@@ -14,7 +14,7 @@ import android.view.View;
 
 import com.facebook.testing.screenshot.Screenshot;
 import com.facebook.testing.screenshot.internal.TestNameDetector;
-import com.nextcloud.client.GrantStoragePermissionRule;
+import com.nextcloud.test.GrantStoragePermissionRule;
 import com.nextcloud.client.account.User;
 import com.nextcloud.client.account.UserAccountManager;
 import com.nextcloud.client.account.UserAccountManagerImpl;

+ 1 - 1
app/src/androidTest/java/com/owncloud/android/authentication/PassCodeManagerIT.kt

@@ -23,9 +23,9 @@
 package com.owncloud.android.authentication
 
 import androidx.test.core.app.launchActivity
-import com.nextcloud.client.TestActivity
 import com.nextcloud.client.core.Clock
 import com.nextcloud.client.preferences.AppPreferences
+import com.nextcloud.test.TestActivity
 import com.owncloud.android.ui.activity.SettingsActivity
 import io.mockk.MockKAnnotations
 import io.mockk.every

+ 1 - 1
app/src/androidTest/java/com/owncloud/android/files/FileMenuFilterIT.kt

@@ -22,8 +22,8 @@ package com.owncloud.android.files
 
 import androidx.test.core.app.launchActivity
 import androidx.test.ext.junit.runners.AndroidJUnit4
-import com.nextcloud.client.TestActivity
 import com.nextcloud.client.account.User
+import com.nextcloud.test.TestActivity
 import com.nextcloud.utils.EditorUtils
 import com.owncloud.android.AbstractIT
 import com.owncloud.android.R

+ 1 - 1
app/src/androidTest/java/com/owncloud/android/providers/UsersAndGroupsSearchProviderIT.kt

@@ -22,7 +22,7 @@
 package com.owncloud.android.providers
 
 import androidx.test.espresso.intent.rule.IntentsTestRule
-import com.nextcloud.client.TestActivity
+import com.nextcloud.test.TestActivity
 import com.owncloud.android.AbstractOnServerIT
 import org.junit.Rule
 import org.junit.Test

+ 2 - 2
app/src/androidTest/java/com/owncloud/android/ui/LoginIT.kt

@@ -29,10 +29,10 @@ import androidx.test.espresso.web.webdriver.DriverAtoms
 import androidx.test.espresso.web.webdriver.Locator
 import androidx.test.filters.LargeTest
 import androidx.test.platform.app.InstrumentationRegistry
-import com.nextcloud.client.GrantStoragePermissionRule
-import com.nextcloud.client.RetryTestRule
 import com.nextcloud.client.account.UserAccountManager
 import com.nextcloud.client.account.UserAccountManagerImpl
+import com.nextcloud.test.GrantStoragePermissionRule
+import com.nextcloud.test.RetryTestRule
 import com.owncloud.android.AbstractIT
 import com.owncloud.android.R
 import com.owncloud.android.authentication.AuthenticatorActivity

+ 1 - 1
app/src/androidTest/java/com/owncloud/android/ui/activity/DrawerActivityIT.java

@@ -27,7 +27,7 @@ import android.accounts.AccountManager;
 import android.net.Uri;
 import android.os.Bundle;
 
-import com.nextcloud.client.RetryTestRule;
+import com.nextcloud.test.RetryTestRule;
 import com.nextcloud.client.account.User;
 import com.nextcloud.client.account.UserAccountManager;
 import com.nextcloud.client.account.UserAccountManagerImpl;

+ 0 - 2
app/src/androidTest/java/com/owncloud/android/ui/activity/FileDisplayActivityTest.java

@@ -2,12 +2,10 @@ package com.owncloud.android.ui.activity;
 
 import android.app.Activity;
 
-import com.nextcloud.client.GrantStoragePermissionRule;
 import com.nextcloud.client.onboarding.WhatsNewActivity;
 import com.owncloud.android.AbstractIT;
 
 import org.junit.Test;
-import org.junit.rules.TestRule;
 
 import androidx.test.core.app.ActivityScenario;
 import androidx.test.platform.app.InstrumentationRegistry;

+ 1 - 1
app/src/androidTest/java/com/owncloud/android/ui/activity/UploadFilesActivityIT.kt

@@ -23,7 +23,7 @@ package com.owncloud.android.ui.activity
 
 import android.content.Intent
 import androidx.test.espresso.intent.rule.IntentsTestRule
-import com.nextcloud.client.GrantStoragePermissionRule
+import com.nextcloud.test.GrantStoragePermissionRule
 import com.owncloud.android.AbstractIT
 import com.owncloud.android.utils.FileStorageUtils
 import com.owncloud.android.utils.ScreenshotTest

+ 1 - 1
app/src/androidTest/java/com/owncloud/android/ui/dialog/SendFilesDialogTest.kt

@@ -25,7 +25,7 @@ import androidx.fragment.app.FragmentManager
 import androidx.recyclerview.widget.RecyclerView
 import androidx.test.espresso.intent.rule.IntentsTestRule
 import androidx.test.platform.app.InstrumentationRegistry
-import com.nextcloud.client.TestActivity
+import com.nextcloud.test.TestActivity
 import com.owncloud.android.AbstractIT
 import com.owncloud.android.R
 import com.owncloud.android.datamodel.OCFile

+ 1 - 1
app/src/androidTest/java/com/owncloud/android/ui/dialog/SendShareDialogTest.kt

@@ -24,7 +24,7 @@ package com.owncloud.android.ui.dialog
 import androidx.fragment.app.FragmentManager
 import androidx.test.espresso.intent.rule.IntentsTestRule
 import androidx.test.platform.app.InstrumentationRegistry
-import com.nextcloud.client.TestActivity
+import com.nextcloud.test.TestActivity
 import com.owncloud.android.AbstractIT
 import com.owncloud.android.datamodel.OCFile
 import com.owncloud.android.lib.resources.status.OCCapability

+ 1 - 1
app/src/androidTest/java/com/owncloud/android/ui/dialog/SetupEncryptionDialogFragmentIT.kt

@@ -23,7 +23,7 @@ package com.owncloud.android.ui.dialog
 
 import androidx.test.espresso.intent.rule.IntentsTestRule
 import androidx.test.internal.runner.junit4.statement.UiThreadStatement.runOnUiThread
-import com.nextcloud.client.TestActivity
+import com.nextcloud.test.TestActivity
 import com.owncloud.android.AbstractIT
 import com.owncloud.android.utils.ScreenshotTest
 import org.junit.Rule

+ 1 - 1
app/src/androidTest/java/com/owncloud/android/ui/fragment/AvatarIT.kt

@@ -24,7 +24,7 @@ package com.owncloud.android.ui.fragment
 import android.graphics.BitmapFactory
 import androidx.test.espresso.intent.rule.IntentsTestRule
 import androidx.test.internal.runner.junit4.statement.UiThreadStatement.runOnUiThread
-import com.nextcloud.client.TestActivity
+import com.nextcloud.test.TestActivity
 import com.owncloud.android.AbstractIT
 import com.owncloud.android.R
 import com.owncloud.android.lib.resources.users.StatusType

+ 1 - 1
app/src/androidTest/java/com/owncloud/android/ui/fragment/FileDetailFragmentStaticServerIT.kt

@@ -23,7 +23,7 @@
 package com.owncloud.android.ui.fragment
 
 import androidx.test.espresso.intent.rule.IntentsTestRule
-import com.nextcloud.client.TestActivity
+import com.nextcloud.test.TestActivity
 import com.owncloud.android.AbstractIT
 import com.owncloud.android.R
 import com.owncloud.android.datamodel.OCFile

+ 2 - 2
app/src/androidTest/java/com/owncloud/android/ui/fragment/FileDetailSharingFragmentIT.kt

@@ -37,8 +37,8 @@ import androidx.test.espresso.matcher.ViewMatchers.withText
 import com.google.android.apps.common.testing.accessibility.framework.AccessibilityCheckResultBaseUtils.matchesCheckNames
 import com.google.android.apps.common.testing.accessibility.framework.AccessibilityCheckResultUtils.matchesViews
 import com.google.android.material.floatingactionbutton.FloatingActionButton
-import com.nextcloud.client.RetryTestRule
-import com.nextcloud.client.TestActivity
+import com.nextcloud.test.RetryTestRule
+import com.nextcloud.test.TestActivity
 import com.owncloud.android.AbstractIT
 import com.owncloud.android.R
 import com.owncloud.android.datamodel.OCFile

+ 1 - 1
app/src/androidTest/java/com/owncloud/android/ui/fragment/GalleryFragmentIT.kt

@@ -27,7 +27,7 @@ import android.graphics.Canvas
 import android.graphics.Color
 import android.graphics.Paint
 import androidx.test.espresso.intent.rule.IntentsTestRule
-import com.nextcloud.client.TestActivity
+import com.nextcloud.test.TestActivity
 import com.owncloud.android.AbstractIT
 import com.owncloud.android.datamodel.ImageDimension
 import com.owncloud.android.datamodel.OCFile

+ 2 - 2
app/src/androidTest/java/com/owncloud/android/ui/fragment/OCFileListFragmentStaticServerIT.kt

@@ -23,8 +23,8 @@
 package com.owncloud.android.ui.fragment
 
 import androidx.test.espresso.intent.rule.IntentsTestRule
-import com.nextcloud.client.GrantStoragePermissionRule
-import com.nextcloud.client.TestActivity
+import com.nextcloud.test.GrantStoragePermissionRule
+import com.nextcloud.test.TestActivity
 import com.owncloud.android.AbstractIT
 import com.owncloud.android.datamodel.OCFile
 import com.owncloud.android.lib.resources.shares.ShareType

+ 1 - 1
app/src/androidTest/java/com/owncloud/android/ui/fragment/UnifiedSearchFragmentIT.kt

@@ -22,7 +22,7 @@ package com.owncloud.android.ui.fragment
 
 import androidx.test.espresso.intent.rule.IntentsTestRule
 import androidx.test.internal.runner.junit4.statement.UiThreadStatement
-import com.nextcloud.client.TestActivity
+import com.nextcloud.test.TestActivity
 import com.owncloud.android.AbstractIT
 import com.owncloud.android.datamodel.OCFile
 import com.owncloud.android.lib.common.SearchResultEntry

+ 1 - 1
app/src/androidTest/java/com/owncloud/android/ui/helpers/UriUploaderIT.kt

@@ -2,7 +2,7 @@ package com.owncloud.android.ui.helpers
 
 import android.net.Uri
 import androidx.test.core.app.launchActivity
-import com.nextcloud.client.TestActivity
+import com.nextcloud.test.TestActivity
 import com.owncloud.android.AbstractIT
 import com.owncloud.android.files.services.FileUploader
 import org.junit.Assert

+ 1 - 1
app/src/androidTest/java/com/owncloud/android/ui/preview/PreviewImageFragmentIT.kt

@@ -22,7 +22,7 @@
 package com.owncloud.android.ui.preview
 
 import androidx.test.espresso.intent.rule.IntentsTestRule
-import com.nextcloud.client.TestActivity
+import com.nextcloud.test.TestActivity
 import com.owncloud.android.AbstractIT
 import org.junit.Rule
 

+ 1 - 1
app/src/androidTest/java/com/owncloud/android/ui/preview/pdf/PreviewPdfFragmentScreenshotIT.kt

@@ -23,7 +23,7 @@ package com.owncloud.android.ui.preview.pdf
 
 import androidx.lifecycle.Lifecycle
 import androidx.test.espresso.intent.rule.IntentsTestRule
-import com.nextcloud.client.TestActivity
+import com.nextcloud.test.TestActivity
 import com.owncloud.android.AbstractIT
 import com.owncloud.android.datamodel.OCFile
 import com.owncloud.android.utils.ScreenshotTest

+ 1 - 1
app/src/androidTest/java/com/owncloud/android/util/EncryptionTestIT.java

@@ -26,7 +26,7 @@ import android.text.TextUtils;
 import com.google.gson.JsonElement;
 import com.google.gson.JsonParser;
 import com.google.gson.reflect.TypeToken;
-import com.nextcloud.client.RetryTestRule;
+import com.nextcloud.test.RetryTestRule;
 import com.nextcloud.test.RandomStringGenerator;
 import com.owncloud.android.datamodel.DecryptedFolderMetadata;
 import com.owncloud.android.datamodel.EncryptedFolderMetadata;

+ 4 - 2
app/src/debug/AndroidManifest.xml

@@ -11,7 +11,9 @@
     <application
         android:testOnly="false"
         tools:ignore="GoogleAppIndexingWarning">
-
-        <activity android:name="com.nextcloud.client.TestActivity" />
+        <activity
+            android:name="com.nextcloud.test.InjectionTestActivity"
+            android:exported="false" />
+        <activity android:name="com.nextcloud.test.TestActivity" />
     </application>
 </manifest>

+ 10 - 8
app/src/debug/java/com/nextcloud/client/di/BuildTypeComponentsModule.java → app/src/debug/java/com/nextcloud/client/di/BuildTypeComponentsModule.kt

@@ -19,19 +19,21 @@
  * You should have received a copy of the GNU Affero General Public License
  * along with this program. If not, see <https://www.gnu.org/licenses/>.
  */
+package com.nextcloud.client.di
 
-package com.nextcloud.client.di;
-
-import com.nextcloud.client.TestActivity;
-
-import dagger.Module;
-import dagger.android.ContributesAndroidInjector;
+import com.nextcloud.test.InjectionTestActivity
+import com.nextcloud.test.TestActivity
+import dagger.Module
+import dagger.android.ContributesAndroidInjector
 
 /**
  * Register classes that require dependency injection. This class is used by Dagger compiler only.
  */
 @Module
-abstract class BuildTypeComponentsModule {
+interface BuildTypeComponentsModule {
+    @ContributesAndroidInjector
+    fun testActivity(): TestActivity?
+
     @ContributesAndroidInjector
-    abstract TestActivity testActivity();
+    fun injectionTestActivity(): InjectionTestActivity?
 }

+ 46 - 0
app/src/debug/java/com/nextcloud/test/InjectionTestActivity.kt

@@ -0,0 +1,46 @@
+/*
+ * Nextcloud Android client application
+ *
+ *  @author Álvaro Brey
+ *  Copyright (C) 2023 Álvaro Brey
+ *  Copyright (C) 2023 Nextcloud GmbH
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU AFFERO GENERAL PUBLIC LICENSE for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public
+ * License along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+package com.nextcloud.test
+
+import android.os.Bundle
+import androidx.appcompat.app.AppCompatActivity
+import com.nextcloud.client.di.Injectable
+import com.nextcloud.client.preferences.AppPreferences
+import com.owncloud.android.databinding.ActivityInjectionTestBinding
+import javax.inject.Inject
+
+/**
+ * Sample activity to check test overriding injections
+ */
+class InjectionTestActivity : AppCompatActivity(), Injectable {
+    @Inject
+    lateinit var appPreferences: AppPreferences
+
+    override fun onCreate(savedInstanceState: Bundle?) {
+        super.onCreate(savedInstanceState)
+        val binding = ActivityInjectionTestBinding.inflate(layoutInflater)
+        // random pref, just needs to match the one in the test
+        binding.text.text = appPreferences.lastUploadPath
+        setContentView(binding.root)
+    }
+}

+ 1 - 1
app/src/debug/java/com/nextcloud/client/TestActivity.kt → app/src/debug/java/com/nextcloud/test/TestActivity.kt

@@ -19,7 +19,7 @@
  * along with this program. If not, see <https://www.gnu.org/licenses/>.
  */
 
-package com.nextcloud.client
+package com.nextcloud.test
 
 import android.os.Bundle
 import android.view.View

+ 42 - 0
app/src/debug/res/layout/activity_injection_test.xml

@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="utf-8"?><!--
+  ~ Nextcloud Android client application
+  ~
+  ~  @author Álvaro Brey
+  ~  Copyright (C) 2023 Álvaro Brey
+  ~  Copyright (C) 2023 Nextcloud GmbH
+  ~
+  ~ This program is free software; you can redistribute it and/or
+  ~ modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
+  ~ License as published by the Free Software Foundation; either
+  ~ version 3 of the License, or any later version.
+  ~
+  ~ This program is distributed in the hope that it will be useful,
+  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of
+  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+  ~ GNU AFFERO GENERAL PUBLIC LICENSE for more details.
+  ~
+  ~ You should have received a copy of the GNU Affero General Public
+  ~ License along with this program.  If not, see <http://www.gnu.org/licenses/>.
+  ~
+  -->
+
+<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    tools:context="com.nextcloud.test.InjectionTestActivity">
+
+    <TextView
+        android:id="@+id/text"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:text="Default text"
+        android:textSize="50sp"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toTopOf="parent"
+        tools:ignore="HardcodedText" />
+
+</androidx.constraintlayout.widget.ConstraintLayout>