Test cleanup

This commit is contained in:
Benoit Marty 2025-12-10 10:49:16 +01:00
parent 0309b9d4cb
commit 87b85409fc

View file

@ -10,23 +10,23 @@
package io.element.android.libraries.permissions.impl package io.element.android.libraries.permissions.impl
import app.cash.molecule.RecompositionMode
import app.cash.molecule.moleculeFlow
import app.cash.turbine.test
import com.google.accompanist.permissions.ExperimentalPermissionsApi import com.google.accompanist.permissions.ExperimentalPermissionsApi
import com.google.accompanist.permissions.PermissionStatus import com.google.accompanist.permissions.PermissionStatus
import com.google.common.truth.Truth.assertThat import com.google.common.truth.Truth.assertThat
import io.element.android.libraries.permissions.api.PermissionsEvents import io.element.android.libraries.permissions.api.PermissionsEvents
import io.element.android.libraries.permissions.api.PermissionsStore
import io.element.android.libraries.permissions.impl.action.FakePermissionActions import io.element.android.libraries.permissions.impl.action.FakePermissionActions
import io.element.android.libraries.permissions.impl.action.PermissionActions
import io.element.android.libraries.permissions.test.InMemoryPermissionsStore import io.element.android.libraries.permissions.test.InMemoryPermissionsStore
import io.element.android.tests.testutils.WarmUpRule import io.element.android.tests.testutils.WarmUpRule
import io.element.android.tests.testutils.lambda.lambdaRecorder import io.element.android.tests.testutils.lambda.lambdaRecorder
import io.element.android.tests.testutils.lambda.value import io.element.android.tests.testutils.lambda.value
import io.element.android.tests.testutils.test
import kotlinx.coroutines.test.runTest import kotlinx.coroutines.test.runTest
import org.junit.Rule import org.junit.Rule
import org.junit.Test import org.junit.Test
const val A_PERMISSION = "A_PERMISSION" private const val A_PERMISSION = "A_PERMISSION"
class DefaultPermissionsPresenterTest { class DefaultPermissionsPresenterTest {
@get:Rule @get:Rule
@ -34,24 +34,8 @@ class DefaultPermissionsPresenterTest {
@Test @Test
fun `present - initial state`() = runTest { fun `present - initial state`() = runTest {
val permissionsStore = InMemoryPermissionsStore() val presenter = createPresenter()
val permissionState = FakePermissionState( presenter.test {
A_PERMISSION,
PermissionStatus.Granted
)
val permissionStateProvider =
FakeComposablePermissionStateProvider(
permissionState
)
val presenter = DefaultPermissionsPresenter(
A_PERMISSION,
permissionsStore,
permissionStateProvider,
FakePermissionActions(),
)
moleculeFlow(RecompositionMode.Immediate) {
presenter.present()
}.test {
val initialState = awaitItem() val initialState = awaitItem()
assertThat(initialState.permission).isEqualTo(A_PERMISSION) assertThat(initialState.permission).isEqualTo(A_PERMISSION)
assertThat(initialState.permissionGranted).isTrue() assertThat(initialState.permissionGranted).isTrue()
@ -68,23 +52,16 @@ class DefaultPermissionsPresenterTest {
permissionDenied = true, permissionDenied = true,
permissionAsked = true permissionAsked = true
) )
val permissionState = FakePermissionState( val permissionStateProvider = FakeComposablePermissionStateProvider(
A_PERMISSION, permissionState = aFakePermissionState(
PermissionStatus.Denied(shouldShowRationale = false) initialStatus = PermissionStatus.Denied(shouldShowRationale = false)
),
) )
val permissionStateProvider = val presenter = createPresenter(
FakeComposablePermissionStateProvider( permissionsStore = permissionsStore,
permissionState permissionStateProvider = permissionStateProvider,
)
val presenter = DefaultPermissionsPresenter(
A_PERMISSION,
permissionsStore,
permissionStateProvider,
FakePermissionActions(),
) )
moleculeFlow(RecompositionMode.Immediate) { presenter.test {
presenter.present()
}.test {
skipItems(1) skipItems(1)
val initialState = awaitItem() val initialState = awaitItem()
initialState.eventSink.invoke(PermissionsEvents.RequestPermissions) initialState.eventSink.invoke(PermissionsEvents.RequestPermissions)
@ -101,27 +78,21 @@ class DefaultPermissionsPresenterTest {
permissionDenied = true, permissionDenied = true,
permissionAsked = true permissionAsked = true
) )
val permissionState = FakePermissionState( val permissionStateProvider = FakeComposablePermissionStateProvider(
A_PERMISSION, permissionState = aFakePermissionState(
PermissionStatus.Denied(shouldShowRationale = false) initialStatus = PermissionStatus.Denied(shouldShowRationale = false),
),
) )
val permissionStateProvider =
FakeComposablePermissionStateProvider(
permissionState
)
val openSettingsAction = lambdaRecorder<String, Unit> { } val openSettingsAction = lambdaRecorder<String, Unit> { }
val permissionActions = FakePermissionActions( val permissionActions = FakePermissionActions(
openSettingsAction = openSettingsAction, openSettingsAction = openSettingsAction,
) )
val presenter = DefaultPermissionsPresenter( val presenter = createPresenter(
A_PERMISSION, permissionsStore = permissionsStore,
permissionsStore, permissionStateProvider = permissionStateProvider,
permissionStateProvider, permissionActions = permissionActions,
permissionActions,
) )
moleculeFlow(RecompositionMode.Immediate) { presenter.test {
presenter.present()
}.test {
skipItems(1) skipItems(1)
val initialState = awaitItem() val initialState = awaitItem()
initialState.eventSink.invoke(PermissionsEvents.RequestPermissions) initialState.eventSink.invoke(PermissionsEvents.RequestPermissions)
@ -136,24 +107,16 @@ class DefaultPermissionsPresenterTest {
@Test @Test
fun `present - user does not grant permission`() = runTest { fun `present - user does not grant permission`() = runTest {
val permissionsStore = InMemoryPermissionsStore() val permissionState = aFakePermissionState(
val permissionState = FakePermissionState( initialStatus = PermissionStatus.Denied(shouldShowRationale = false)
A_PERMISSION,
PermissionStatus.Denied(shouldShowRationale = false)
) )
val permissionStateProvider = val permissionStateProvider = FakeComposablePermissionStateProvider(
FakeComposablePermissionStateProvider( permissionState = permissionState,
permissionState
)
val presenter = DefaultPermissionsPresenter(
A_PERMISSION,
permissionsStore,
permissionStateProvider,
FakePermissionActions(),
) )
moleculeFlow(RecompositionMode.Immediate) { val presenter = createPresenter(
presenter.present() permissionStateProvider = permissionStateProvider,
}.test { )
presenter.test {
val initialState = awaitItem() val initialState = awaitItem()
assertThat(initialState.showDialog).isFalse() assertThat(initialState.showDialog).isFalse()
initialState.eventSink.invoke(PermissionsEvents.RequestPermissions) initialState.eventSink.invoke(PermissionsEvents.RequestPermissions)
@ -171,24 +134,16 @@ class DefaultPermissionsPresenterTest {
@Test @Test
fun `present - user does not grant permission second time`() = runTest { fun `present - user does not grant permission second time`() = runTest {
val permissionsStore = InMemoryPermissionsStore() val permissionState = aFakePermissionState(
val permissionState = FakePermissionState( initialStatus = PermissionStatus.Denied(shouldShowRationale = true)
A_PERMISSION,
PermissionStatus.Denied(shouldShowRationale = true)
) )
val permissionStateProvider = val permissionStateProvider = FakeComposablePermissionStateProvider(
FakeComposablePermissionStateProvider( permissionState = permissionState,
permissionState
)
val presenter = DefaultPermissionsPresenter(
A_PERMISSION,
permissionsStore,
permissionStateProvider,
FakePermissionActions(),
) )
moleculeFlow(RecompositionMode.Immediate) { val presenter = createPresenter(
presenter.present() permissionStateProvider = permissionStateProvider,
}.test { )
presenter.test {
val initialState = awaitItem() val initialState = awaitItem()
assertThat(initialState.showDialog).isFalse() assertThat(initialState.showDialog).isFalse()
initialState.eventSink.invoke(PermissionsEvents.RequestPermissions) initialState.eventSink.invoke(PermissionsEvents.RequestPermissions)
@ -206,28 +161,21 @@ class DefaultPermissionsPresenterTest {
@Test @Test
fun `present - user does not grant permission third time`() = runTest { fun `present - user does not grant permission third time`() = runTest {
val permissionsStore = val permissionsStore = InMemoryPermissionsStore(
InMemoryPermissionsStore( permissionDenied = true,
permissionDenied = true, permissionAsked = true,
permissionAsked = true
)
val permissionState = FakePermissionState(
A_PERMISSION,
PermissionStatus.Denied(shouldShowRationale = false)
) )
val permissionStateProvider = val permissionState = aFakePermissionState(
FakeComposablePermissionStateProvider( initialStatus = PermissionStatus.Denied(shouldShowRationale = false),
permissionState
)
val presenter = DefaultPermissionsPresenter(
A_PERMISSION,
permissionsStore,
permissionStateProvider,
FakePermissionActions(),
) )
moleculeFlow(RecompositionMode.Immediate) { val permissionStateProvider = FakeComposablePermissionStateProvider(
presenter.present() permissionState = permissionState,
}.test { )
val presenter = createPresenter(
permissionsStore = permissionsStore,
permissionStateProvider = permissionStateProvider,
)
presenter.test {
skipItems(1) skipItems(1)
val initialState = awaitItem() val initialState = awaitItem()
initialState.eventSink.invoke(PermissionsEvents.RequestPermissions) initialState.eventSink.invoke(PermissionsEvents.RequestPermissions)
@ -241,24 +189,16 @@ class DefaultPermissionsPresenterTest {
@Test @Test
fun `present - user grants permission`() = runTest { fun `present - user grants permission`() = runTest {
val permissionsStore = InMemoryPermissionsStore() val permissionState = aFakePermissionState(
val permissionState = FakePermissionState( initialStatus = PermissionStatus.Denied(shouldShowRationale = false)
A_PERMISSION,
PermissionStatus.Denied(shouldShowRationale = false)
) )
val permissionStateProvider = val permissionStateProvider = FakeComposablePermissionStateProvider(
FakeComposablePermissionStateProvider( permissionState = permissionState,
permissionState
)
val presenter = DefaultPermissionsPresenter(
A_PERMISSION,
permissionsStore,
permissionStateProvider,
FakePermissionActions(),
) )
moleculeFlow(RecompositionMode.Immediate) { val presenter = createPresenter(
presenter.present() permissionStateProvider = permissionStateProvider,
}.test { )
presenter.test {
val initialState = awaitItem() val initialState = awaitItem()
assertThat(initialState.showDialog).isFalse() assertThat(initialState.showDialog).isFalse()
initialState.eventSink.invoke(PermissionsEvents.RequestPermissions) initialState.eventSink.invoke(PermissionsEvents.RequestPermissions)
@ -274,3 +214,26 @@ class DefaultPermissionsPresenterTest {
} }
} }
} }
private fun createPresenter(
permission: String = A_PERMISSION,
permissionsStore: PermissionsStore = InMemoryPermissionsStore(),
permissionStateProvider: ComposablePermissionStateProvider = FakeComposablePermissionStateProvider(
permissionState = aFakePermissionState(),
),
permissionActions: PermissionActions = FakePermissionActions(),
) = DefaultPermissionsPresenter(
permission = permission,
permissionsStore = permissionsStore,
composablePermissionStateProvider = permissionStateProvider,
permissionActions = permissionActions,
)
private fun aFakePermissionState(
permission: String = A_PERMISSION,
initialStatus: PermissionStatus = PermissionStatus.Granted,
) = FakePermissionState(
permission = permission,
initialStatus = initialStatus,
)