diff --git a/logic/src/commonMain/kotlin/com/wire/kalium/logic/data/conversation/folders/ConversationFolderRepository.kt b/logic/src/commonMain/kotlin/com/wire/kalium/logic/data/conversation/folders/ConversationFolderRepository.kt index 4357881f20..2d0854a1d3 100644 --- a/logic/src/commonMain/kotlin/com/wire/kalium/logic/data/conversation/folders/ConversationFolderRepository.kt +++ b/logic/src/commonMain/kotlin/com/wire/kalium/logic/data/conversation/folders/ConversationFolderRepository.kt @@ -47,6 +47,7 @@ import com.wire.kalium.network.exceptions.KaliumException import com.wire.kalium.persistence.dao.conversation.folder.ConversationFolderDAO import io.ktor.http.HttpStatusCode import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.first import kotlinx.coroutines.flow.map internal interface ConversationFolderRepository { @@ -142,6 +143,12 @@ internal class ConversationFolderDataSource internal constructor( .v("Removing conversation ${conversationId.toLogString()} from folder ${folderId.obfuscateId()}") return wrapStorageRequest { conversationFolderDAO.removeConversationFromFolder(conversationId.toDao(), folderId) + val conversations = conversationFolderDAO.observeConversationListFromFolder(folderId).first() + if (conversations.isEmpty()) { + conversationFolderDAO.removeFolder(folderId) + } else { + Unit + } } } diff --git a/logic/src/commonTest/kotlin/com/wire/kalium/logic/data/conversation/folders/ConversationFolderRepositoryTest.kt b/logic/src/commonTest/kotlin/com/wire/kalium/logic/data/conversation/folders/ConversationFolderRepositoryTest.kt index 9483c5015f..09447b383e 100644 --- a/logic/src/commonTest/kotlin/com/wire/kalium/logic/data/conversation/folders/ConversationFolderRepositoryTest.kt +++ b/logic/src/commonTest/kotlin/com/wire/kalium/logic/data/conversation/folders/ConversationFolderRepositoryTest.kt @@ -183,6 +183,7 @@ class ConversationFolderRepositoryTest { val arrangement = Arrangement() .withRemoveConversationFromFolder() .withGetFoldersWithConversations() + .withConversationsFromFolder(folderId, listOf()) .withUpdateLabels(NetworkResponse.Success(Unit, mapOf(), 200)) // when @@ -245,6 +246,52 @@ class ConversationFolderRepositoryTest { coVerify { arrangement.conversationFolderDAO.addFolder(eq(folder.toDao())) }.wasInvoked() } + @Test + fun givenLastConversationRemovedFromFolder_whenRemovingConversation_thenFolderShouldBeDeleted() = runTest { + // given + val folderId = "folder1" + val conversationId = TestConversation.ID + + val arrangement = Arrangement() + .withRemoveConversationFromFolder() + .withConversationsFromFolder(folderId, emptyList()) + + // when + val result = arrangement.repository.removeConversationFromFolder(conversationId, folderId) + + // then + result.shouldSucceed() + + coVerify { arrangement.conversationFolderDAO.removeConversationFromFolder(eq(conversationId.toDao()), eq(folderId)) }.wasInvoked() + coVerify { arrangement.conversationFolderDAO.removeFolder(eq(folderId)) }.wasInvoked() + } + + @Test + fun givenRemainingConversationsInFolder_whenRemovingConversation_thenFolderShouldNotBeDeleted() = runTest { + // given + val folderId = "folder1" + val conversationId = TestConversation.ID + val remainingConversation = ConversationDetailsWithEventsEntity( + conversationViewEntity = TestConversation.VIEW_ENTITY, + lastMessage = null, + messageDraft = null, + unreadEvents = ConversationUnreadEventEntity(TestConversation.VIEW_ENTITY.id, mapOf()) + ) + + val arrangement = Arrangement() + .withRemoveConversationFromFolder() + .withConversationsFromFolder(folderId, listOf(remainingConversation)) + + // when + val result = arrangement.repository.removeConversationFromFolder(conversationId, folderId) + + // then + result.shouldSucceed() + + coVerify { arrangement.conversationFolderDAO.removeConversationFromFolder(eq(conversationId.toDao()), eq(folderId)) }.wasInvoked() + coVerify { arrangement.conversationFolderDAO.removeFolder(eq(folderId)) }.wasNotInvoked() + } + private class Arrangement { @Mock