From 718a493a8a725bc5a65e1e53e8326df9fca5e5d0 Mon Sep 17 00:00:00 2001 From: Kyrillos Gaitanis Date: Fri, 29 Sep 2023 13:33:51 +0300 Subject: [PATCH 01/11] Set `source/targetCompatibility` & `jvmTarget` to Java 11 --- library/build.gradle.kts | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/library/build.gradle.kts b/library/build.gradle.kts index 989e4bc..96d6170 100644 --- a/library/build.gradle.kts +++ b/library/build.gradle.kts @@ -11,6 +11,15 @@ group = "com.github.vinted" android { compileSdk = Versions.COMPILE_SDK_VERSION + compileOptions { + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 + } + + kotlinOptions { + jvmTarget = "11" + } + defaultConfig { minSdk = Versions.MIN_SDK_VERSION } From 03e0a3fa25da1eb996248806031a15a3ad2aadcb Mon Sep 17 00:00:00 2001 From: Kyrillos Gaitanis Date: Fri, 29 Sep 2023 13:48:29 +0300 Subject: [PATCH 02/11] Upgrade `Robolectric` 4.3 -> 4.10.3 --- buildSrc/src/main/kotlin/Dependencies.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/buildSrc/src/main/kotlin/Dependencies.kt b/buildSrc/src/main/kotlin/Dependencies.kt index a8474a9..4b90be1 100644 --- a/buildSrc/src/main/kotlin/Dependencies.kt +++ b/buildSrc/src/main/kotlin/Dependencies.kt @@ -4,7 +4,7 @@ object Versions { const val COROUTINES = "1.7.3" const val ANDROID_GRADLE_PLUGIN = "7.4.2" const val JUNIT = "4.13.2" - const val ROBOLECTRIC = "4.3" + const val ROBOLECTRIC = "4.10.3" const val MOCKITO = "4.11.0" const val MOCKITO_KOTLIN = "4.1.0" const val CORE_KTX = "1.6.0" From 2de872794d32567009e3e2d315a637da5caf1a6b Mon Sep 17 00:00:00 2001 From: Kyrillos Gaitanis Date: Fri, 29 Sep 2023 13:52:33 +0300 Subject: [PATCH 03/11] Fix IllegalArgumentException when stubbing --- library/src/test/java/com/vinted/coper/CoperImplTest.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/library/src/test/java/com/vinted/coper/CoperImplTest.kt b/library/src/test/java/com/vinted/coper/CoperImplTest.kt index 660eb1f..7bc3060 100644 --- a/library/src/test/java/com/vinted/coper/CoperImplTest.kt +++ b/library/src/test/java/com/vinted/coper/CoperImplTest.kt @@ -813,8 +813,8 @@ class CoperImplTest { ) { whenever( coperFragment.requestPermissions( - eq(permissions.toTypedArray()), - anyOrNull() + permissions.toTypedArray(), + requestCode, ) ).then { coperFragment.onRequestPermissionResult( From 40590ad9e73dd58a29f18bb390094f8f9f3bce86 Mon Sep 17 00:00:00 2001 From: Kyrillos Gaitanis Date: Fri, 29 Sep 2023 13:54:44 +0300 Subject: [PATCH 04/11] Fix test case that requests permissions with empty list Removed unnecessary stubbing of requestPermissions method. --- library/src/test/java/com/vinted/coper/CoperImplTest.kt | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/library/src/test/java/com/vinted/coper/CoperImplTest.kt b/library/src/test/java/com/vinted/coper/CoperImplTest.kt index 7bc3060..3b86a8f 100644 --- a/library/src/test/java/com/vinted/coper/CoperImplTest.kt +++ b/library/src/test/java/com/vinted/coper/CoperImplTest.kt @@ -430,11 +430,7 @@ class CoperImplTest { val crashPermission = "crash" mockCheckPermissions(crashPermission, PackageManager.PERMISSION_DENIED) - - executePermissionRequest( - permissionsToRequest = emptyList(), - permissionResult = listOf(PermissionChecker.PERMISSION_GRANTED) - ) + fixture.request(*emptyList().toTypedArray()) } @Test(expected = IllegalStateException::class) From e2ca07c0a32a1550ca2723556ea7c80dfc593a01 Mon Sep 17 00:00:00 2001 From: Kyrillos Gaitanis Date: Fri, 29 Sep 2023 13:56:01 +0300 Subject: [PATCH 05/11] Remove unnecessary stubbing in test --- .../src/test/java/com/vinted/coper/CoperImplTest.kt | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/library/src/test/java/com/vinted/coper/CoperImplTest.kt b/library/src/test/java/com/vinted/coper/CoperImplTest.kt index 3b86a8f..4f240a4 100644 --- a/library/src/test/java/com/vinted/coper/CoperImplTest.kt +++ b/library/src/test/java/com/vinted/coper/CoperImplTest.kt @@ -514,19 +514,6 @@ class CoperImplTest { fun request_permissionResultCameWithDifferentPermissions_jobIsNotCompleted() = runTest { val permission = "permission" mockCheckPermissions(permission, PackageManager.PERMISSION_DENIED) - val fragment = fixture.getFragmentSafely() - whenever( - fragment.requestPermissions( - eq(listOf(permission).toTypedArray()), - anyOrNull() - ) - ).then { - fragment.onRequestPermissionResult( - permissions = listOf("test"), - permissionsResult = listOf(PermissionChecker.PERMISSION_GRANTED), - requestCode = CoperFragment.REQUEST_CODE - ) - } val responseAsync = async { fixture.request(permission) From 18fc4dd7a01a8f400e6102ad656c0a20e402b9a1 Mon Sep 17 00:00:00 2001 From: Kyrillos Gaitanis Date: Fri, 29 Sep 2023 13:56:59 +0300 Subject: [PATCH 06/11] Don't stub method twice with same parameters from different coroutines --- .../test/java/com/vinted/coper/CoperImplTest.kt | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/library/src/test/java/com/vinted/coper/CoperImplTest.kt b/library/src/test/java/com/vinted/coper/CoperImplTest.kt index 4f240a4..a338942 100644 --- a/library/src/test/java/com/vinted/coper/CoperImplTest.kt +++ b/library/src/test/java/com/vinted/coper/CoperImplTest.kt @@ -543,17 +543,18 @@ class CoperImplTest { fun request_twoIdenticalRequest_twoRequestCompleted() = runTest { val permission = "sameRequest" mockCheckPermissions(permission, PermissionChecker.PERMISSION_DENIED) + + stubRequestPermission( + coperFragment = fixture.getFragmentSafely(), + permissions = listOf(permission), + permissionResults = listOf(PermissionChecker.PERMISSION_GRANTED), + ) + val responseAsync1 = async { - executePermissionRequest( - permissionsToRequest = listOf(permission), - permissionResult = listOf(PermissionChecker.PERMISSION_GRANTED) - ) + fixture.request(*listOf(permission).toTypedArray()) } val responseAsync2 = async { - executePermissionRequest( - permissionsToRequest = listOf(permission), - permissionResult = listOf(PermissionChecker.PERMISSION_GRANTED) - ) + fixture.request(*listOf(permission).toTypedArray()) } val result2 = responseAsync2.await() val result1 = responseAsync1.await() From 3018f14e9a09d57f6cf3e55ecd2cb3e48cd3b74b Mon Sep 17 00:00:00 2001 From: Kyrillos Gaitanis Date: Fri, 29 Sep 2023 13:58:05 +0300 Subject: [PATCH 07/11] Fix stub syntax --- library/src/test/java/com/vinted/coper/CoperImplTest.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/library/src/test/java/com/vinted/coper/CoperImplTest.kt b/library/src/test/java/com/vinted/coper/CoperImplTest.kt index a338942..d7efb7d 100644 --- a/library/src/test/java/com/vinted/coper/CoperImplTest.kt +++ b/library/src/test/java/com/vinted/coper/CoperImplTest.kt @@ -599,8 +599,8 @@ class CoperImplTest { val coperFragment = fixture.getFragmentSafely() whenever( coperFragment.requestPermissions( - eq(arrayOf(firstPermission, secondPermission)), - anyOrNull() + arrayOf(firstPermission, secondPermission), + CoperFragment.REQUEST_CODE ) ).then { coperFragment.onRequestPermissionResult( From dd7e4c557694cd7a48dfaae35b086666384e96f7 Mon Sep 17 00:00:00 2001 From: Kyrillos Gaitanis Date: Fri, 29 Sep 2023 14:01:21 +0300 Subject: [PATCH 08/11] Adjust test stubs to match previous behavior Previously `anyOrNull()` matcher was used, which covered stubbing the method for all ints. Now it stubs only the method for only the specified `requestCode` which results into method not stubbed when `requestPermissions` is called from `CoperFragment#requestPermissionsAsync`. --- .../java/com/vinted/coper/CoperImplTest.kt | 34 ++++++++++++++++--- 1 file changed, 29 insertions(+), 5 deletions(-) diff --git a/library/src/test/java/com/vinted/coper/CoperImplTest.kt b/library/src/test/java/com/vinted/coper/CoperImplTest.kt index d7efb7d..07678b1 100644 --- a/library/src/test/java/com/vinted/coper/CoperImplTest.kt +++ b/library/src/test/java/com/vinted/coper/CoperImplTest.kt @@ -744,11 +744,35 @@ class CoperImplTest { fun request_requestCodeIsNotOfCoperFragment_throwException() = runTest { val requestedPermission = "requested_permission" - executePermissionRequest( - permissionsToRequest = listOf(requestedPermission), - permissionResult = listOf(PermissionChecker.PERMISSION_DENIED), - requestCode = 0 - ) + val coperFragment = fixture.getFragmentSafely() + + whenever( + coperFragment.requestPermissions( + listOf(requestedPermission).toTypedArray(), + 0, + ) + ).then { + coperFragment.onRequestPermissionResult( + permissions = listOf(requestedPermission), + permissionsResult = listOf(PermissionChecker.PERMISSION_DENIED), + requestCode = 0, + ) + } + + whenever( + coperFragment.requestPermissions( + listOf(requestedPermission).toTypedArray(), + CoperFragment.REQUEST_CODE + ) + ).then { + coperFragment.onRequestPermissionResult( + permissions = listOf(requestedPermission), + permissionsResult = listOf(PermissionChecker.PERMISSION_DENIED), + requestCode = 0, + ) + } + + fixture.request(*listOf(requestedPermission).toTypedArray()) } private suspend fun executePermissionRequest( From 75fa8bbadb3accfd30426d93e30d67cddba26547 Mon Sep 17 00:00:00 2001 From: Kyrillos Gaitanis Date: Fri, 29 Sep 2023 14:06:18 +0300 Subject: [PATCH 09/11] Upgrade `Mockito` 4.11.0 -> 5.5.0 --- buildSrc/src/main/kotlin/Dependencies.kt | 5 +++-- library/src/test/java/com/vinted/coper/CoperImplTest.kt | 3 +++ 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/buildSrc/src/main/kotlin/Dependencies.kt b/buildSrc/src/main/kotlin/Dependencies.kt index 4b90be1..1c9fc52 100644 --- a/buildSrc/src/main/kotlin/Dependencies.kt +++ b/buildSrc/src/main/kotlin/Dependencies.kt @@ -5,7 +5,8 @@ object Versions { const val ANDROID_GRADLE_PLUGIN = "7.4.2" const val JUNIT = "4.13.2" const val ROBOLECTRIC = "4.10.3" - const val MOCKITO = "4.11.0" + const val MOCKITO = "5.5.0" + const val MOCKITO_INLINE = "5.2.0" const val MOCKITO_KOTLIN = "4.1.0" const val CORE_KTX = "1.6.0" const val FRAGMENT_KTX = "1.2.4" @@ -38,7 +39,7 @@ object Libs { const val CORE_KTX = "androidx.core:core-ktx:${Versions.CORE_KTX}" const val KOTLIN_TESTS = "org.jetbrains.kotlin:kotlin-test:${Versions.KOTLIN}" const val FRAGMENT_KTX = "androidx.fragment:fragment-ktx:${Versions.FRAGMENT_KTX}" - const val MOCKITO_INLINE = "org.mockito:mockito-inline:${Versions.MOCKITO}" + const val MOCKITO_INLINE = "org.mockito:mockito-inline:${Versions.MOCKITO_INLINE}" const val LIFECYCLE = "androidx.lifecycle:lifecycle-common-java8:${Versions.LIFECYCLE}" @Suppress("MaxLineLength") const val VIEW_BINDING_DELEGATE = "com.github.kirich1409:viewbindingpropertydelegate-noreflection:${Versions.VIEW_BINDING_DELEGATE}" diff --git a/library/src/test/java/com/vinted/coper/CoperImplTest.kt b/library/src/test/java/com/vinted/coper/CoperImplTest.kt index 07678b1..ad4dd18 100644 --- a/library/src/test/java/com/vinted/coper/CoperImplTest.kt +++ b/library/src/test/java/com/vinted/coper/CoperImplTest.kt @@ -16,6 +16,7 @@ import org.junit.Before import org.junit.Test import org.junit.runner.RunWith import org.mockito.Mockito.* +import org.mockito.internal.util.MockUtil import org.mockito.kotlin.anyArray import org.mockito.kotlin.anyOrNull import org.mockito.kotlin.whenever @@ -846,6 +847,8 @@ class CoperImplTest { private suspend fun CoperImpl.mockGetFragmentWithStub() { val coperFragment = getFragmentSafely() + if (MockUtil.isMock(coperFragment)) return + val spyCoperFragment = spy(coperFragment) // This is needed because spy creates new instance and stubbing needs exact reference coperFragment.requireActivity().supportFragmentManager.beginTransaction() From e4c6692e357c15d73730d0f530ae79a0b03ce2f9 Mon Sep 17 00:00:00 2001 From: Kyrillos Gaitanis Date: Fri, 29 Sep 2023 14:06:32 +0300 Subject: [PATCH 10/11] Upgrade `Mockito-kotlin` 4.1.0 -> 5.1.0 --- buildSrc/src/main/kotlin/Dependencies.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/buildSrc/src/main/kotlin/Dependencies.kt b/buildSrc/src/main/kotlin/Dependencies.kt index 1c9fc52..4018e14 100644 --- a/buildSrc/src/main/kotlin/Dependencies.kt +++ b/buildSrc/src/main/kotlin/Dependencies.kt @@ -7,7 +7,7 @@ object Versions { const val ROBOLECTRIC = "4.10.3" const val MOCKITO = "5.5.0" const val MOCKITO_INLINE = "5.2.0" - const val MOCKITO_KOTLIN = "4.1.0" + const val MOCKITO_KOTLIN = "5.1.0" const val CORE_KTX = "1.6.0" const val FRAGMENT_KTX = "1.2.4" const val DETEKT_RUNTIME = "1.23.1" From d276c9a83bc80f1b5b90385bc20cc0a9263f0718 Mon Sep 17 00:00:00 2001 From: Kyrillos Gaitanis Date: Mon, 2 Oct 2023 13:13:40 +0200 Subject: [PATCH 11/11] Revert "Set `source/targetCompatibility` & `jvmTarget` to Java 11" This reverts commit 718a493a8a725bc5a65e1e53e8326df9fca5e5d0. --- library/build.gradle.kts | 9 --------- 1 file changed, 9 deletions(-) diff --git a/library/build.gradle.kts b/library/build.gradle.kts index 96d6170..989e4bc 100644 --- a/library/build.gradle.kts +++ b/library/build.gradle.kts @@ -11,15 +11,6 @@ group = "com.github.vinted" android { compileSdk = Versions.COMPILE_SDK_VERSION - compileOptions { - sourceCompatibility = JavaVersion.VERSION_11 - targetCompatibility = JavaVersion.VERSION_11 - } - - kotlinOptions { - jvmTarget = "11" - } - defaultConfig { minSdk = Versions.MIN_SDK_VERSION }