Skip to content

Commit

Permalink
Use Shadows for permission mocking instead of mocks
Browse files Browse the repository at this point in the history
  • Loading branch information
ArnasSmicius committed Sep 15, 2023
1 parent 78a446d commit d86baa6
Show file tree
Hide file tree
Showing 2 changed files with 35 additions and 68 deletions.
93 changes: 35 additions & 58 deletions library/src/test/java/com/vinted/coper/CoperImplTest.kt
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ class CoperImplTest {
@Before
fun setup() = runTest {
runIdlingMainThread { fixture.mockGetFragmentWithStub() }
mockCheckPermissions("test", PackageManager.PERMISSION_GRANTED)
shadowOf(activity).grantPermissions("test")
}

@Test
Expand All @@ -57,7 +57,7 @@ class CoperImplTest {
@Config(sdk = [21, 23, 27])
fun request_permissionsIsGranted_grantedListConsistOfThisPermission() = runTest {
val permissionName = "granted"
mockCheckPermissions(permissionName, PackageManager.PERMISSION_GRANTED)
shadowOf(activity).grantPermissions(permissionName)

val response = fixture.request(permissionName)

Expand All @@ -70,8 +70,7 @@ class CoperImplTest {
fun request_twoPermissionsIsGranted_grantedListConsistOfThisPermissions() = runTest {
val firstPermission = "granted"
val secondPermission = "granted2"
mockCheckPermissions(firstPermission, PackageManager.PERMISSION_GRANTED)
mockCheckPermissions(secondPermission, PackageManager.PERMISSION_GRANTED)
shadowOf(activity).grantPermissions(firstPermission, secondPermission)

val response = fixture.request(firstPermission, secondPermission)

Expand All @@ -83,7 +82,7 @@ class CoperImplTest {
@Config(sdk = [21])
fun request_sdkUnder23AndPermissionsDenied_permissionResultDeniedWaitingResult() = runTest {
val permission = "denied"
mockCheckPermissions(permission, PackageManager.PERMISSION_DENIED)
shadowOf(activity).denyPermissions(permission)

val response = fixture.request(permission)

Expand All @@ -94,7 +93,7 @@ class CoperImplTest {
@Test
fun request_permissionsIsDeniedRationale_permissionDeniedRationaleResult() = runTest {
val permissionName = "denied"
mockCheckPermissions(permissionName, PackageManager.PERMISSION_DENIED)
shadowOf(activity).denyPermissions(permissionName)
activity.setShouldShowRequestPermissionRationale(
permission = permissionName,
rationale = true
Expand All @@ -113,7 +112,7 @@ class CoperImplTest {
@Test
fun request_permissionsIsDeniedPermanently_permissionDeniedPermanentlyResult() = runTest {
val permissionName = "denied_perm"
mockCheckPermissions(permissionName, PackageManager.PERMISSION_DENIED)
shadowOf(activity).denyPermissions(permissionName)
activity.setShouldShowRequestPermissionRationale(
permission = permissionName,
rationale = false
Expand All @@ -133,12 +132,11 @@ class CoperImplTest {
fun request_permissionsIsDeniedPermanentlyAndOtherRationale_bothPermissionsExist() = runTest {
val permissionPermanently = "denied_perm"
val permissionRationale = "denied_rat"
mockCheckPermissions(permissionPermanently, PackageManager.PERMISSION_DENIED)
shadowOf(activity).denyPermissions(permissionPermanently, permissionRationale)
activity.setShouldShowRequestPermissionRationale(
permission = permissionPermanently,
rationale = false
)
mockCheckPermissions(permissionRationale, PackageManager.PERMISSION_DENIED)
activity.setShouldShowRequestPermissionRationale(
permission = permissionRationale,
rationale = true
Expand Down Expand Up @@ -171,9 +169,8 @@ class CoperImplTest {
fun request_twoPermissionsOneGrantedAndOneDenied_onePermissionEmitsToOnGrantedOtherToOnDenied() {
return runTest {
val permissionDenied = "denied"
mockCheckPermissions(permissionDenied, PackageManager.PERMISSION_DENIED)
val permissionGranted = "granted"
mockCheckPermissions(permissionGranted, PackageManager.PERMISSION_DENIED)
shadowOf(activity).denyPermissions(permissionDenied, permissionGranted)

val response = executePermissionRequest(
permissionsToRequest = listOf(permissionGranted, permissionDenied),
Expand All @@ -195,7 +192,7 @@ class CoperImplTest {
@Test
fun request_permissionsIsDeniedButOnrequestGranted_permissionGrantedResult() = runTest {
val permissionName = "denied_and_granted"
mockCheckPermissions(permissionName, PackageManager.PERMISSION_DENIED)
shadowOf(activity).denyPermissions(permissionName)

val response = executePermissionRequest(
permissionsToRequest = listOf(permissionName),
Expand All @@ -211,8 +208,7 @@ class CoperImplTest {
return runTest {
val firstPermission = "first"
val secondPermission = "second"
mockCheckPermissions(firstPermission, PackageManager.PERMISSION_DENIED)
mockCheckPermissions(secondPermission, PackageManager.PERMISSION_DENIED)
shadowOf(activity).denyPermissions(firstPermission, secondPermission)

val response = executePermissionRequest(
permissionsToRequest = listOf(
Expand All @@ -235,8 +231,7 @@ class CoperImplTest {
return runTest {
val firstPermission = "first"
val secondPermission = "second"
mockCheckPermissions(firstPermission, PackageManager.PERMISSION_DENIED)
mockCheckPermissions(secondPermission, PackageManager.PERMISSION_DENIED)
shadowOf(activity).denyPermissions(firstPermission, secondPermission)

val response = executePermissionRequest(
permissionsToRequest = listOf(
Expand Down Expand Up @@ -267,8 +262,7 @@ class CoperImplTest {
permission = secondPermission,
rationale = true
)
mockCheckPermissions(firstPermission, PackageManager.PERMISSION_DENIED)
mockCheckPermissions(secondPermission, PackageManager.PERMISSION_DENIED)
shadowOf(activity).denyPermissions(firstPermission, secondPermission)

val response = executePermissionRequest(
permissionsToRequest = listOf(
Expand All @@ -293,8 +287,7 @@ class CoperImplTest {
fun request_twoParallelPermissionsRequestBothGranted_bothGotGranted() = runTest {
val firstPermission = "first"
val secondPermission = "second"
mockCheckPermissions(firstPermission, PackageManager.PERMISSION_DENIED)
mockCheckPermissions(secondPermission, PackageManager.PERMISSION_DENIED)
shadowOf(activity).denyPermissions(firstPermission, secondPermission)

val response1Job = async {
executePermissionRequest(
Expand Down Expand Up @@ -325,8 +318,7 @@ class CoperImplTest {
firstCoperReference.mockGetFragmentWithStub()
val secondCoperReference = getCoperInstance()
secondCoperReference.mockGetFragmentWithStub()
mockCheckPermissions(firstPermission, PackageManager.PERMISSION_DENIED)
mockCheckPermissions(secondPermission, PackageManager.PERMISSION_DENIED)
shadowOf(activity).denyPermissions(firstPermission, secondPermission)

val response1Job = async {
executePermissionRequest(
Expand Down Expand Up @@ -355,8 +347,7 @@ class CoperImplTest {
fun request_twoSynchronousPermissionsRequestBothGranted_bothGotGranted() = runTest {
val firstPermission = "first"
val secondPermission = "second"
mockCheckPermissions(firstPermission, PackageManager.PERMISSION_DENIED)
mockCheckPermissions(secondPermission, PackageManager.PERMISSION_DENIED)
shadowOf(activity).denyPermissions(firstPermission, secondPermission)

val response1 = executePermissionRequest(
permissionsToRequest = listOf(firstPermission),
Expand Down Expand Up @@ -440,8 +431,7 @@ class CoperImplTest {
@Test(expected = IllegalStateException::class)
fun request_resultPermissionsEmptyList_throwException() = runTest {
val crashPermission = "crash"
mockCheckPermissions(crashPermission, PackageManager.PERMISSION_DENIED)

shadowOf(activity).denyPermissions(crashPermission)

executePermissionRequest(
permissionsToRequest = emptyList(),
Expand All @@ -452,7 +442,7 @@ class CoperImplTest {
@Test(expected = IllegalStateException::class)
fun request_resultPermissionResultEmptyList_throwException() = runTest {
val crashPermission = "crash"
mockCheckPermissions(crashPermission, PackageManager.PERMISSION_DENIED)
shadowOf(activity).denyPermissions(crashPermission)

executePermissionRequest(listOf(crashPermission), emptyList())
}
Expand Down Expand Up @@ -490,7 +480,7 @@ class CoperImplTest {
)
val fragment = runIdlingMainThread { fixture.getFragmentSafely() }
val permission = "onConfigurationChange"
activity.setPermissionResult(permission, PackageManager.PERMISSION_DENIED)
shadowOf(activity).denyPermissions(permission)

val job = async {
fixture.request(permission)
Expand All @@ -510,7 +500,7 @@ class CoperImplTest {
@Test
fun withPermissions_requestGranted_bodyRun() = runTest {
val permission = "permission"
mockCheckPermissions(permission, PackageManager.PERMISSION_DENIED)
shadowOf(activity).denyPermissions(permission)

executeWithPermission(listOf(permission), listOf(PermissionChecker.PERMISSION_GRANTED)) {
assertTrue { it.grantedPermissions.isNotEmpty() }
Expand All @@ -520,7 +510,7 @@ class CoperImplTest {
@Test(expected = PermissionsRequestFailedException::class)
fun withPermissions_requestDenied_throwException() = runTest {
val permission = "permission"
mockCheckPermissions(permission, PackageManager.PERMISSION_DENIED)
shadowOf(activity).denyPermissions(permission)

executeWithPermission(listOf(permission), listOf(PermissionChecker.PERMISSION_DENIED)) {
}
Expand All @@ -529,7 +519,7 @@ class CoperImplTest {
@Test
fun request_permissionResultCameWithDifferentPermissions_jobIsNotCompleted() = runTest {
val permission = "permission"
mockCheckPermissions(permission, PackageManager.PERMISSION_DENIED)
shadowOf(activity).denyPermissions(permission)
val fragment = fixture.getFragmentSafely()
whenever(
fragment.requestPermissions(
Expand All @@ -556,7 +546,7 @@ class CoperImplTest {
fun request_onResumeCalledDuringRequest_permissionRequestStarted() = runTest {
val permission = "onResume"
val fragment = fixture.getFragmentSafely()
mockCheckPermissions(permission, PermissionChecker.PERMISSION_DENIED)
shadowOf(activity).denyPermissions(permission)

val responseAsync = async {
fixture.request(permission)
Expand All @@ -571,7 +561,7 @@ class CoperImplTest {
@Test
fun request_twoIdenticalRequest_twoRequestCompleted() = runTest {
val permission = "sameRequest"
mockCheckPermissions(permission, PermissionChecker.PERMISSION_DENIED)
shadowOf(activity).denyPermissions(permission)
val responseAsync1 = async {
executePermissionRequest(
permissionsToRequest = listOf(permission),
Expand All @@ -595,8 +585,7 @@ class CoperImplTest {
fun request_twoIdenticalRequestButOrderIsDifferent_twoRequestCompleted() = runTest {
val firstPermission = "firstPermission"
val secondPermission = "secondPermission"
mockCheckPermissions(firstPermission, PermissionChecker.PERMISSION_DENIED)
mockCheckPermissions(secondPermission, PermissionChecker.PERMISSION_DENIED)
shadowOf(activity).denyPermissions(firstPermission, secondPermission)

val responseAsync1 = async {
executePermissionRequest(
Expand All @@ -622,8 +611,7 @@ class CoperImplTest {
return runTest {
val firstPermission = "firstPermission"
val secondPermission = "secondPermission"
mockCheckPermissions(firstPermission, PermissionChecker.PERMISSION_DENIED)
mockCheckPermissions(secondPermission, PermissionChecker.PERMISSION_DENIED)
shadowOf(activity).denyPermissions(firstPermission, secondPermission)
val coperFragment = fixture.getFragmentSafely()
whenever(
coperFragment.requestPermissions(
Expand Down Expand Up @@ -656,9 +644,10 @@ class CoperImplTest {

@Test
fun isRequestPending_requestIsPending_returnsTrue() = runTest {
mockCheckPermissions("test", PermissionChecker.PERMISSION_DENIED)
val permission = "test"
shadowOf(activity).denyPermissions(permission)
val responseAsync = async {
fixture.request("test")
fixture.request(permission)
}
fixture.getFragmentSafely().permissionRequestStateFlow.filterNotNull().first()

Expand All @@ -671,29 +660,21 @@ class CoperImplTest {
@Test
@Config(sdk = [21, 23, 27])
fun isPermissionsGranted_permissionsNotGranted_returnsFalse() = runTest {
mockCheckPermissions("not_granted", PermissionChecker.PERMISSION_DENIED)

val isGranted = fixture.isPermissionsGrantedSafe("not_granted")

assertFalse(isGranted)
}

@Test
@Config(sdk = [21, 23, 27])
fun isPermissionsGranted_permissionsNotGrantedByOp_returnsFalse() = runTest {
mockCheckPermissions("not_granted_op", PermissionChecker.PERMISSION_DENIED_APP_OP)
val permission = "not_granted"
shadowOf(activity).denyPermissions(permission)

val isGranted = fixture.isPermissionsGrantedSafe("not_granted_op")
val isGranted = fixture.isPermissionsGrantedSafe(permission)

assertFalse(isGranted)
}

@Test
@Config(sdk = [21, 23, 27])
fun isPermissionsGranted_permissionsGranted_returnsTrue() = runTest {
mockCheckPermissions("granted", PermissionChecker.PERMISSION_GRANTED)
val permission = "granted"
shadowOf(activity).grantPermissions(permission)

val isGranted = fixture.isPermissionsGrantedSafe("granted")
val isGranted = fixture.isPermissionsGrantedSafe(permission)

assertTrue(isGranted)
}
Expand All @@ -704,7 +685,7 @@ class CoperImplTest {
val requests = mutableListOf<Deferred<PermissionResult>>()
for (i in 0 until testCount) {
val permission = "test-$i"
mockCheckPermissions(permission, PermissionChecker.PERMISSION_DENIED)
shadowOf(activity).denyPermissions(permission)

requests.add(async {
executePermissionRequest(
Expand Down Expand Up @@ -837,10 +818,6 @@ class CoperImplTest {
}
}

private fun mockCheckPermissions(permission: String, result: Int) {
activity.setPermissionResult(permission, result)
}

private fun getCoperInstance(
fragmentManager: FragmentManager = activity.supportFragmentManager,
lifecycle: Lifecycle? = activity.lifecycle,
Expand Down
10 changes: 0 additions & 10 deletions library/src/test/java/com/vinted/coper/CoperTestActivity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -3,22 +3,12 @@ package com.vinted.coper
import androidx.fragment.app.FragmentActivity

class CoperTestActivity : FragmentActivity() {

private val permissionResult = mutableMapOf<String, Int>()
private val shouldShowRequestPermissionRationaleResult = mutableMapOf<String, Boolean>()

fun setPermissionResult(permission: String, result: Int) {
permissionResult[permission] = result
}

fun setShouldShowRequestPermissionRationale(permission: String, rationale: Boolean) {
shouldShowRequestPermissionRationaleResult[permission] = rationale
}

override fun checkPermission(permission: String, pid: Int, uid: Int): Int {
return permissionResult[permission] ?: super.checkPermission(permission, pid, uid)
}

override fun shouldShowRequestPermissionRationale(permission: String): Boolean {
return shouldShowRequestPermissionRationaleResult[permission]
?: super.shouldShowRequestPermissionRationale(permission)
Expand Down

0 comments on commit d86baa6

Please sign in to comment.