Skip to content

Commit

Permalink
feat: include legalhold request pending when observing self user lega…
Browse files Browse the repository at this point in the history
…lhold state [WPB-6464] (#2479)
  • Loading branch information
saleniuk authored Feb 8, 2024
1 parent d852baf commit 65f9293
Show file tree
Hide file tree
Showing 7 changed files with 185 additions and 147 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -242,8 +242,8 @@ import com.wire.kalium.logic.feature.legalhold.MembersHavingLegalHoldClientUseCa
import com.wire.kalium.logic.feature.legalhold.MembersHavingLegalHoldClientUseCaseImpl
import com.wire.kalium.logic.feature.legalhold.ObserveLegalHoldChangeNotifiedForSelfUseCase
import com.wire.kalium.logic.feature.legalhold.ObserveLegalHoldChangeNotifiedForSelfUseCaseImpl
import com.wire.kalium.logic.feature.legalhold.ObserveLegalHoldForSelfUserUseCase
import com.wire.kalium.logic.feature.legalhold.ObserveLegalHoldForSelfUserUseCaseImpl
import com.wire.kalium.logic.feature.legalhold.ObserveLegalHoldStateForSelfUserUseCase
import com.wire.kalium.logic.feature.legalhold.ObserveLegalHoldStateForSelfUserUseCaseImpl
import com.wire.kalium.logic.feature.legalhold.ObserveLegalHoldRequestUseCase
import com.wire.kalium.logic.feature.legalhold.ObserveLegalHoldRequestUseCaseImpl
import com.wire.kalium.logic.feature.legalhold.ObserveLegalHoldStateForUserUseCase
Expand Down Expand Up @@ -1393,11 +1393,11 @@ class UserSessionScope internal constructor(

suspend fun observeIfE2EIRequiredDuringLogin(): Flow<Boolean?> = clientRepository.observeIsClientRegistrationBlockedByE2EI()

val observeLegalHoldForSelfUser: ObserveLegalHoldForSelfUserUseCase
get() = ObserveLegalHoldForSelfUserUseCaseImpl(userId, observeLegalHoldStateForUser)
val observeLegalHoldForSelfUser: ObserveLegalHoldStateForSelfUserUseCase
get() = ObserveLegalHoldStateForSelfUserUseCaseImpl(userId, observeLegalHoldStateForUser, observeLegalHoldRequest)

val observeLegalHoldChangeNotifiedForSelf: ObserveLegalHoldChangeNotifiedForSelfUseCase
get() = ObserveLegalHoldChangeNotifiedForSelfUseCaseImpl(userConfigRepository, observeLegalHoldForSelfUser)
get() = ObserveLegalHoldChangeNotifiedForSelfUseCaseImpl(userId, userConfigRepository, observeLegalHoldStateForUser)

val markLegalHoldChangeAsNotifiedForSelf: MarkLegalHoldChangeAsNotifiedForSelfUseCase
get() = MarkLegalHoldChangeAsNotifiedForSelfUseCaseImpl(userConfigRepository)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ package com.wire.kalium.logic.feature.legalhold

import com.wire.kalium.logic.CoreFailure
import com.wire.kalium.logic.configuration.UserConfigRepository
import com.wire.kalium.logic.data.user.UserId
import com.wire.kalium.logic.functional.fold
import com.wire.kalium.logic.kaliumLogger
import kotlinx.coroutines.ExperimentalCoroutinesApi
Expand All @@ -41,8 +42,9 @@ interface ObserveLegalHoldChangeNotifiedForSelfUseCase {
}

internal class ObserveLegalHoldChangeNotifiedForSelfUseCaseImpl internal constructor(
private val selfUserId: UserId,
val userConfigRepository: UserConfigRepository,
val observeLegalHoldForSelfUserUseCase: ObserveLegalHoldForSelfUserUseCase
val observeLegalHoldForUserUseCase: ObserveLegalHoldStateForUserUseCase
) : ObserveLegalHoldChangeNotifiedForSelfUseCase {
@OptIn(ExperimentalCoroutinesApi::class)
override suspend fun invoke(): Flow<ObserveLegalHoldChangeNotifiedForSelfUseCase.Result> =
Expand All @@ -57,7 +59,7 @@ internal class ObserveLegalHoldChangeNotifiedForSelfUseCaseImpl internal constru
if (isNotified)
flowOf(ObserveLegalHoldChangeNotifiedForSelfUseCase.Result.AlreadyNotified)
else
observeLegalHoldForSelfUserUseCase()
observeLegalHoldForUserUseCase(selfUserId)
.map { legalHoldState ->
ObserveLegalHoldChangeNotifiedForSelfUseCase.Result.ShouldNotify(legalHoldState)
}
Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
/*
* Wire
* Copyright (C) 2024 Wire Swiss GmbH
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see http://www.gnu.org/licenses/.
*/
package com.wire.kalium.logic.feature.legalhold

import com.wire.kalium.logic.data.user.UserId
import com.wire.kalium.logic.feature.legalhold.ObserveLegalHoldRequestUseCase.Result.LegalHoldRequestAvailable
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.combine

/**
* Use case that allows to observe the legal hold state for the self user.
*/
interface ObserveLegalHoldStateForSelfUserUseCase {
suspend operator fun invoke(): Flow<LegalHoldStateForSelfUser>
}

internal class ObserveLegalHoldStateForSelfUserUseCaseImpl internal constructor(
private val selfUserId: UserId,
private val observeLegalHoldStateForUser: ObserveLegalHoldStateForUserUseCase,
private val observeLegalHoldRequestUseCase: ObserveLegalHoldRequestUseCase,
) : ObserveLegalHoldStateForSelfUserUseCase {
override suspend fun invoke(): Flow<LegalHoldStateForSelfUser> =
combine(
observeLegalHoldStateForUser(selfUserId),
observeLegalHoldRequestUseCase(),
) { legalHoldState, legalHoldRequest ->
when {
legalHoldState is LegalHoldState.Enabled -> LegalHoldStateForSelfUser.Enabled
legalHoldRequest is LegalHoldRequestAvailable -> LegalHoldStateForSelfUser.PendingRequest
else -> LegalHoldStateForSelfUser.Disabled
}
}
}

sealed class LegalHoldStateForSelfUser {
data object Enabled : LegalHoldStateForSelfUser()
data object Disabled : LegalHoldStateForSelfUser()
data object PendingRequest : LegalHoldStateForSelfUser()
}
Original file line number Diff line number Diff line change
Expand Up @@ -19,8 +19,10 @@ package com.wire.kalium.logic.feature.legalhold

import com.wire.kalium.logic.StorageFailure
import com.wire.kalium.logic.configuration.UserConfigRepository
import com.wire.kalium.logic.framework.TestUser
import com.wire.kalium.logic.functional.Either
import io.mockative.Mock
import io.mockative.any
import io.mockative.given
import io.mockative.mock
import kotlinx.coroutines.flow.first
Expand Down Expand Up @@ -82,18 +84,19 @@ class ObserveLegalHoldChangeNotifiedForSelfUseCaseTest {
)

private class Arrangement {
val selfUserId = TestUser.SELF.id
@Mock
val userConfigRepository = mock(UserConfigRepository::class)
@Mock
val observeLegalHoldForSelfUser = mock(ObserveLegalHoldForSelfUserUseCase::class)
val observeLegalHoldForUser = mock(ObserveLegalHoldStateForUserUseCase::class)
val useCase: ObserveLegalHoldChangeNotifiedForSelfUseCase =
ObserveLegalHoldChangeNotifiedForSelfUseCaseImpl(userConfigRepository, observeLegalHoldForSelfUser)
ObserveLegalHoldChangeNotifiedForSelfUseCaseImpl(selfUserId, userConfigRepository, observeLegalHoldForUser)

fun arrange() = this to useCase
fun withLegalHoldEnabledState(result: LegalHoldState) = apply {
given(observeLegalHoldForSelfUser)
.suspendFunction(observeLegalHoldForSelfUser::invoke)
.whenInvoked()
given(observeLegalHoldForUser)
.suspendFunction(observeLegalHoldForUser::invoke)
.whenInvokedWith(any())
.then { flowOf(result) }
}
fun withLegalHoldChangeNotified(result: Either<StorageFailure, Boolean>) = apply {
Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,114 @@
/*
* Wire
* Copyright (C) 2024 Wire Swiss GmbH
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see http://www.gnu.org/licenses/.
*/
package com.wire.kalium.logic.feature.legalhold

import com.wire.kalium.logic.framework.TestUser
import io.ktor.utils.io.core.toByteArray
import io.mockative.Mock
import io.mockative.eq
import io.mockative.given
import io.mockative.mock
import io.mockative.once
import io.mockative.verify
import kotlinx.coroutines.flow.first
import kotlinx.coroutines.flow.flowOf
import kotlinx.coroutines.test.runTest
import kotlin.test.Test
import kotlin.test.assertEquals

class ObserveLegalHoldStateForSelfUserUseCaseTest {

private fun testLegalHoldStateForSelfUser(
givenLegalHoldState: LegalHoldState,
givenLegalHoldRequestState: ObserveLegalHoldRequestUseCase.Result,
expected: LegalHoldStateForSelfUser
) = runTest {
// given
val (arrangement, useCase) = Arrangement()
.withLegalHoldState(givenLegalHoldState)
.withLegalHoldRequestState(givenLegalHoldRequestState)
.arrange()
// when
val result = useCase()
// then
assertEquals(expected, result.first())
verify(arrangement.observeLegalHoldStateForUser)
.suspendFunction(arrangement.observeLegalHoldStateForUser::invoke)
.with(eq(TestUser.SELF.id))
.wasInvoked(once)
verify(arrangement.observeLegalHoldRequestUseCase)
.function(arrangement.observeLegalHoldRequestUseCase::invoke)
.wasInvoked(once)
}

@Test
fun givenLegalHoldEnabled_whenStartingObservingForSelfUser_thenEmitEnabled() =
testLegalHoldStateForSelfUser(
givenLegalHoldState = LegalHoldState.Enabled,
givenLegalHoldRequestState = ObserveLegalHoldRequestUseCase.Result.NoLegalHoldRequest,
expected = LegalHoldStateForSelfUser.Enabled
)

@Test
fun givenLegalHoldRequestAvailable_whenStartingObservingForSelfUser_thenEmitRequestPending() =
testLegalHoldStateForSelfUser(
givenLegalHoldState = LegalHoldState.Disabled,
givenLegalHoldRequestState = ObserveLegalHoldRequestUseCase.Result.LegalHoldRequestAvailable("fingerprint".toByteArray()),
expected = LegalHoldStateForSelfUser.PendingRequest
)

@Test
fun givenLegalHoldDisabledAndNoRequestPending_whenStartingObservingForSelfUser_thenEmitDisabled() =
testLegalHoldStateForSelfUser(
givenLegalHoldState = LegalHoldState.Disabled,
givenLegalHoldRequestState = ObserveLegalHoldRequestUseCase.Result.NoLegalHoldRequest,
expected = LegalHoldStateForSelfUser.Disabled
)

class Arrangement {

@Mock
val observeLegalHoldStateForUser = mock(ObserveLegalHoldStateForUserUseCase::class)

@Mock
val observeLegalHoldRequestUseCase = mock(ObserveLegalHoldRequestUseCase::class)

private val observeLegalHoldForSelfUser: ObserveLegalHoldStateForSelfUserUseCase =
ObserveLegalHoldStateForSelfUserUseCaseImpl(
selfUserId = TestUser.SELF.id,
observeLegalHoldStateForUser = observeLegalHoldStateForUser,
observeLegalHoldRequestUseCase = observeLegalHoldRequestUseCase,
)

fun arrange() = this to observeLegalHoldForSelfUser

fun withLegalHoldState(result: LegalHoldState) = apply {
given(observeLegalHoldStateForUser)
.suspendFunction(observeLegalHoldStateForUser::invoke)
.whenInvokedWith(eq(TestUser.SELF.id))
.then { flowOf(result) }
}

fun withLegalHoldRequestState(result: ObserveLegalHoldRequestUseCase.Result) = apply {
given(observeLegalHoldRequestUseCase)
.function(observeLegalHoldRequestUseCase::invoke)
.whenInvoked()
.then { flowOf(result) }
}
}
}

0 comments on commit 65f9293

Please sign in to comment.