From 6b50e07b5c7855c7b46bcc6712dd601734a5c646 Mon Sep 17 00:00:00 2001 From: Mojtaba Chenani Date: Thu, 19 Sep 2024 14:47:37 +0200 Subject: [PATCH 1/4] Commit with unresolved merge conflicts --- .../logic/data/conversation/Conversation.kt | 4 +- .../conversation/ConversationRepository.kt | 3 +- .../JoinExistingMLSConversationUseCase.kt | 27 +++++++----- .../mls/MLSOneOnOneConversationResolver.kt | 2 +- ...JoinExistingMLSConversationsUseCaseTest.kt | 42 +++++++++++++++++++ .../conversation/ConversationResponse.kt | 11 +++++ .../api/v6/authenticated/ConversationApiV6.kt | 25 +++++++++++ 7 files changed, 100 insertions(+), 14 deletions(-) diff --git a/data/src/commonMain/kotlin/com/wire/kalium/logic/data/conversation/Conversation.kt b/data/src/commonMain/kotlin/com/wire/kalium/logic/data/conversation/Conversation.kt index 9e19076a14b..f5ede631496 100644 --- a/data/src/commonMain/kotlin/com/wire/kalium/logic/data/conversation/Conversation.kt +++ b/data/src/commonMain/kotlin/com/wire/kalium/logic/data/conversation/Conversation.kt @@ -30,6 +30,7 @@ import com.wire.kalium.logic.data.id.TeamId import com.wire.kalium.logic.data.message.MessagePreview import com.wire.kalium.logic.data.message.UnreadEventType import com.wire.kalium.logic.data.mls.CipherSuite +import com.wire.kalium.logic.data.mlspublickeys.MLSPublicKeys import com.wire.kalium.logic.data.user.OtherUser import com.wire.kalium.logic.data.user.User import com.wire.kalium.logic.data.user.UserId @@ -78,7 +79,8 @@ data class Conversation( val archivedDateTime: Instant?, val mlsVerificationStatus: VerificationStatus, val proteusVerificationStatus: VerificationStatus, - val legalHoldStatus: LegalHoldStatus + val legalHoldStatus: LegalHoldStatus, + val mlsPublicKeys: MLSPublicKeys? = null ) { companion object { diff --git a/logic/src/commonMain/kotlin/com/wire/kalium/logic/data/conversation/ConversationRepository.kt b/logic/src/commonMain/kotlin/com/wire/kalium/logic/data/conversation/ConversationRepository.kt index c8bc03a1879..8a814c255c9 100644 --- a/logic/src/commonMain/kotlin/com/wire/kalium/logic/data/conversation/ConversationRepository.kt +++ b/logic/src/commonMain/kotlin/com/wire/kalium/logic/data/conversation/ConversationRepository.kt @@ -508,6 +508,7 @@ internal class ConversationDataSource internal constructor( wrapApiRequest { conversationApi.fetchMlsOneToOneConversation(userId.toApi()) }.map { conversationResponse -> + // question: do we need to do this? since it's one on one! addOtherMemberIfMissing(conversationResponse, userId) }.flatMap { conversationResponse -> val selfUserTeamId = selfTeamIdProvider().getOrNull() @@ -516,7 +517,7 @@ internal class ConversationDataSource internal constructor( selfUserTeamId = selfUserTeamId ).map { conversationResponse } }.flatMap { response -> - baseInfoById(response.id.toModel()) + baseInfoById(response.id.toModel()).map { it.copy(mlsPublicKeys = conversationMapper.fromApiModel(response.publicKeys)) } } private fun addOtherMemberIfMissing( diff --git a/logic/src/commonMain/kotlin/com/wire/kalium/logic/data/conversation/JoinExistingMLSConversationUseCase.kt b/logic/src/commonMain/kotlin/com/wire/kalium/logic/data/conversation/JoinExistingMLSConversationUseCase.kt index 1b6157dc0f8..1ad0c6df76f 100644 --- a/logic/src/commonMain/kotlin/com/wire/kalium/logic/data/conversation/JoinExistingMLSConversationUseCase.kt +++ b/logic/src/commonMain/kotlin/com/wire/kalium/logic/data/conversation/JoinExistingMLSConversationUseCase.kt @@ -25,6 +25,7 @@ import com.wire.kalium.logic.StorageFailure import com.wire.kalium.logic.data.client.ClientRepository import com.wire.kalium.logic.data.id.ConversationId import com.wire.kalium.logic.data.id.toApi +import com.wire.kalium.logic.data.mlspublickeys.MLSPublicKeys import com.wire.kalium.logic.featureFlags.FeatureSupport import com.wire.kalium.logic.functional.Either import com.wire.kalium.logic.functional.flatMap @@ -51,7 +52,7 @@ import kotlinx.coroutines.withContext * but has not yet joined the corresponding MLS group. */ internal interface JoinExistingMLSConversationUseCase { - suspend operator fun invoke(conversationId: ConversationId): Either + suspend operator fun invoke(conversationId: ConversationId, mlsPublicKeys: MLSPublicKeys? = null): Either } @Suppress("LongParameterList") @@ -65,7 +66,7 @@ internal class JoinExistingMLSConversationUseCaseImpl( ) : JoinExistingMLSConversationUseCase { private val dispatcher = kaliumDispatcher.io - override suspend operator fun invoke(conversationId: ConversationId): Either = + override suspend operator fun invoke(conversationId: ConversationId, mlsPublicKeys: MLSPublicKeys?): Either = if (!featureSupport.isMLSSupported || !clientRepository.hasRegisteredMLSClient().getOrElse(false) ) { @@ -76,15 +77,16 @@ internal class JoinExistingMLSConversationUseCaseImpl( Either.Left(StorageFailure.DataNotFound) }, { conversation -> withContext(dispatcher) { - joinOrEstablishMLSGroupAndRetry(conversation) + joinOrEstablishMLSGroupAndRetry(conversation, mlsPublicKeys) } }) } private suspend fun joinOrEstablishMLSGroupAndRetry( - conversation: Conversation + conversation: Conversation, + mlsPublicKeys: MLSPublicKeys? ): Either = - joinOrEstablishMLSGroup(conversation) + joinOrEstablishMLSGroup(conversation, mlsPublicKeys) .flatMapLeft { failure -> if (failure is NetworkFailure.ServerMiscommunication && failure.kaliumException is KaliumException.InvalidRequestError) { if (failure.kaliumException.isMlsStaleMessage()) { @@ -101,13 +103,15 @@ internal class JoinExistingMLSConversationUseCaseImpl( // Re-fetch current epoch and try again if (conversation.type == Conversation.Type.ONE_ON_ONE) { conversationRepository.getConversationMembers(conversation.id).flatMap { - conversationRepository.fetchMlsOneToOneConversation(it.first()) + conversationRepository.fetchMlsOneToOneConversation(it.first()).map { + it.mlsPublicKeys + } } } else { - conversationRepository.fetchConversation(conversation.id) - }.flatMap { + conversationRepository.fetchConversation(conversation.id).map { null } + }.flatMap { publicKeys -> conversationRepository.baseInfoById(conversation.id).flatMap { conversation -> - joinOrEstablishMLSGroup(conversation) + joinOrEstablishMLSGroup(conversation, publicKeys) } } } else if (failure.kaliumException.isMlsMissingGroupInfo()) { @@ -122,7 +126,7 @@ internal class JoinExistingMLSConversationUseCaseImpl( } @Suppress("LongMethod") - private suspend fun joinOrEstablishMLSGroup(conversation: Conversation): Either { + private suspend fun joinOrEstablishMLSGroup(conversation: Conversation, publicKeys: MLSPublicKeys?): Either { val protocol = conversation.protocol val type = conversation.type return when { @@ -202,7 +206,8 @@ internal class JoinExistingMLSConversationUseCaseImpl( conversationRepository.getConversationMembers(conversation.id).flatMap { members -> mlsConversationRepository.establishMLSGroup( protocol.groupId, - members + members, + publicKeys ) }.onSuccess { kaliumLogger.logStructuredJson( diff --git a/logic/src/commonMain/kotlin/com/wire/kalium/logic/feature/conversation/mls/MLSOneOnOneConversationResolver.kt b/logic/src/commonMain/kotlin/com/wire/kalium/logic/feature/conversation/mls/MLSOneOnOneConversationResolver.kt index 2d0d945ea9d..53aadbd8a50 100644 --- a/logic/src/commonMain/kotlin/com/wire/kalium/logic/feature/conversation/mls/MLSOneOnOneConversationResolver.kt +++ b/logic/src/commonMain/kotlin/com/wire/kalium/logic/feature/conversation/mls/MLSOneOnOneConversationResolver.kt @@ -68,7 +68,7 @@ internal class MLSOneOnOneConversationResolverImpl( } else { kaliumLogger.d("Establishing mls group for one-on-one with ${userId.toLogString()}") conversationRepository.fetchMlsOneToOneConversation(userId).flatMap { conversation -> - joinExistingMLSConversationUseCase(conversation.id).map { conversation.id } + joinExistingMLSConversationUseCase(conversation.id, conversation.mlsPublicKeys).map { conversation.id } } } } diff --git a/logic/src/commonTest/kotlin/com/wire/kalium/logic/feature/conversation/JoinExistingMLSConversationsUseCaseTest.kt b/logic/src/commonTest/kotlin/com/wire/kalium/logic/feature/conversation/JoinExistingMLSConversationsUseCaseTest.kt index a64c53ab01d..ff93afe57d3 100644 --- a/logic/src/commonTest/kotlin/com/wire/kalium/logic/feature/conversation/JoinExistingMLSConversationsUseCaseTest.kt +++ b/logic/src/commonTest/kotlin/com/wire/kalium/logic/feature/conversation/JoinExistingMLSConversationsUseCaseTest.kt @@ -151,6 +151,7 @@ class JoinExistingMLSConversationsUseCaseTest { ) @Suppress("MaxLineLength") +<<<<<<< HEAD suspend fun withGetConversationsByGroupStateSuccessful( conversations: List = listOf(MLS_CONVERSATION1, MLS_CONVERSATION2) ) = apply { @@ -175,6 +176,47 @@ class JoinExistingMLSConversationsUseCaseTest { coEvery { joinExistingMLSConversationUseCase.invoke(any()) }.returns(Either.Left(CoreFailure.NotSupportedByProteus)) +======= + fun withGetConversationsByGroupStateSuccessful( + conversations: List = listOf( + MLS_CONVERSATION1, + MLS_CONVERSATION2 + ) + ) = + apply { + given(conversationRepository) + .suspendFunction(conversationRepository::getConversationsByGroupState) + .whenInvokedWith(anything()) + .then { Either.Right(conversations) } + } + + fun withJoinExistingMLSConversationSuccessful() = apply { + given(joinExistingMLSConversationUseCase) + .suspendFunction(joinExistingMLSConversationUseCase::invoke) + .whenInvokedWith(anything(), anything()) + .thenReturn(Either.Right(Unit)) + } + + fun withJoinExistingMLSConversationNetworkFailure() = apply { + given(joinExistingMLSConversationUseCase) + .suspendFunction(joinExistingMLSConversationUseCase::invoke) + .whenInvokedWith(anything(), anything()) + .thenReturn(Either.Left(NetworkFailure.NoNetworkConnection(null))) + } + + fun withJoinExistingMLSConversationFailure() = apply { + given(joinExistingMLSConversationUseCase) + .suspendFunction(joinExistingMLSConversationUseCase::invoke) + .whenInvokedWith(anything(), anything()) + .thenReturn(Either.Left(CoreFailure.NotSupportedByProteus)) + } + + fun withNoKeyPackagesAvailable() = apply { + given(joinExistingMLSConversationUseCase) + .suspendFunction(joinExistingMLSConversationUseCase::invoke) + .whenInvokedWith(anything(), anything()) + .thenReturn(Either.Left(CoreFailure.MissingKeyPackages(setOf()))) +>>>>>>> d491f958ba (fix(mls): fetch and set mls-removal keys for 1on1 conversations (#3020)) } suspend fun withNoKeyPackagesAvailable() = apply { diff --git a/network-model/src/commonMain/kotlin/com/wire/kalium/network/api/authenticated/conversation/ConversationResponse.kt b/network-model/src/commonMain/kotlin/com/wire/kalium/network/api/authenticated/conversation/ConversationResponse.kt index f296b9614c4..afbcde3c7e1 100644 --- a/network-model/src/commonMain/kotlin/com/wire/kalium/network/api/authenticated/conversation/ConversationResponse.kt +++ b/network-model/src/commonMain/kotlin/com/wire/kalium/network/api/authenticated/conversation/ConversationResponse.kt @@ -156,6 +156,17 @@ data class ConversationResponseV3( ) @Serializable +<<<<<<< HEAD:network-model/src/commonMain/kotlin/com/wire/kalium/network/api/authenticated/conversation/ConversationResponse.kt +======= +data class ConversationResponseV6( + @SerialName("conversation") + val conversation: ConversationResponse, + @SerialName("public_keys") + val publicKeys: MLSPublicKeysDTO +) + +@Serializable +>>>>>>> d491f958ba (fix(mls): fetch and set mls-removal keys for 1on1 conversations (#3020)):network/src/commonMain/kotlin/com/wire/kalium/network/api/base/authenticated/conversation/ConversationResponse.kt data class ConversationMembersResponse( @SerialName("self") val self: ConversationMemberDTO.Self, diff --git a/network/src/commonMain/kotlin/com/wire/kalium/network/api/v6/authenticated/ConversationApiV6.kt b/network/src/commonMain/kotlin/com/wire/kalium/network/api/v6/authenticated/ConversationApiV6.kt index bcdaa50c0a4..b21d824ef9e 100644 --- a/network/src/commonMain/kotlin/com/wire/kalium/network/api/v6/authenticated/ConversationApiV6.kt +++ b/network/src/commonMain/kotlin/com/wire/kalium/network/api/v6/authenticated/ConversationApiV6.kt @@ -19,8 +19,33 @@ package com.wire.kalium.network.api.v6.authenticated import com.wire.kalium.network.AuthenticatedNetworkClient +<<<<<<< HEAD import com.wire.kalium.network.api.v5.authenticated.ConversationApiV5 internal open class ConversationApiV6 internal constructor( authenticatedNetworkClient: AuthenticatedNetworkClient, ) : ConversationApiV5(authenticatedNetworkClient) +======= +import com.wire.kalium.network.api.base.authenticated.conversation.ConversationResponse +import com.wire.kalium.network.api.base.authenticated.conversation.ConversationResponseV6 +import com.wire.kalium.network.api.base.model.ApiModelMapper +import com.wire.kalium.network.api.base.model.ApiModelMapperImpl +import com.wire.kalium.network.api.base.model.UserId +import com.wire.kalium.network.api.v5.authenticated.ConversationApiV5 +import com.wire.kalium.network.utils.NetworkResponse +import com.wire.kalium.network.utils.mapSuccess +import com.wire.kalium.network.utils.wrapKaliumResponse +import io.ktor.client.request.get + +internal open class ConversationApiV6 internal constructor( + authenticatedNetworkClient: AuthenticatedNetworkClient, + private val apiModelMapper: ApiModelMapper = ApiModelMapperImpl() +) : ConversationApiV5(authenticatedNetworkClient) { + override suspend fun fetchMlsOneToOneConversation(userId: UserId): NetworkResponse = + wrapKaliumResponse { + httpClient.get("$PATH_CONVERSATIONS/$PATH_ONE_TO_ONE/${userId.domain}/${userId.value}") + }.mapSuccess { + apiModelMapper.fromApiV6(it) + } +} +>>>>>>> d491f958ba (fix(mls): fetch and set mls-removal keys for 1on1 conversations (#3020)) From 8ce1daaed46ed0d2522ecd948701d13c3c708185 Mon Sep 17 00:00:00 2001 From: Mohamad Jaara Date: Thu, 26 Sep 2024 15:39:47 +0200 Subject: [PATCH 2/4] fix merge conflicts --- .../logic/data/conversation/Conversation.kt | 2 +- .../kalium/logic/data/mls/MLSPublicKeys.kt | 22 ++++++++ .../data/conversation/ConversationMapper.kt | 2 +- .../JoinExistingMLSConversationUseCase.kt | 2 +- .../conversation/MLSConversationRepository.kt | 2 +- .../mlspublickeys/MLSPublicKeysRepository.kt | 5 +- ...JoinExistingMLSConversationsUseCaseTest.kt | 50 ++----------------- .../api/v6/authenticated/ConversationApiV6.kt | 12 ++--- 8 files changed, 36 insertions(+), 61 deletions(-) create mode 100644 data/src/commonMain/kotlin/com/wire/kalium/logic/data/mls/MLSPublicKeys.kt diff --git a/data/src/commonMain/kotlin/com/wire/kalium/logic/data/conversation/Conversation.kt b/data/src/commonMain/kotlin/com/wire/kalium/logic/data/conversation/Conversation.kt index f5ede631496..63343cc3d8a 100644 --- a/data/src/commonMain/kotlin/com/wire/kalium/logic/data/conversation/Conversation.kt +++ b/data/src/commonMain/kotlin/com/wire/kalium/logic/data/conversation/Conversation.kt @@ -30,7 +30,7 @@ import com.wire.kalium.logic.data.id.TeamId import com.wire.kalium.logic.data.message.MessagePreview import com.wire.kalium.logic.data.message.UnreadEventType import com.wire.kalium.logic.data.mls.CipherSuite -import com.wire.kalium.logic.data.mlspublickeys.MLSPublicKeys +import com.wire.kalium.logic.data.mls.MLSPublicKeys import com.wire.kalium.logic.data.user.OtherUser import com.wire.kalium.logic.data.user.User import com.wire.kalium.logic.data.user.UserId diff --git a/data/src/commonMain/kotlin/com/wire/kalium/logic/data/mls/MLSPublicKeys.kt b/data/src/commonMain/kotlin/com/wire/kalium/logic/data/mls/MLSPublicKeys.kt new file mode 100644 index 00000000000..0475345d7fd --- /dev/null +++ b/data/src/commonMain/kotlin/com/wire/kalium/logic/data/mls/MLSPublicKeys.kt @@ -0,0 +1,22 @@ +/* + * 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.data.mls + +data class MLSPublicKeys( + val removal: Map? +) diff --git a/logic/src/commonMain/kotlin/com/wire/kalium/logic/data/conversation/ConversationMapper.kt b/logic/src/commonMain/kotlin/com/wire/kalium/logic/data/conversation/ConversationMapper.kt index 2786c8704a7..2bfadabf5ee 100644 --- a/logic/src/commonMain/kotlin/com/wire/kalium/logic/data/conversation/ConversationMapper.kt +++ b/logic/src/commonMain/kotlin/com/wire/kalium/logic/data/conversation/ConversationMapper.kt @@ -28,7 +28,7 @@ import com.wire.kalium.logic.data.id.toApi import com.wire.kalium.logic.data.id.toDao import com.wire.kalium.logic.data.id.toModel import com.wire.kalium.logic.data.message.MessagePreview -import com.wire.kalium.logic.data.mlspublickeys.MLSPublicKeys +import com.wire.kalium.logic.data.mls.MLSPublicKeys import com.wire.kalium.logic.data.user.AvailabilityStatusMapper import com.wire.kalium.logic.data.user.BotService import com.wire.kalium.logic.data.user.Connection diff --git a/logic/src/commonMain/kotlin/com/wire/kalium/logic/data/conversation/JoinExistingMLSConversationUseCase.kt b/logic/src/commonMain/kotlin/com/wire/kalium/logic/data/conversation/JoinExistingMLSConversationUseCase.kt index 1ad0c6df76f..f82415687d8 100644 --- a/logic/src/commonMain/kotlin/com/wire/kalium/logic/data/conversation/JoinExistingMLSConversationUseCase.kt +++ b/logic/src/commonMain/kotlin/com/wire/kalium/logic/data/conversation/JoinExistingMLSConversationUseCase.kt @@ -25,7 +25,7 @@ import com.wire.kalium.logic.StorageFailure import com.wire.kalium.logic.data.client.ClientRepository import com.wire.kalium.logic.data.id.ConversationId import com.wire.kalium.logic.data.id.toApi -import com.wire.kalium.logic.data.mlspublickeys.MLSPublicKeys +import com.wire.kalium.logic.data.mls.MLSPublicKeys import com.wire.kalium.logic.featureFlags.FeatureSupport import com.wire.kalium.logic.functional.Either import com.wire.kalium.logic.functional.flatMap diff --git a/logic/src/commonMain/kotlin/com/wire/kalium/logic/data/conversation/MLSConversationRepository.kt b/logic/src/commonMain/kotlin/com/wire/kalium/logic/data/conversation/MLSConversationRepository.kt index d3e2e458fbc..c6e8c608c27 100644 --- a/logic/src/commonMain/kotlin/com/wire/kalium/logic/data/conversation/MLSConversationRepository.kt +++ b/logic/src/commonMain/kotlin/com/wire/kalium/logic/data/conversation/MLSConversationRepository.kt @@ -45,12 +45,12 @@ import com.wire.kalium.logic.data.id.toModel import com.wire.kalium.logic.data.keypackage.KeyPackageLimitsProvider import com.wire.kalium.logic.data.keypackage.KeyPackageRepository import com.wire.kalium.logic.data.mls.CipherSuite -import com.wire.kalium.logic.data.mlspublickeys.MLSPublicKeys import com.wire.kalium.logic.data.mlspublickeys.MLSPublicKeysRepository import com.wire.kalium.logic.data.mlspublickeys.getRemovalKey import com.wire.kalium.logic.data.user.UserId import com.wire.kalium.logic.di.MapperProvider import com.wire.kalium.logic.data.e2ei.RevocationListChecker +import com.wire.kalium.logic.data.mls.MLSPublicKeys import com.wire.kalium.logic.functional.Either import com.wire.kalium.logic.functional.flatMap import com.wire.kalium.logic.functional.flatMapLeft diff --git a/logic/src/commonMain/kotlin/com/wire/kalium/logic/data/mlspublickeys/MLSPublicKeysRepository.kt b/logic/src/commonMain/kotlin/com/wire/kalium/logic/data/mlspublickeys/MLSPublicKeysRepository.kt index 180c506a838..a54389074d1 100644 --- a/logic/src/commonMain/kotlin/com/wire/kalium/logic/data/mlspublickeys/MLSPublicKeysRepository.kt +++ b/logic/src/commonMain/kotlin/com/wire/kalium/logic/data/mlspublickeys/MLSPublicKeysRepository.kt @@ -21,6 +21,7 @@ package com.wire.kalium.logic.data.mlspublickeys import com.wire.kalium.logic.CoreFailure import com.wire.kalium.logic.MLSFailure import com.wire.kalium.logic.data.mls.CipherSuite +import com.wire.kalium.logic.data.mls.MLSPublicKeys import com.wire.kalium.logic.di.MapperProvider import com.wire.kalium.logic.functional.Either import com.wire.kalium.logic.functional.flatMap @@ -30,10 +31,6 @@ import com.wire.kalium.logic.wrapApiRequest import com.wire.kalium.network.api.base.authenticated.serverpublickey.MLSPublicKeyApi import io.ktor.util.decodeBase64Bytes -data class MLSPublicKeys( - val removal: Map? -) - fun MLSPublicKeys.getRemovalKey(cipherSuite: CipherSuite): Either { val mlsPublicKeysMapper: MLSPublicKeysMapper = MapperProvider.mlsPublicKeyMapper() val keySignature = mlsPublicKeysMapper.fromCipherSuite(cipherSuite) diff --git a/logic/src/commonTest/kotlin/com/wire/kalium/logic/feature/conversation/JoinExistingMLSConversationsUseCaseTest.kt b/logic/src/commonTest/kotlin/com/wire/kalium/logic/feature/conversation/JoinExistingMLSConversationsUseCaseTest.kt index ff93afe57d3..5e72dfbc8c3 100644 --- a/logic/src/commonTest/kotlin/com/wire/kalium/logic/feature/conversation/JoinExistingMLSConversationsUseCaseTest.kt +++ b/logic/src/commonTest/kotlin/com/wire/kalium/logic/feature/conversation/JoinExistingMLSConversationsUseCaseTest.kt @@ -151,7 +151,6 @@ class JoinExistingMLSConversationsUseCaseTest { ) @Suppress("MaxLineLength") -<<<<<<< HEAD suspend fun withGetConversationsByGroupStateSuccessful( conversations: List = listOf(MLS_CONVERSATION1, MLS_CONVERSATION2) ) = apply { @@ -162,66 +161,25 @@ class JoinExistingMLSConversationsUseCaseTest { suspend fun withJoinExistingMLSConversationSuccessful() = apply { coEvery { - joinExistingMLSConversationUseCase.invoke(any()) + joinExistingMLSConversationUseCase.invoke(any(), any()) }.returns(Either.Right(Unit)) } suspend fun withJoinExistingMLSConversationNetworkFailure() = apply { coEvery { - joinExistingMLSConversationUseCase.invoke(any()) + joinExistingMLSConversationUseCase.invoke(any(), any()) }.returns(Either.Left(NetworkFailure.NoNetworkConnection(null))) } suspend fun withJoinExistingMLSConversationFailure() = apply { coEvery { - joinExistingMLSConversationUseCase.invoke(any()) + joinExistingMLSConversationUseCase.invoke(any(), any()) }.returns(Either.Left(CoreFailure.NotSupportedByProteus)) -======= - fun withGetConversationsByGroupStateSuccessful( - conversations: List = listOf( - MLS_CONVERSATION1, - MLS_CONVERSATION2 - ) - ) = - apply { - given(conversationRepository) - .suspendFunction(conversationRepository::getConversationsByGroupState) - .whenInvokedWith(anything()) - .then { Either.Right(conversations) } - } - - fun withJoinExistingMLSConversationSuccessful() = apply { - given(joinExistingMLSConversationUseCase) - .suspendFunction(joinExistingMLSConversationUseCase::invoke) - .whenInvokedWith(anything(), anything()) - .thenReturn(Either.Right(Unit)) - } - - fun withJoinExistingMLSConversationNetworkFailure() = apply { - given(joinExistingMLSConversationUseCase) - .suspendFunction(joinExistingMLSConversationUseCase::invoke) - .whenInvokedWith(anything(), anything()) - .thenReturn(Either.Left(NetworkFailure.NoNetworkConnection(null))) - } - - fun withJoinExistingMLSConversationFailure() = apply { - given(joinExistingMLSConversationUseCase) - .suspendFunction(joinExistingMLSConversationUseCase::invoke) - .whenInvokedWith(anything(), anything()) - .thenReturn(Either.Left(CoreFailure.NotSupportedByProteus)) - } - - fun withNoKeyPackagesAvailable() = apply { - given(joinExistingMLSConversationUseCase) - .suspendFunction(joinExistingMLSConversationUseCase::invoke) - .whenInvokedWith(anything(), anything()) - .thenReturn(Either.Left(CoreFailure.MissingKeyPackages(setOf()))) ->>>>>>> d491f958ba (fix(mls): fetch and set mls-removal keys for 1on1 conversations (#3020)) } suspend fun withNoKeyPackagesAvailable() = apply { coEvery { - joinExistingMLSConversationUseCase.invoke(any()) + joinExistingMLSConversationUseCase.invoke(any(), any()) }.returns(Either.Left(CoreFailure.MissingKeyPackages(setOf()))) } diff --git a/network/src/commonMain/kotlin/com/wire/kalium/network/api/v6/authenticated/ConversationApiV6.kt b/network/src/commonMain/kotlin/com/wire/kalium/network/api/v6/authenticated/ConversationApiV6.kt index 49d3a189560..9ab818bb241 100644 --- a/network/src/commonMain/kotlin/com/wire/kalium/network/api/v6/authenticated/ConversationApiV6.kt +++ b/network/src/commonMain/kotlin/com/wire/kalium/network/api/v6/authenticated/ConversationApiV6.kt @@ -19,14 +19,12 @@ package com.wire.kalium.network.api.v6.authenticated import com.wire.kalium.network.AuthenticatedNetworkClient +import com.wire.kalium.network.api.authenticated.conversation.ConversationResponse +import com.wire.kalium.network.api.authenticated.conversation.ConversationResponseV6 import com.wire.kalium.network.api.v5.authenticated.ConversationApiV5 - -import com.wire.kalium.network.api.base.authenticated.conversation.ConversationResponse -import com.wire.kalium.network.api.base.authenticated.conversation.ConversationResponseV6 -import com.wire.kalium.network.api.base.model.ApiModelMapper -import com.wire.kalium.network.api.base.model.ApiModelMapperImpl -import com.wire.kalium.network.api.base.model.UserId -import com.wire.kalium.network.api.v5.authenticated.ConversationApiV5 +import com.wire.kalium.network.api.model.ApiModelMapper +import com.wire.kalium.network.api.model.ApiModelMapperImpl +import com.wire.kalium.network.api.model.UserId import com.wire.kalium.network.utils.NetworkResponse import com.wire.kalium.network.utils.mapSuccess import com.wire.kalium.network.utils.wrapKaliumResponse From 10ca559a9f78660e4596582d8d99a78d4d72dd24 Mon Sep 17 00:00:00 2001 From: Mohamad Jaara Date: Thu, 26 Sep 2024 17:38:56 +0200 Subject: [PATCH 3/4] fix merge conflicts --- .../ConversationGroupRepositoryTest.kt | 23 +++++++++++-------- .../MLSConversationRepositoryTest.kt | 2 +- ...JoinExistingMLSConversationsUseCaseTest.kt | 12 +++++----- .../RecoverMLSConversationsUseCaseTests.kt | 14 +++++------ .../MLSOneOnOneConversationResolverTest.kt | 4 ++-- .../feature/message/StaleEpochVerifierTest.kt | 4 ++-- ...istingMLSConversationUseCaseArrangement.kt | 2 +- 7 files changed, 33 insertions(+), 28 deletions(-) diff --git a/logic/src/commonTest/kotlin/com/wire/kalium/logic/data/conversation/ConversationGroupRepositoryTest.kt b/logic/src/commonTest/kotlin/com/wire/kalium/logic/data/conversation/ConversationGroupRepositoryTest.kt index 47b9c3ed866..efd77410026 100644 --- a/logic/src/commonTest/kotlin/com/wire/kalium/logic/data/conversation/ConversationGroupRepositoryTest.kt +++ b/logic/src/commonTest/kotlin/com/wire/kalium/logic/data/conversation/ConversationGroupRepositoryTest.kt @@ -905,7 +905,10 @@ class ConversationGroupRepositoryTest { }.wasInvoked(exactly = once) coVerify { - arrangement.joinExistingMLSConversation.invoke(eq(ADD_MEMBER_TO_CONVERSATION_SUCCESSFUL_RESPONSE.event.qualifiedConversation.toModel())) + arrangement.joinExistingMLSConversation.invoke( + ADD_MEMBER_TO_CONVERSATION_SUCCESSFUL_RESPONSE.event.qualifiedConversation.toModel(), + null + ) }.wasInvoked(exactly = once) coVerify { @@ -950,7 +953,10 @@ class ConversationGroupRepositoryTest { }.wasInvoked(exactly = once) coVerify { - arrangement.joinExistingMLSConversation.invoke(eq(ADD_MEMBER_TO_CONVERSATION_SUCCESSFUL_RESPONSE.event.qualifiedConversation.toModel())) + arrangement.joinExistingMLSConversation.invoke( + ADD_MEMBER_TO_CONVERSATION_SUCCESSFUL_RESPONSE.event.qualifiedConversation.toModel(), + null + ) }.wasInvoked(exactly = once) coVerify { @@ -1282,9 +1288,10 @@ class ConversationGroupRepositoryTest { @Test fun givenAConversationFailsWithUnreachableAndNotFromUsersInRequest_whenAddingMembers_thenRetryIsNotExecutedAndCreateSysMessage() = runTest { + val conversation = TestConversation.CONVERSATION.copy(id = ConversationId("valueConvo", "domainConvo")) // given val (arrangement, conversationGroupRepository) = Arrangement() - .withConversationDetailsById(TestConversation.CONVERSATION) + .withConversationDetailsById(conversation) .withProtocolInfoById(PROTEUS_PROTOCOL_INFO) .withFetchUsersIfUnknownByIdsSuccessful() .withAddMemberAPIFailsFirstWithUnreachableThenSucceed( @@ -1309,11 +1316,9 @@ class ConversationGroupRepositoryTest { coVerify { arrangement.newGroupConversationSystemMessagesCreator.conversationFailedToAddMembers( - conversationId = any(), - userIdList = matches { - it.containsAll(expectedInitialUsersNotFromUnreachableInformed) - }, - type = any() + conversationId = conversation.id, + userIdList = expectedInitialUsersNotFromUnreachableInformed, + type = MessageContent.MemberChange.FailedToAdd.Type.Federation ) }.wasInvoked(once) } @@ -1772,7 +1777,7 @@ class ConversationGroupRepositoryTest { suspend fun withJoinExistingMlsConversationSucceeds() = apply { coEvery { - joinExistingMLSConversation.invoke(any()) + joinExistingMLSConversation.invoke(any(), any()) }.returns(Either.Right(Unit)) } diff --git a/logic/src/commonTest/kotlin/com/wire/kalium/logic/data/conversation/MLSConversationRepositoryTest.kt b/logic/src/commonTest/kotlin/com/wire/kalium/logic/data/conversation/MLSConversationRepositoryTest.kt index 52ab07b042b..dac38b1d1cf 100644 --- a/logic/src/commonTest/kotlin/com/wire/kalium/logic/data/conversation/MLSConversationRepositoryTest.kt +++ b/logic/src/commonTest/kotlin/com/wire/kalium/logic/data/conversation/MLSConversationRepositoryTest.kt @@ -54,7 +54,7 @@ import com.wire.kalium.logic.data.id.toCrypto import com.wire.kalium.logic.data.keypackage.KeyPackageLimitsProvider import com.wire.kalium.logic.data.keypackage.KeyPackageRepository import com.wire.kalium.logic.data.mls.CipherSuite -import com.wire.kalium.logic.data.mlspublickeys.MLSPublicKeys +import com.wire.kalium.logic.data.mls.MLSPublicKeys import com.wire.kalium.logic.data.mlspublickeys.MLSPublicKeysRepository import com.wire.kalium.logic.data.user.UserId import com.wire.kalium.logic.framework.TestClient diff --git a/logic/src/commonTest/kotlin/com/wire/kalium/logic/feature/conversation/JoinExistingMLSConversationsUseCaseTest.kt b/logic/src/commonTest/kotlin/com/wire/kalium/logic/feature/conversation/JoinExistingMLSConversationsUseCaseTest.kt index 5e72dfbc8c3..cb8c5d17438 100644 --- a/logic/src/commonTest/kotlin/com/wire/kalium/logic/feature/conversation/JoinExistingMLSConversationsUseCaseTest.kt +++ b/logic/src/commonTest/kotlin/com/wire/kalium/logic/feature/conversation/JoinExistingMLSConversationsUseCaseTest.kt @@ -60,7 +60,7 @@ class JoinExistingMLSConversationsUseCaseTest { }.wasNotInvoked() coVerify { - arrangement.joinExistingMLSConversationUseCase.invoke(any()) + arrangement.joinExistingMLSConversationUseCase.invoke(any(), any()) }.wasNotInvoked() } @@ -76,7 +76,7 @@ class JoinExistingMLSConversationsUseCaseTest { }.wasNotInvoked() coVerify { - arrangement.joinExistingMLSConversationUseCase.invoke(any()) + arrangement.joinExistingMLSConversationUseCase.invoke(any(), any()) }.wasNotInvoked() } @@ -88,7 +88,7 @@ class JoinExistingMLSConversationsUseCaseTest { joinExistingMLSConversationsUseCase().shouldSucceed() coVerify { - arrangement.joinExistingMLSConversationUseCase.invoke(any()) + arrangement.joinExistingMLSConversationUseCase.invoke(any(), any()) }.wasInvoked(twice) } @@ -100,7 +100,7 @@ class JoinExistingMLSConversationsUseCaseTest { joinExistingMLSConversationsUseCase().shouldSucceed() coVerify { - arrangement.joinExistingMLSConversationUseCase.invoke(any()) + arrangement.joinExistingMLSConversationUseCase.invoke(any(), any()) }.wasInvoked(twice) } @@ -113,7 +113,7 @@ class JoinExistingMLSConversationsUseCaseTest { assertIs(it) } coVerify { - arrangement.joinExistingMLSConversationUseCase.invoke(any()) + arrangement.joinExistingMLSConversationUseCase.invoke(any(), any()) }.wasInvoked(twice) } @@ -125,7 +125,7 @@ class JoinExistingMLSConversationsUseCaseTest { joinExistingMLSConversationsUseCase().shouldSucceed() coVerify { - arrangement.joinExistingMLSConversationUseCase.invoke(any()) + arrangement.joinExistingMLSConversationUseCase.invoke(any(), any()) }.wasInvoked(twice) } diff --git a/logic/src/commonTest/kotlin/com/wire/kalium/logic/feature/conversation/RecoverMLSConversationsUseCaseTests.kt b/logic/src/commonTest/kotlin/com/wire/kalium/logic/feature/conversation/RecoverMLSConversationsUseCaseTests.kt index cacb405ccd6..3f446c83eb6 100644 --- a/logic/src/commonTest/kotlin/com/wire/kalium/logic/feature/conversation/RecoverMLSConversationsUseCaseTests.kt +++ b/logic/src/commonTest/kotlin/com/wire/kalium/logic/feature/conversation/RecoverMLSConversationsUseCaseTests.kt @@ -64,7 +64,7 @@ class RecoverMLSConversationsUseCaseTests { }.wasInvoked(conversations.size) coVerify { - arrangement.joinExistingMLSConversationUseCase.invoke(any()) + arrangement.joinExistingMLSConversationUseCase.invoke(any(), any()) }.wasInvoked(conversations.size) assertIs(actual) @@ -88,7 +88,7 @@ class RecoverMLSConversationsUseCaseTests { }.wasInvoked(conversations.size) coVerify { - arrangement.joinExistingMLSConversationUseCase.invoke(any()) + arrangement.joinExistingMLSConversationUseCase.invoke(any(), any()) }.wasInvoked(conversations.size) assertIs(actual) @@ -112,7 +112,7 @@ class RecoverMLSConversationsUseCaseTests { }.wasNotInvoked() coVerify { - arrangement.joinExistingMLSConversationUseCase.invoke(any()) + arrangement.joinExistingMLSConversationUseCase.invoke(any(), any()) }.wasNotInvoked() assertIs(actual) @@ -136,7 +136,7 @@ class RecoverMLSConversationsUseCaseTests { }.wasInvoked(twice) coVerify { - arrangement.joinExistingMLSConversationUseCase.invoke(any()) + arrangement.joinExistingMLSConversationUseCase.invoke(any(), any()) }.wasInvoked(once) assertIs(actual) @@ -205,7 +205,7 @@ class RecoverMLSConversationsUseCaseTests { suspend fun withJoinExistingMLSConversationUseCaseSuccessful() = apply { coEvery { - joinExistingMLSConversationUseCase.invoke(any()) + joinExistingMLSConversationUseCase.invoke(any(), any()) }.returns(Either.Right(Unit)) } @@ -226,10 +226,10 @@ class RecoverMLSConversationsUseCaseTests { suspend fun withJoinExistingMLSConversationUseCaseFailsFor(failedGroupId: ConversationId) = apply { coEvery { - joinExistingMLSConversationUseCase.invoke(eq(failedGroupId)) + joinExistingMLSConversationUseCase.invoke(failedGroupId, null) }.returns(Either.Left(StorageFailure.DataNotFound)) coEvery { - joinExistingMLSConversationUseCase.invoke(matches { it != failedGroupId }) + joinExistingMLSConversationUseCase.invoke(matches { it != failedGroupId }, any()) }.returns(Either.Right(Unit)) } diff --git a/logic/src/commonTest/kotlin/com/wire/kalium/logic/feature/conversation/mls/MLSOneOnOneConversationResolverTest.kt b/logic/src/commonTest/kotlin/com/wire/kalium/logic/feature/conversation/mls/MLSOneOnOneConversationResolverTest.kt index 460a3ead111..28162df0d20 100644 --- a/logic/src/commonTest/kotlin/com/wire/kalium/logic/feature/conversation/mls/MLSOneOnOneConversationResolverTest.kt +++ b/logic/src/commonTest/kotlin/com/wire/kalium/logic/feature/conversation/mls/MLSOneOnOneConversationResolverTest.kt @@ -72,7 +72,7 @@ class MLSOneOnOneConversationResolverTest { }.wasNotInvoked() coVerify { - arrangement.joinExistingMLSConversationUseCase.invoke(any()) + arrangement.joinExistingMLSConversationUseCase.invoke(any(), any()) }.wasNotInvoked() } @@ -127,7 +127,7 @@ class MLSOneOnOneConversationResolverTest { } coVerify { - arrangement.joinExistingMLSConversationUseCase.invoke(any()) + arrangement.joinExistingMLSConversationUseCase.invoke(any(), any()) }.wasInvoked(exactly = once) } diff --git a/logic/src/commonTest/kotlin/com/wire/kalium/logic/feature/message/StaleEpochVerifierTest.kt b/logic/src/commonTest/kotlin/com/wire/kalium/logic/feature/message/StaleEpochVerifierTest.kt index 0c7d12aed83..b1bc573e67e 100644 --- a/logic/src/commonTest/kotlin/com/wire/kalium/logic/feature/message/StaleEpochVerifierTest.kt +++ b/logic/src/commonTest/kotlin/com/wire/kalium/logic/feature/message/StaleEpochVerifierTest.kt @@ -79,7 +79,7 @@ class StaleEpochVerifierTest { staleEpochHandler.verifyEpoch(CONVERSATION_ID).shouldSucceed() coVerify { - arrangement.joinExistingMLSConversationUseCase.invoke(eq(CONVERSATION_ID)) + arrangement.joinExistingMLSConversationUseCase.invoke(CONVERSATION_ID, null) }.wasNotInvoked() } @@ -96,7 +96,7 @@ class StaleEpochVerifierTest { staleEpochHandler.verifyEpoch(CONVERSATION_ID).shouldSucceed() coVerify { - arrangement.joinExistingMLSConversationUseCase.invoke(eq(CONVERSATION_ID)) + arrangement.joinExistingMLSConversationUseCase.invoke(CONVERSATION_ID, null) }.wasInvoked(once) } diff --git a/logic/src/commonTest/kotlin/com/wire/kalium/logic/util/arrangement/usecase/JoinExistingMLSConversationUseCaseArrangement.kt b/logic/src/commonTest/kotlin/com/wire/kalium/logic/util/arrangement/usecase/JoinExistingMLSConversationUseCaseArrangement.kt index 0010718bf6f..95ced3aa0e6 100644 --- a/logic/src/commonTest/kotlin/com/wire/kalium/logic/util/arrangement/usecase/JoinExistingMLSConversationUseCaseArrangement.kt +++ b/logic/src/commonTest/kotlin/com/wire/kalium/logic/util/arrangement/usecase/JoinExistingMLSConversationUseCaseArrangement.kt @@ -39,7 +39,7 @@ internal class JoinExistingMLSConversationUseCaseArrangementImpl : JoinExistingM override suspend fun withJoinExistingMLSConversationUseCaseReturning(result: Either) { coEvery { - joinExistingMLSConversationUseCase.invoke(any()) + joinExistingMLSConversationUseCase.invoke(any(), any()) }.returns(result) } } From 5531410602b0586c3d4fad096f8a4f9bc4f169b7 Mon Sep 17 00:00:00 2001 From: Mohamad Jaara Date: Thu, 26 Sep 2024 17:43:31 +0200 Subject: [PATCH 4/4] detekt --- .../kalium/logic/data/conversation/ConversationRepository.kt | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/logic/src/commonMain/kotlin/com/wire/kalium/logic/data/conversation/ConversationRepository.kt b/logic/src/commonMain/kotlin/com/wire/kalium/logic/data/conversation/ConversationRepository.kt index 8a814c255c9..a5865374313 100644 --- a/logic/src/commonMain/kotlin/com/wire/kalium/logic/data/conversation/ConversationRepository.kt +++ b/logic/src/commonMain/kotlin/com/wire/kalium/logic/data/conversation/ConversationRepository.kt @@ -517,7 +517,9 @@ internal class ConversationDataSource internal constructor( selfUserTeamId = selfUserTeamId ).map { conversationResponse } }.flatMap { response -> - baseInfoById(response.id.toModel()).map { it.copy(mlsPublicKeys = conversationMapper.fromApiModel(response.publicKeys)) } + baseInfoById(response.id.toModel()).map { + it.copy(mlsPublicKeys = conversationMapper.fromApiModel(response.publicKeys)) + } } private fun addOtherMemberIfMissing(