diff --git a/logic/src/commonMain/kotlin/com/wire/kalium/logic/feature/message/RetryFailedMessageUseCase.kt b/logic/src/commonMain/kotlin/com/wire/kalium/logic/feature/message/RetryFailedMessageUseCase.kt index 1d11875af1..e95424de10 100644 --- a/logic/src/commonMain/kotlin/com/wire/kalium/logic/feature/message/RetryFailedMessageUseCase.kt +++ b/logic/src/commonMain/kotlin/com/wire/kalium/logic/feature/message/RetryFailedMessageUseCase.kt @@ -178,7 +178,10 @@ class RetryFailedMessageUseCase internal constructor( else -> handleError("Asset message with transfer status $assetTransferStatus cannot be retried") } - .onSuccess { retrySendingMessage(it) } + .onSuccess { + updateAssetMessageTransferStatus(AssetTransferStatus.UPLOADED, message.conversationId, message.id) + retrySendingMessage(it) + } .map { /* returns Unit */ } } diff --git a/logic/src/commonTest/kotlin/com/wire/kalium/logic/feature/message/RetryFailedMessageUseCaseTest.kt b/logic/src/commonTest/kotlin/com/wire/kalium/logic/feature/message/RetryFailedMessageUseCaseTest.kt index 998ca1eaa0..885b586b29 100644 --- a/logic/src/commonTest/kotlin/com/wire/kalium/logic/feature/message/RetryFailedMessageUseCaseTest.kt +++ b/logic/src/commonTest/kotlin/com/wire/kalium/logic/feature/message/RetryFailedMessageUseCaseTest.kt @@ -159,6 +159,38 @@ class RetryFailedMessageUseCaseTest { }.wasInvoked(exactly = once) } + @Test + fun givenAValidFailedAndNotUploadedAssetMessage_whenSuccessfullyUploadedAsset_thenAssetTransferShouldBeChangedToUploaded() = + runTest(testDispatcher.default) { + // given + val name = "some_asset.txt" + val content = MessageContent.Asset(ASSET_CONTENT.value.copy(name = name)) + val path = fakeKaliumFileSystem.providePersistentAssetPath(name) + val message = assetMessage().copy(content = content, status = Message.Status.Failed) + val uploadedAssetId = UploadedAssetId("remote_key", "remote_domain", "remote_token") + val uploadedAssetSha = SHA256Key(byteArrayOf()) + val (arrangement, useCase) = Arrangement() + .withGetMessageById(Either.Right(message)) + .withUpdateMessageStatus(Either.Right(Unit)) + .withUpdateAssetMessageTransferStatus(UpdateTransferStatusResult.Success) + .withFetchPrivateDecodedAsset(Either.Right(path)) + .withStoredData(mockedLongAssetData(), path) + .withGetAssetMessageTransferStatus(AssetTransferStatus.FAILED_UPLOAD) + .withUploadAndPersistPrivateAsset(Either.Right(uploadedAssetId to uploadedAssetSha)) + .withPersistMessage(Either.Right(Unit)) + .withSendMessage(Either.Right(Unit)) + .arrange() + + // when + useCase.invoke(message.id, message.conversationId) + advanceUntilIdle() + + // then + coVerify { + arrangement.updateAssetMessageTransferStatus.invoke(AssetTransferStatus.UPLOADED, message.conversationId, message.id) + }.wasInvoked(exactly = once) + } + @Test fun givenAValidFailedAndNotUploadedAssetMessage_whenRetryingFailedMessage_thenUploadAssetAndSendAMessageWithProperAssetRemoteData() = runTest(testDispatcher.default) {