diff --git a/vector/src/main/java/im/vector/app/features/settings/devices/v2/overview/GetDeviceFullInfoUseCase.kt b/vector/src/main/java/im/vector/app/features/settings/devices/v2/overview/GetDeviceFullInfoUseCase.kt index b7d8efb59a..d20ca17471 100644 --- a/vector/src/main/java/im/vector/app/features/settings/devices/v2/overview/GetDeviceFullInfoUseCase.kt +++ b/vector/src/main/java/im/vector/app/features/settings/devices/v2/overview/GetDeviceFullInfoUseCase.kt @@ -26,7 +26,6 @@ import org.matrix.android.sdk.api.util.Optional import org.matrix.android.sdk.api.util.toOptional import javax.inject.Inject -// TODO add unit tests class GetDeviceFullInfoUseCase @Inject constructor( private val activeSessionHolder: ActiveSessionHolder, ) { diff --git a/vector/src/test/java/im/vector/app/features/location/live/GetLiveLocationShareSummaryUseCaseTest.kt b/vector/src/test/java/im/vector/app/features/location/live/GetLiveLocationShareSummaryUseCaseTest.kt index ed1bcebf16..89966b5317 100644 --- a/vector/src/test/java/im/vector/app/features/location/live/GetLiveLocationShareSummaryUseCaseTest.kt +++ b/vector/src/test/java/im/vector/app/features/location/live/GetLiveLocationShareSummaryUseCaseTest.kt @@ -18,7 +18,7 @@ package im.vector.app.features.location.live import im.vector.app.test.fakes.FakeFlowLiveDataConversions import im.vector.app.test.fakes.FakeSession -import im.vector.app.test.fakes.givenAsFlowReturns +import im.vector.app.test.fakes.givenAsFlow import io.mockk.unmockkAll import kotlinx.coroutines.flow.first import kotlinx.coroutines.test.runTest @@ -28,7 +28,6 @@ import org.junit.Before import org.junit.Test import org.matrix.android.sdk.api.session.room.model.livelocation.LiveLocationShareAggregatedSummary import org.matrix.android.sdk.api.session.room.model.message.MessageBeaconLocationDataContent -import org.matrix.android.sdk.api.util.Optional private const val A_ROOM_ID = "room_id" private const val AN_EVENT_ID = "event_id" @@ -64,7 +63,7 @@ class GetLiveLocationShareSummaryUseCaseTest { .getRoom(A_ROOM_ID) .locationSharingService() .givenLiveLocationShareSummaryReturns(AN_EVENT_ID, summary) - .givenAsFlowReturns(Optional(summary)) + .givenAsFlow() val result = getLiveLocationShareSummaryUseCase.execute(A_ROOM_ID, AN_EVENT_ID).first() @@ -77,7 +76,7 @@ class GetLiveLocationShareSummaryUseCaseTest { .getRoom(A_ROOM_ID) .locationSharingService() .givenLiveLocationShareSummaryReturns(AN_EVENT_ID, null) - .givenAsFlowReturns(Optional(null)) + .givenAsFlow() val result = getLiveLocationShareSummaryUseCase.execute(A_ROOM_ID, AN_EVENT_ID).first() diff --git a/vector/src/test/java/im/vector/app/features/location/live/map/GetListOfUserLiveLocationUseCaseTest.kt b/vector/src/test/java/im/vector/app/features/location/live/map/GetListOfUserLiveLocationUseCaseTest.kt index 420b8e6a06..6d24858915 100644 --- a/vector/src/test/java/im/vector/app/features/location/live/map/GetListOfUserLiveLocationUseCaseTest.kt +++ b/vector/src/test/java/im/vector/app/features/location/live/map/GetListOfUserLiveLocationUseCaseTest.kt @@ -19,7 +19,7 @@ package im.vector.app.features.location.live.map import im.vector.app.features.location.LocationData import im.vector.app.test.fakes.FakeFlowLiveDataConversions import im.vector.app.test.fakes.FakeSession -import im.vector.app.test.fakes.givenAsFlowReturns +import im.vector.app.test.fakes.givenAsFlow import io.mockk.coEvery import io.mockk.mockk import io.mockk.unmockkAll @@ -81,7 +81,7 @@ class GetListOfUserLiveLocationUseCaseTest { .getRoom(A_ROOM_ID) .locationSharingService() .givenRunningLiveLocationShareSummariesReturns(summaries) - .givenAsFlowReturns(summaries) + .givenAsFlow() val viewState1 = UserLiveLocationViewState( matrixItem = MatrixItem.UserItem(id = "@userId1:matrix.org", displayName = "User 1", avatarUrl = ""), diff --git a/vector/src/test/java/im/vector/app/features/settings/devices/v2/overview/GetDeviceFullInfoUseCaseTest.kt b/vector/src/test/java/im/vector/app/features/settings/devices/v2/overview/GetDeviceFullInfoUseCaseTest.kt new file mode 100644 index 0000000000..32d7b6edfe --- /dev/null +++ b/vector/src/test/java/im/vector/app/features/settings/devices/v2/overview/GetDeviceFullInfoUseCaseTest.kt @@ -0,0 +1,99 @@ +/* + * Copyright (c) 2022 New Vector Ltd + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package im.vector.app.features.settings.devices.v2.overview + +import androidx.lifecycle.MutableLiveData +import androidx.lifecycle.asFlow +import im.vector.app.features.settings.devices.DeviceFullInfo +import im.vector.app.test.fakes.FakeActiveSessionHolder +import im.vector.app.test.fakes.FakeFlowLiveDataConversions +import im.vector.app.test.fakes.givenAsFlow +import io.mockk.unmockkAll +import io.mockk.verify +import kotlinx.coroutines.flow.firstOrNull +import kotlinx.coroutines.test.runTest +import org.amshove.kluent.shouldBeEqualTo +import org.junit.After +import org.junit.Before +import org.junit.Test +import org.matrix.android.sdk.api.session.crypto.model.CryptoDeviceInfo +import org.matrix.android.sdk.api.session.crypto.model.DeviceInfo +import org.matrix.android.sdk.api.util.Optional + +private const val A_DEVICE_ID = "device-id" + +class GetDeviceFullInfoUseCaseTest { + + private val fakeActiveSessionHolder = FakeActiveSessionHolder() + private val fakeFlowLiveDataConversions = FakeFlowLiveDataConversions() + + private val getDeviceFullInfoUseCase = GetDeviceFullInfoUseCase( + activeSessionHolder = fakeActiveSessionHolder.instance + ) + + @Before + fun setUp() { + fakeFlowLiveDataConversions.setup() + } + + @After + fun tearDown() { + unmockkAll() + } + + @Test + fun `given an active session and info for device when getting device info then the result is correct`() = runTest { + val deviceInfo = DeviceInfo() + fakeActiveSessionHolder.fakeSession.fakeCryptoService.myDevicesInfoWithIdLiveData = MutableLiveData(Optional(deviceInfo)) + fakeActiveSessionHolder.fakeSession.fakeCryptoService.myDevicesInfoWithIdLiveData.givenAsFlow() + val cryptoDeviceInfo = CryptoDeviceInfo(deviceId = A_DEVICE_ID, userId = "") + fakeActiveSessionHolder.fakeSession.fakeCryptoService.cryptoDeviceInfoWithIdLiveData = MutableLiveData(Optional(cryptoDeviceInfo)) + fakeActiveSessionHolder.fakeSession.fakeCryptoService.cryptoDeviceInfoWithIdLiveData.givenAsFlow() + + val deviceFullInfo = getDeviceFullInfoUseCase.execute(A_DEVICE_ID).firstOrNull() + + deviceFullInfo shouldBeEqualTo Optional(DeviceFullInfo(deviceInfo = deviceInfo, cryptoDeviceInfo = cryptoDeviceInfo)) + verify { fakeActiveSessionHolder.instance.getSafeActiveSession() } + verify { fakeActiveSessionHolder.fakeSession.fakeCryptoService.getMyDevicesInfoLive(A_DEVICE_ID).asFlow() } + verify { fakeActiveSessionHolder.fakeSession.fakeCryptoService.getLiveCryptoDeviceInfoWithId(A_DEVICE_ID).asFlow() } + } + + @Test + fun `given an active session and no info for device when getting device info then the result is null`() = runTest { + fakeActiveSessionHolder.fakeSession.fakeCryptoService.myDevicesInfoWithIdLiveData = MutableLiveData(Optional(null)) + fakeActiveSessionHolder.fakeSession.fakeCryptoService.myDevicesInfoWithIdLiveData.givenAsFlow() + fakeActiveSessionHolder.fakeSession.fakeCryptoService.cryptoDeviceInfoWithIdLiveData = MutableLiveData(Optional(null)) + fakeActiveSessionHolder.fakeSession.fakeCryptoService.cryptoDeviceInfoWithIdLiveData.givenAsFlow() + + val deviceFullInfo = getDeviceFullInfoUseCase.execute(A_DEVICE_ID).firstOrNull() + + deviceFullInfo shouldBeEqualTo Optional(null) + verify { fakeActiveSessionHolder.instance.getSafeActiveSession() } + verify { fakeActiveSessionHolder.fakeSession.fakeCryptoService.getMyDevicesInfoLive(A_DEVICE_ID).asFlow() } + verify { fakeActiveSessionHolder.fakeSession.fakeCryptoService.getLiveCryptoDeviceInfoWithId(A_DEVICE_ID).asFlow() } + } + + @Test + fun `given no active session when getting device info then the result is empty`() = runTest { + fakeActiveSessionHolder.givenGetSafeActiveSessionReturns(null) + + val deviceFullInfo = getDeviceFullInfoUseCase.execute(A_DEVICE_ID).firstOrNull() + + deviceFullInfo shouldBeEqualTo null + verify { fakeActiveSessionHolder.instance.getSafeActiveSession() } + } +} diff --git a/vector/src/test/java/im/vector/app/test/TestCoroutineDispatchers.kt b/vector/src/test/java/im/vector/app/test/TestCoroutineDispatchers.kt index fb3c1bb70a..c4f4c2a19a 100644 --- a/vector/src/test/java/im/vector/app/test/TestCoroutineDispatchers.kt +++ b/vector/src/test/java/im/vector/app/test/TestCoroutineDispatchers.kt @@ -19,7 +19,7 @@ package im.vector.app.test import kotlinx.coroutines.test.UnconfinedTestDispatcher import org.matrix.android.sdk.api.MatrixCoroutineDispatchers -private val testDispatcher = UnconfinedTestDispatcher() +internal val testDispatcher = UnconfinedTestDispatcher() internal val testCoroutineDispatchers = MatrixCoroutineDispatchers( io = testDispatcher, diff --git a/vector/src/test/java/im/vector/app/test/fakes/FakeActiveSessionHolder.kt b/vector/src/test/java/im/vector/app/test/fakes/FakeActiveSessionHolder.kt index 3065c18c30..bfc36ef06d 100644 --- a/vector/src/test/java/im/vector/app/test/fakes/FakeActiveSessionHolder.kt +++ b/vector/src/test/java/im/vector/app/test/fakes/FakeActiveSessionHolder.kt @@ -33,4 +33,8 @@ class FakeActiveSessionHolder( fun expectSetsActiveSession(session: Session) { justRun { instance.setActiveSession(session) } } + + fun givenGetSafeActiveSessionReturns(session: Session?) { + every { instance.getSafeActiveSession() } returns session + } } diff --git a/vector/src/test/java/im/vector/app/test/fakes/FakeCryptoService.kt b/vector/src/test/java/im/vector/app/test/fakes/FakeCryptoService.kt index ed571fc2f2..2c31933464 100644 --- a/vector/src/test/java/im/vector/app/test/fakes/FakeCryptoService.kt +++ b/vector/src/test/java/im/vector/app/test/fakes/FakeCryptoService.kt @@ -20,11 +20,15 @@ import androidx.lifecycle.MutableLiveData import io.mockk.mockk import org.matrix.android.sdk.api.session.crypto.CryptoService import org.matrix.android.sdk.api.session.crypto.model.CryptoDeviceInfo +import org.matrix.android.sdk.api.session.crypto.model.DeviceInfo +import org.matrix.android.sdk.api.util.Optional class FakeCryptoService : CryptoService by mockk() { var roomKeysExport = ByteArray(size = 1) var cryptoDeviceInfos = mutableMapOf() + var cryptoDeviceInfoWithIdLiveData: MutableLiveData> = MutableLiveData() + var myDevicesInfoWithIdLiveData: MutableLiveData> = MutableLiveData() override suspend fun exportRoomKeys(password: String) = roomKeysExport @@ -35,4 +39,8 @@ class FakeCryptoService : CryptoService by mockk() { override fun getLiveCryptoDeviceInfo(userIds: List) = MutableLiveData( cryptoDeviceInfos.filterKeys { userIds.contains(it) }.values.toList() ) + + override fun getLiveCryptoDeviceInfoWithId(deviceId: String) = cryptoDeviceInfoWithIdLiveData + + override fun getMyDevicesInfoLive(deviceId: String) = myDevicesInfoWithIdLiveData } diff --git a/vector/src/test/java/im/vector/app/test/fakes/FakeFlowLiveDataConversions.kt b/vector/src/test/java/im/vector/app/test/fakes/FakeFlowLiveDataConversions.kt index 9abbcc174d..956a86f32e 100644 --- a/vector/src/test/java/im/vector/app/test/fakes/FakeFlowLiveDataConversions.kt +++ b/vector/src/test/java/im/vector/app/test/fakes/FakeFlowLiveDataConversions.kt @@ -28,6 +28,6 @@ class FakeFlowLiveDataConversions { } } -fun LiveData.givenAsFlowReturns(value: T) { - every { asFlow() } returns flowOf(value) +fun LiveData.givenAsFlow() { + every { asFlow() } returns flowOf(value!!) }