From ee4f3abf229687bab7b7f7b6372424691becddfa Mon Sep 17 00:00:00 2001 From: Alex Hart Date: Mon, 20 Jun 2022 16:48:27 -0300 Subject: [PATCH] Add unit testing for pinned last message deletion fix. --- .../database/ThreadDatabaseTest_pinned.kt | 74 +++++++++++++++++++ .../securesms/testing/SignalDatabaseRule.kt | 40 ++++++++++ 2 files changed, 114 insertions(+) create mode 100644 app/src/androidTest/java/org/thoughtcrime/securesms/database/ThreadDatabaseTest_pinned.kt create mode 100644 app/src/androidTest/java/org/thoughtcrime/securesms/testing/SignalDatabaseRule.kt diff --git a/app/src/androidTest/java/org/thoughtcrime/securesms/database/ThreadDatabaseTest_pinned.kt b/app/src/androidTest/java/org/thoughtcrime/securesms/database/ThreadDatabaseTest_pinned.kt new file mode 100644 index 000000000..7ba8a53d5 --- /dev/null +++ b/app/src/androidTest/java/org/thoughtcrime/securesms/database/ThreadDatabaseTest_pinned.kt @@ -0,0 +1,74 @@ +package org.thoughtcrime.securesms.database + +import org.junit.Assert.assertEquals +import org.junit.Assert.assertTrue +import org.junit.Before +import org.junit.Rule +import org.junit.Test +import org.signal.core.util.CursorUtil +import org.thoughtcrime.securesms.recipients.Recipient +import org.thoughtcrime.securesms.testing.SignalDatabaseRule +import org.whispersystems.signalservice.api.push.ServiceId +import java.util.UUID + +@Suppress("ClassName") +class ThreadDatabaseTest_pinned { + + @Rule + @JvmField + val databaseRule = SignalDatabaseRule() + + private lateinit var recipient: Recipient + + @Before + fun setUp() { + recipient = Recipient.resolved(SignalDatabase.recipients.getOrInsertFromServiceId(ServiceId.from(UUID.randomUUID()))) + } + + @Test + fun givenAPinnedThread_whenIDeleteTheLastMessage_thenIDoNotDeleteOrUnpinTheThread() { + // GIVEN + val threadId = SignalDatabase.threads.getOrCreateThreadIdFor(recipient) + val messageId = MmsHelper.insert(recipient = recipient, threadId = threadId) + SignalDatabase.threads.pinConversations(listOf(threadId)) + + // WHEN + SignalDatabase.mms.deleteMessage(messageId) + + // THEN + val pinned = SignalDatabase.threads.pinnedThreadIds + assertTrue(threadId in pinned) + } + + @Test + fun givenAPinnedThread_whenIDeleteTheLastMessage_thenIExpectTheThreadInUnarchivedCount() { + // GIVEN + val threadId = SignalDatabase.threads.getOrCreateThreadIdFor(recipient) + val messageId = MmsHelper.insert(recipient = recipient, threadId = threadId) + SignalDatabase.threads.pinConversations(listOf(threadId)) + + // WHEN + SignalDatabase.mms.deleteMessage(messageId) + + // THEN + val unarchivedCount = SignalDatabase.threads.unarchivedConversationListCount + assertEquals(1, unarchivedCount) + } + + @Test + fun givenAPinnedThread_whenIDeleteTheLastMessage_thenIExpectPinnedThreadInUnarchivedList() { + // GIVEN + val threadId = SignalDatabase.threads.getOrCreateThreadIdFor(recipient) + val messageId = MmsHelper.insert(recipient = recipient, threadId = threadId) + SignalDatabase.threads.pinConversations(listOf(threadId)) + + // WHEN + SignalDatabase.mms.deleteMessage(messageId) + + // THEN + SignalDatabase.threads.getUnarchivedConversationList(true, 0, 1).use { + it.moveToFirst() + assertEquals(threadId, CursorUtil.requireLong(it, ThreadDatabase.ID)) + } + } +} diff --git a/app/src/androidTest/java/org/thoughtcrime/securesms/testing/SignalDatabaseRule.kt b/app/src/androidTest/java/org/thoughtcrime/securesms/testing/SignalDatabaseRule.kt new file mode 100644 index 000000000..f91f74506 --- /dev/null +++ b/app/src/androidTest/java/org/thoughtcrime/securesms/testing/SignalDatabaseRule.kt @@ -0,0 +1,40 @@ +package org.thoughtcrime.securesms.testing + +import org.junit.rules.TestWatcher +import org.junit.runner.Description +import org.thoughtcrime.securesms.database.SignalDatabase +import org.thoughtcrime.securesms.keyvalue.SignalStore +import org.whispersystems.signalservice.api.push.ACI +import org.whispersystems.signalservice.api.push.PNI +import java.util.UUID + +/** + * Sets up bare-minimum to allow writing unit tests against the database, + * including setting up the local ACI and PNI pair. + * + * @param deleteAllThreadsOnEachRun Run deleteAllThreads between each unit test + */ +class SignalDatabaseRule( + private val deleteAllThreadsOnEachRun: Boolean = true +) : TestWatcher() { + + val localAci: ACI = ACI.from(UUID.randomUUID()) + val localPni: PNI = PNI.from(UUID.randomUUID()) + + override fun starting(description: Description?) { + deleteAllThreads() + + SignalStore.account().setAci(localAci) + SignalStore.account().setPni(localPni) + } + + override fun finished(description: Description?) { + deleteAllThreads() + } + + private fun deleteAllThreads() { + if (deleteAllThreadsOnEachRun) { + SignalDatabase.mms.deleteAllThreads() + } + } +}