Skip to content

Commit 6871fa0

Browse files
authored
fix: getting self team info will always wait for a remote sync first [WPB-21894] (#3842)
* fix: update GetUpdatedSelfTeamUseCase to retrieve cached team information * refactor: rename GetUpdatedSelfTeamUseCase to SyncSelfTeamInfoUseCase and update related references
1 parent 635f23d commit 6871fa0

File tree

6 files changed

+60
-39
lines changed

6 files changed

+60
-39
lines changed

logic/src/commonMain/kotlin/com/wire/kalium/logic/feature/team/GetUpdatedSelfTeamUseCase.kt renamed to logic/src/commonMain/kotlin/com/wire/kalium/logic/feature/team/SyncSelfTeamInfoUseCase.kt

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,17 +24,16 @@ import com.wire.kalium.logic.data.team.Team
2424
import com.wire.kalium.logic.data.team.TeamRepository
2525

2626
/**
27-
* This use case is responsible for getting the updated team information of the self user.
27+
* This use case is responsible for syncing the self team information from the backend.
2828
*/
29-
// todo(interface). extract interface for use case
30-
public class GetUpdatedSelfTeamUseCase internal constructor(
29+
public class SyncSelfTeamInfoUseCase internal constructor(
3130
private val selfTeamIdProvider: SelfTeamIdProvider,
3231
private val teamRepository: TeamRepository,
3332
) {
3433

3534
public suspend operator fun invoke(): Team? {
3635
return selfTeamIdProvider().nullableFold({
37-
kaliumLogger.w("GetUpdatedSelfTeamUseCase - self team id not found")
36+
kaliumLogger.w("SyncSelfTeamInfoUseCase - self team id not found")
3837
null
3938
}, { teamId ->
4039
teamId?.let { teamRepository.syncTeam(it) }

logic/src/commonMain/kotlin/com/wire/kalium/logic/feature/team/TeamScope.kt

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,9 @@ public class TeamScope internal constructor(
2929
private val slowSyncRepository: SlowSyncRepository,
3030
private val selfTeamIdProvider: SelfTeamIdProvider
3131
) {
32-
public val getUpdatedSelfTeamUseCase: GetUpdatedSelfTeamUseCase
33-
get() = GetUpdatedSelfTeamUseCase(
32+
33+
public val syncSelfTeamInfoUseCase: SyncSelfTeamInfoUseCase
34+
get() = SyncSelfTeamInfoUseCase(
3435
selfTeamIdProvider = selfTeamIdProvider,
3536
teamRepository = teamRepository,
3637
)

logic/src/commonMain/kotlin/com/wire/kalium/logic/feature/user/ObserveSelfUserWithTeamUseCase.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,16 +25,16 @@ import kotlinx.coroutines.flow.Flow
2525
/**
2626
* This use case is responsible for retrieving the current user and his/her team.
2727
*/
28-
internal interface ObserveSelfUserWithTeamUseCase {
28+
public interface ObserveSelfUserWithTeamUseCase {
2929

3030
/**
3131
* @return a [Flow] of Pair, where [Pair.first] is the current user [SelfUser] and [Pair.second] is the Team of the current User [Team]
3232
*/
33-
suspend operator fun invoke(): Flow<Pair<SelfUser, Team?>>
33+
public suspend operator fun invoke(): Flow<Pair<SelfUser, Team?>>
3434

3535
}
3636

37-
internal class ObserveSelfUserWithTeamUseCaseImpl internal constructor(private val userRepository: UserRepository) :
37+
public class ObserveSelfUserWithTeamUseCaseImpl internal constructor(private val userRepository: UserRepository) :
3838
ObserveSelfUserWithTeamUseCase {
3939

4040
override suspend operator fun invoke(): Flow<Pair<SelfUser, Team?>> {

logic/src/commonMain/kotlin/com/wire/kalium/logic/feature/user/ObserveValidAccountsUseCase.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ internal class ObserveValidAccountsUseCaseImpl internal constructor(
6161
} else {
6262
val flowsOfSelfUsers = accountList.map { accountInfo ->
6363
userSessionScopeProvider.getOrCreate(accountInfo.userId).let {
64-
it.users.getSelfUserWithTeam()
64+
it.users.observeSelfUserWithTeam()
6565
}
6666
}
6767
combine(flowsOfSelfUsers) { it.asList() }

logic/src/commonMain/kotlin/com/wire/kalium/logic/feature/user/UserScope.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -148,7 +148,8 @@ public class UserScope internal constructor(
148148
private val validateUserHandleUseCase: ValidateUserHandleUseCase get() = ValidateUserHandleUseCaseImpl()
149149
public val getSelfUser: GetSelfUserUseCase get() = GetSelfUserUseCaseImpl(userRepository)
150150
public val observeSelfUser: ObserveSelfUserUseCase get() = ObserveSelfUserUseCaseImpl(userRepository)
151-
internal val getSelfUserWithTeam: ObserveSelfUserWithTeamUseCase get() = ObserveSelfUserWithTeamUseCaseImpl(userRepository)
151+
public val observeSelfUserWithTeam: ObserveSelfUserWithTeamUseCase
152+
get() = ObserveSelfUserWithTeamUseCaseImpl(userRepository)
152153
public val observeUserInfo: ObserveUserInfoUseCase get() = ObserveUserInfoUseCaseImpl(userRepository, teamRepository)
153154
public val uploadUserAvatar: UploadUserAvatarUseCase get() = UploadUserAvatarUseCaseImpl(userRepository, assetRepository)
154155
public val persistSelfUserEmail: PersistSelfUserEmailUseCase get() = PersistSelfUserEmailUseCaseImpl(userRepository)

logic/src/commonTest/kotlin/com/wire/kalium/logic/feature/team/GetUpdatedSelfTeamUseCaseTest.kt renamed to logic/src/commonTest/kotlin/com/wire/kalium/logic/feature/team/SyncSelfTeamInfoUseCaseTest.kt

Lines changed: 48 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -24,89 +24,109 @@ import com.wire.kalium.logic.data.id.TeamId
2424
import com.wire.kalium.logic.data.team.Team
2525
import com.wire.kalium.logic.data.team.TeamRepository
2626
import com.wire.kalium.logic.framework.TestTeam
27-
import io.mockative.any
28-
import io.mockative.coEvery
29-
import io.mockative.coVerify
30-
import io.mockative.eq
31-
import io.mockative.mock
27+
import dev.mokkery.answering.returns
28+
import dev.mokkery.everySuspend
29+
import dev.mokkery.matcher.any
30+
import dev.mokkery.matcher.eq
31+
import dev.mokkery.mock
32+
import dev.mokkery.verify.VerifyMode
33+
import dev.mokkery.verifySuspend
3234
import kotlinx.coroutines.test.runTest
3335
import kotlin.test.Test
34-
import kotlin.test.assertNotNull
36+
import kotlin.test.assertEquals
3537
import kotlin.test.assertNull
3638

37-
class GetUpdatedSelfTeamUseCaseTest {
39+
class SyncSelfTeamInfoUseCaseTest {
3840

3941
@Test
40-
fun givenSelfUserHasNotValidTeam_whenGettingSelfTeam_thenTeamInfoAndServicesAreNotRequested() = runTest {
42+
fun givenSelfUserHasNotValidTeam_whenSyncingSelfTeam_thenTeamInfoIsNotRequested() = runTest {
4143
// given
4244
val (arrangement, sut) = Arrangement()
4345
.withSelfTeamIdProvider(Either.Right(null))
44-
.withSyncingByIdReturning(Either.Right(TestTeam.TEAM))
46+
.withSyncTeamReturning(Either.Right(TestTeam.TEAM))
4547
.arrange()
4648

4749
// when
4850
val result = sut.invoke()
4951

5052
// then
5153
assertNull(result)
52-
coVerify {
53-
arrangement.teamRepository.syncTeam(eq(TestTeam.TEAM_ID))
54-
}.wasNotInvoked()
54+
verifySuspend(VerifyMode.not) {
55+
arrangement.teamRepository.syncTeam(any())
56+
}
5557
}
5658

5759
@Test
58-
fun givenAnError_whenGettingSelfTeam_thenTeamInfoAndServicesAreNotRequested() = runTest {
60+
fun givenAnError_whenSyncingSelfTeam_thenTeamInfoIsNotRequested() = runTest {
5961
// given
6062
val (arrangement, sut) = Arrangement()
6163
.withSelfTeamIdProvider(Either.Left(CoreFailure.Unknown(RuntimeException("some error"))))
62-
.withSyncingByIdReturning(Either.Right(TestTeam.TEAM))
64+
.withSyncTeamReturning(Either.Right(TestTeam.TEAM))
65+
.arrange()
66+
67+
// when
68+
val result = sut.invoke()
69+
70+
// then
71+
assertNull(result)
72+
verifySuspend(VerifyMode.not) {
73+
arrangement.teamRepository.syncTeam(any())
74+
}
75+
}
76+
77+
@Test
78+
fun givenSelfUserHasValidTeam_whenSyncingSelfTeamFails_thenNullIsReturned() = runTest {
79+
// given
80+
val (arrangement, sut) = Arrangement()
81+
.withSelfTeamIdProvider(Either.Right(TestTeam.TEAM_ID))
82+
.withSyncTeamReturning(Either.Left(CoreFailure.Unknown(RuntimeException("some error"))))
6383
.arrange()
6484

6585
// when
6686
val result = sut.invoke()
6787

6888
// then
6989
assertNull(result)
70-
coVerify {
90+
verifySuspend {
7191
arrangement.teamRepository.syncTeam(eq(TestTeam.TEAM_ID))
72-
}.wasNotInvoked()
92+
}
7393
}
7494

7595
@Test
76-
fun givenSelfUserHasValidTeam_whenGettingSelfTeam_thenTeamInfoAndServicesAreRequested() = runTest {
96+
fun givenSelfUserHasValidTeam_whenSyncingSelfTeam_thenTeamInfoIsReturned() = runTest {
7797
// given
7898
val (arrangement, sut) = Arrangement()
7999
.withSelfTeamIdProvider(Either.Right(TestTeam.TEAM_ID))
80-
.withSyncingByIdReturning(Either.Right(TestTeam.TEAM))
100+
.withSyncTeamReturning(Either.Right(TestTeam.TEAM))
81101
.arrange()
82102

83103
// when
84104
val result = sut.invoke()
85105

86106
// then
87-
assertNotNull(result)
88-
coVerify {
107+
assertEquals(TestTeam.TEAM, result)
108+
verifySuspend {
89109
arrangement.teamRepository.syncTeam(eq(TestTeam.TEAM_ID))
90-
}.wasInvoked()
110+
}
91111
}
92112

93113
private class Arrangement {
94-
val selfTeamIdProvider: SelfTeamIdProvider = mock(SelfTeamIdProvider::class)
95-
val teamRepository: TeamRepository = mock(TeamRepository::class)
114+
val selfTeamIdProvider: SelfTeamIdProvider = mock<SelfTeamIdProvider>()
115+
val teamRepository: TeamRepository = mock<TeamRepository>()
96116

97-
suspend fun withSelfTeamIdProvider(result: Either<CoreFailure, TeamId?>) = apply {
98-
coEvery {
117+
fun withSelfTeamIdProvider(result: Either<CoreFailure, TeamId?>) = apply {
118+
everySuspend {
99119
selfTeamIdProvider.invoke()
100120
}.returns(result)
101121
}
102122

103-
suspend fun withSyncingByIdReturning(result: Either<CoreFailure, Team>) = apply {
104-
coEvery {
123+
fun withSyncTeamReturning(result: Either<CoreFailure, Team>) = apply {
124+
everySuspend {
105125
teamRepository.syncTeam(any())
106126
}.returns(result)
107127
}
108128

109-
fun arrange() = this to GetUpdatedSelfTeamUseCase(
129+
fun arrange() = this to SyncSelfTeamInfoUseCase(
110130
selfTeamIdProvider = selfTeamIdProvider,
111131
teamRepository = teamRepository
112132
)

0 commit comments

Comments
 (0)