Warn user when their member label will show instead of their about text.

This commit is contained in:
jeffrey-signal
2026-03-04 13:04:37 -05:00
committed by Greyson Parrelli
parent 622d9c909f
commit dc1fdffe6a
7 changed files with 448 additions and 96 deletions

View File

@@ -7,7 +7,9 @@ package org.thoughtcrime.securesms.groups.memberlabel
import io.mockk.coEvery
import io.mockk.coVerify
import io.mockk.every
import io.mockk.mockk
import io.mockk.verify
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.test.UnconfinedTestDispatcher
import kotlinx.coroutines.test.runTest
@@ -21,6 +23,7 @@ import org.thoughtcrime.securesms.conversation.colors.NameColor
import org.thoughtcrime.securesms.groups.GroupId
import org.thoughtcrime.securesms.groups.GroupInsufficientRightsException
import org.thoughtcrime.securesms.groups.memberlabel.MemberLabelUiState.SaveState
import org.thoughtcrime.securesms.recipients.Recipient
import org.thoughtcrime.securesms.recipients.RecipientId
import org.thoughtcrime.securesms.testing.CoroutineDispatcherRule
import org.whispersystems.signalservice.api.NetworkResult
@@ -41,13 +44,21 @@ class MemberLabelViewModelTest {
fun setUp() {
coEvery { memberLabelRepo.getRecipient(any()) } returns mockk(relaxed = true)
coEvery { memberLabelRepo.getSenderNameColor(any(), any()) } returns NameColor(0, 0)
every { memberLabelRepo.hasDismissedMemberLabelAboutOverrideWarning() } returns false
}
private fun createViewModel() = MemberLabelViewModel(
memberLabelRepo = memberLabelRepo,
groupId = groupId,
recipientId = recipientId,
sanitizeEmoji = { emoji -> emoji.takeIf { it.isNotBlank() } }
)
@Test
fun `isSaveEnabled returns true when label text is different from the original value`() {
coEvery { memberLabelRepo.getLabel(groupId, any<RecipientId>()) } returns MemberLabel(emoji = null, text = "Original")
coEvery { memberLabelRepo.getLabel(groupId, any<Recipient>()) } returns MemberLabel(emoji = null, text = "Original")
val viewModel = MemberLabelViewModel(memberLabelRepo, groupId, recipientId)
val viewModel = createViewModel()
viewModel.onLabelTextChanged("Modified")
assertTrue(viewModel.uiState.value.isSaveEnabled)
@@ -55,9 +66,9 @@ class MemberLabelViewModelTest {
@Test
fun `isSaveEnabled returns false when label text is the same as the original value`() {
coEvery { memberLabelRepo.getLabel(groupId, any<RecipientId>()) } returns MemberLabel(emoji = null, text = "Original")
coEvery { memberLabelRepo.getLabel(groupId, any<Recipient>()) } returns MemberLabel(emoji = null, text = "Original")
val viewModel = MemberLabelViewModel(memberLabelRepo, groupId, recipientId)
val viewModel = createViewModel()
viewModel.onLabelTextChanged("Original")
assertFalse(viewModel.uiState.value.isSaveEnabled)
@@ -65,9 +76,9 @@ class MemberLabelViewModelTest {
@Test
fun `isSaveEnabled returns true when label text is valid and the emoji is different from the original value`() = runTest(testDispatcher) {
coEvery { memberLabelRepo.getLabel(groupId, any<RecipientId>()) } returns MemberLabel(emoji = null, text = "Label")
coEvery { memberLabelRepo.getLabel(groupId, any<Recipient>()) } returns MemberLabel(emoji = null, text = "Label")
val viewModel = MemberLabelViewModel(memberLabelRepo, groupId, recipientId)
val viewModel = createViewModel()
viewModel.onLabelEmojiChanged("🎉")
assertTrue(viewModel.uiState.value.isSaveEnabled)
@@ -75,18 +86,18 @@ class MemberLabelViewModelTest {
@Test
fun `isSaveEnabled returns false when the label and emoji are not changed`() = runTest(testDispatcher) {
coEvery { memberLabelRepo.getLabel(groupId, any<RecipientId>()) } returns MemberLabel(emoji = "🎉", text = "Label")
coEvery { memberLabelRepo.getLabel(groupId, any<Recipient>()) } returns MemberLabel(emoji = "🎉", text = "Label")
val viewModel = MemberLabelViewModel(memberLabelRepo, groupId, recipientId)
val viewModel = createViewModel()
assertFalse(viewModel.uiState.value.isSaveEnabled)
}
@Test
fun `isSaveEnabled returns false when the label and emoji are changed to the original value`() = runTest(testDispatcher) {
coEvery { memberLabelRepo.getLabel(groupId, any<RecipientId>()) } returns MemberLabel(emoji = "🎉", text = "Original")
coEvery { memberLabelRepo.getLabel(groupId, any<Recipient>()) } returns MemberLabel(emoji = "🎉", text = "Original")
val viewModel = MemberLabelViewModel(memberLabelRepo, groupId, recipientId)
val viewModel = createViewModel()
viewModel.onLabelEmojiChanged("🫢")
viewModel.onLabelTextChanged("Modified")
@@ -99,9 +110,9 @@ class MemberLabelViewModelTest {
@Test
fun `isSaveEnabled returns false when label is too short`() = runTest(testDispatcher) {
coEvery { memberLabelRepo.getLabel(groupId, any<RecipientId>()) } returns MemberLabel(emoji = null, text = "Label")
coEvery { memberLabelRepo.getLabel(groupId, any<Recipient>()) } returns MemberLabel(emoji = null, text = "Label")
val viewModel = MemberLabelViewModel(memberLabelRepo, groupId, recipientId)
val viewModel = createViewModel()
viewModel.onLabelTextChanged("")
viewModel.onLabelEmojiChanged("🎉")
@@ -110,9 +121,9 @@ class MemberLabelViewModelTest {
@Test
fun `isSaveEnabled returns true when clearLabel is called with existing label and emoji`() = runTest(testDispatcher) {
coEvery { memberLabelRepo.getLabel(groupId, any<RecipientId>()) } returns MemberLabel(emoji = "🎉", text = "Original")
coEvery { memberLabelRepo.getLabel(groupId, any<Recipient>()) } returns MemberLabel(emoji = "🎉", text = "Original")
val viewModel = MemberLabelViewModel(memberLabelRepo, groupId, recipientId)
val viewModel = createViewModel()
viewModel.clearLabel()
assertTrue(viewModel.uiState.value.isSaveEnabled)
@@ -120,9 +131,9 @@ class MemberLabelViewModelTest {
@Test
fun `isSaveEnabled returns true when clearLabel is called with existing label without emoji`() = runTest(testDispatcher) {
coEvery { memberLabelRepo.getLabel(groupId, any<RecipientId>()) } returns MemberLabel(emoji = null, text = "Original")
coEvery { memberLabelRepo.getLabel(groupId, any<Recipient>()) } returns MemberLabel(emoji = null, text = "Original")
val viewModel = MemberLabelViewModel(memberLabelRepo, groupId, recipientId)
val viewModel = createViewModel()
viewModel.clearLabel()
assertTrue(viewModel.uiState.value.isSaveEnabled)
@@ -130,9 +141,9 @@ class MemberLabelViewModelTest {
@Test
fun `isSaveEnabled returns false when clearLabel is called with no existing label`() = runTest(testDispatcher) {
coEvery { memberLabelRepo.getLabel(groupId, any<RecipientId>()) } returns null
coEvery { memberLabelRepo.getLabel(groupId, any<Recipient>()) } returns null
val viewModel = MemberLabelViewModel(memberLabelRepo, groupId, recipientId)
val viewModel = createViewModel()
viewModel.clearLabel()
assertFalse(viewModel.uiState.value.isSaveEnabled)
@@ -140,9 +151,9 @@ class MemberLabelViewModelTest {
@Test
fun `isSaveEnabled returns true when both emoji and label are modified`() = runTest(testDispatcher) {
coEvery { memberLabelRepo.getLabel(groupId, any<RecipientId>()) } returns MemberLabel(emoji = "🎉", text = "Original")
coEvery { memberLabelRepo.getLabel(groupId, any<Recipient>()) } returns MemberLabel(emoji = "🎉", text = "Original")
val viewModel = MemberLabelViewModel(memberLabelRepo, groupId, recipientId)
val viewModel = createViewModel()
viewModel.onLabelTextChanged("New Label")
viewModel.onLabelEmojiChanged("🚀")
@@ -151,9 +162,9 @@ class MemberLabelViewModelTest {
@Test
fun `isSaveEnabled returns false when only emoji is changed without an existing label`() = runTest(testDispatcher) {
coEvery { memberLabelRepo.getLabel(groupId, any<RecipientId>()) } returns null
coEvery { memberLabelRepo.getLabel(groupId, any<Recipient>()) } returns null
val viewModel = MemberLabelViewModel(memberLabelRepo, groupId, recipientId)
val viewModel = createViewModel()
viewModel.onLabelEmojiChanged("🎉")
assertFalse(viewModel.uiState.value.isSaveEnabled)
@@ -161,9 +172,9 @@ class MemberLabelViewModelTest {
@Test
fun `save does not call setLabel when isSaveEnabled is false`() = runTest(testDispatcher) {
coEvery { memberLabelRepo.getLabel(groupId, any<RecipientId>()) } returns MemberLabel(emoji = null, text = "Label")
coEvery { memberLabelRepo.getLabel(groupId, any<Recipient>()) } returns MemberLabel(emoji = null, text = "Label")
val viewModel = MemberLabelViewModel(memberLabelRepo, groupId, recipientId)
val viewModel = createViewModel()
viewModel.save()
coVerify(exactly = 0) { memberLabelRepo.setLabel(groupId, any()) }
@@ -171,9 +182,9 @@ class MemberLabelViewModelTest {
@Test
fun `save does not call setLabel when label is less than 1 character`() = runTest(testDispatcher) {
coEvery { memberLabelRepo.getLabel(groupId, any<RecipientId>()) } returns MemberLabel(emoji = null, text = "Label")
coEvery { memberLabelRepo.getLabel(groupId, any<Recipient>()) } returns MemberLabel(emoji = null, text = "Label")
val viewModel = MemberLabelViewModel(memberLabelRepo, groupId, recipientId)
val viewModel = createViewModel()
viewModel.onLabelTextChanged("")
viewModel.onLabelEmojiChanged("🎉")
viewModel.save()
@@ -183,10 +194,10 @@ class MemberLabelViewModelTest {
@Test
fun `save calls setLabel with truncated label when label exceeds max length`() = runTest(testDispatcher) {
coEvery { memberLabelRepo.getLabel(groupId, any<RecipientId>()) } returns null
coEvery { memberLabelRepo.getLabel(groupId, any<Recipient>()) } returns null
coEvery { memberLabelRepo.setLabel(any(), any()) } returns NetworkResult.Success(Unit)
val viewModel = MemberLabelViewModel(memberLabelRepo, groupId, recipientId)
val viewModel = createViewModel()
viewModel.onLabelTextChanged("A".repeat(30))
viewModel.save()
@@ -200,9 +211,9 @@ class MemberLabelViewModelTest {
@Test
fun `save does not call setLabel when emoji is set with no label`() = runTest(testDispatcher) {
coEvery { memberLabelRepo.getLabel(groupId, any<RecipientId>()) } returns null
coEvery { memberLabelRepo.getLabel(groupId, any<Recipient>()) } returns null
val viewModel = MemberLabelViewModel(memberLabelRepo, groupId, recipientId)
val viewModel = createViewModel()
viewModel.onLabelEmojiChanged("🎉")
viewModel.save()
@@ -211,10 +222,10 @@ class MemberLabelViewModelTest {
@Test
fun `save calls setLabel when label change is valid`() = runTest(testDispatcher) {
coEvery { memberLabelRepo.getLabel(groupId, any<RecipientId>()) } returns MemberLabel(emoji = null, text = "Original")
coEvery { memberLabelRepo.getLabel(groupId, any<Recipient>()) } returns MemberLabel(emoji = null, text = "Original")
coEvery { memberLabelRepo.setLabel(any(), any()) } returns NetworkResult.Success(Unit)
val viewModel = MemberLabelViewModel(memberLabelRepo, groupId, recipientId)
val viewModel = createViewModel()
viewModel.onLabelTextChanged("New Label")
viewModel.onLabelEmojiChanged("🎉")
viewModel.save()
@@ -226,10 +237,10 @@ class MemberLabelViewModelTest {
@Test
fun `save calls setLabel with cleared values when clearLabel is called`() = runTest(testDispatcher) {
coEvery { memberLabelRepo.getLabel(groupId, any<RecipientId>()) } returns MemberLabel(emoji = "🎉", text = "Original")
coEvery { memberLabelRepo.getLabel(groupId, any<Recipient>()) } returns MemberLabel(emoji = "🎉", text = "Original")
coEvery { memberLabelRepo.setLabel(any(), any()) } returns NetworkResult.Success(Unit)
val viewModel = MemberLabelViewModel(memberLabelRepo, groupId, recipientId)
val viewModel = createViewModel()
viewModel.clearLabel()
viewModel.save()
@@ -240,9 +251,9 @@ class MemberLabelViewModelTest {
@Test
fun `onLabelTextChanged counts emoji as single grapheme`() = runTest(testDispatcher) {
coEvery { memberLabelRepo.getLabel(groupId, any<RecipientId>()) } returns null
coEvery { memberLabelRepo.getLabel(groupId, any<Recipient>()) } returns null
val viewModel = MemberLabelViewModel(memberLabelRepo, groupId, recipientId)
val viewModel = createViewModel()
val emoji = "\uD83C\uDF89" // 🎉
viewModel.onLabelTextChanged(emoji.repeat(30))
@@ -251,9 +262,9 @@ class MemberLabelViewModelTest {
@Test
fun `remainingCharacters counts emoji as single grapheme`() = runTest(testDispatcher) {
coEvery { memberLabelRepo.getLabel(groupId, any<RecipientId>()) } returns null
coEvery { memberLabelRepo.getLabel(groupId, any<Recipient>()) } returns null
val viewModel = MemberLabelViewModel(memberLabelRepo, groupId, recipientId)
val viewModel = createViewModel()
val emoji = "\uD83C\uDF89" // 🎉
viewModel.onLabelTextChanged(emoji.repeat(10))
@@ -262,9 +273,9 @@ class MemberLabelViewModelTest {
@Test
fun `remainingCharacters counts mixed ascii and emoji correctly`() = runTest(testDispatcher) {
coEvery { memberLabelRepo.getLabel(groupId, any<RecipientId>()) } returns null
coEvery { memberLabelRepo.getLabel(groupId, any<Recipient>()) } returns null
val viewModel = MemberLabelViewModel(memberLabelRepo, groupId, recipientId)
val viewModel = createViewModel()
viewModel.onLabelTextChanged("Hello \uD83C\uDF89") // "Hello 🎉" = 7 graphemes
assertEquals(17, viewModel.uiState.value.remainingCharacters)
@@ -272,9 +283,9 @@ class MemberLabelViewModelTest {
@Test
fun `onLabelTextChanged does not truncate text within grapheme limit`() = runTest(testDispatcher) {
coEvery { memberLabelRepo.getLabel(groupId, any<RecipientId>()) } returns null
coEvery { memberLabelRepo.getLabel(groupId, any<Recipient>()) } returns null
val viewModel = MemberLabelViewModel(memberLabelRepo, groupId, recipientId)
val viewModel = createViewModel()
viewModel.onLabelTextChanged("Short label")
assertEquals("Short label", viewModel.uiState.value.labelText)
@@ -282,9 +293,9 @@ class MemberLabelViewModelTest {
@Test
fun `onLabelTextChanged truncates at exactly 24 graphemes with emoji`() = runTest(testDispatcher) {
coEvery { memberLabelRepo.getLabel(groupId, any<RecipientId>()) } returns null
coEvery { memberLabelRepo.getLabel(groupId, any<Recipient>()) } returns null
val viewModel = MemberLabelViewModel(memberLabelRepo, groupId, recipientId)
val viewModel = createViewModel()
val input = "A".repeat(23) + "\uD83C\uDF89\uD83C\uDF89" // 25 graphemes
viewModel.onLabelTextChanged(input)
@@ -294,9 +305,9 @@ class MemberLabelViewModelTest {
@Test
fun `isSaveEnabled returns false when the only change is trailing whitespace`() = runTest(testDispatcher) {
coEvery { memberLabelRepo.getLabel(groupId, any<RecipientId>()) } returns MemberLabel(emoji = null, text = "Original")
coEvery { memberLabelRepo.getLabel(groupId, any<Recipient>()) } returns MemberLabel(emoji = null, text = "Original")
val viewModel = MemberLabelViewModel(memberLabelRepo, groupId, recipientId)
val viewModel = createViewModel()
viewModel.onLabelTextChanged("Original ")
assertFalse(viewModel.uiState.value.isSaveEnabled)
@@ -304,9 +315,9 @@ class MemberLabelViewModelTest {
@Test
fun `isSaveEnabled returns false when the only change is leading whitespace`() = runTest(testDispatcher) {
coEvery { memberLabelRepo.getLabel(groupId, any<RecipientId>()) } returns MemberLabel(emoji = null, text = "Original")
coEvery { memberLabelRepo.getLabel(groupId, any<Recipient>()) } returns MemberLabel(emoji = null, text = "Original")
val viewModel = MemberLabelViewModel(memberLabelRepo, groupId, recipientId)
val viewModel = createViewModel()
viewModel.onLabelTextChanged(" Original")
assertFalse(viewModel.uiState.value.isSaveEnabled)
@@ -314,9 +325,9 @@ class MemberLabelViewModelTest {
@Test
fun `isSaveEnabled returns true when text differs beyond whitespace`() = runTest(testDispatcher) {
coEvery { memberLabelRepo.getLabel(groupId, any<RecipientId>()) } returns MemberLabel(emoji = null, text = "Original")
coEvery { memberLabelRepo.getLabel(groupId, any<Recipient>()) } returns MemberLabel(emoji = null, text = "Original")
val viewModel = MemberLabelViewModel(memberLabelRepo, groupId, recipientId)
val viewModel = createViewModel()
viewModel.onLabelTextChanged(" Modified ")
assertTrue(viewModel.uiState.value.isSaveEnabled)
@@ -324,10 +335,10 @@ class MemberLabelViewModelTest {
@Test
fun `save sets saveState to Success when setLabel returns NetworkResult Success`() = runTest(testDispatcher) {
coEvery { memberLabelRepo.getLabel(groupId, any<RecipientId>()) } returns MemberLabel(emoji = null, text = "Original")
coEvery { memberLabelRepo.getLabel(groupId, any<Recipient>()) } returns MemberLabel(emoji = null, text = "Original")
coEvery { memberLabelRepo.setLabel(any(), any()) } returns NetworkResult.Success(Unit)
val viewModel = MemberLabelViewModel(memberLabelRepo, groupId, recipientId)
val viewModel = createViewModel()
viewModel.onLabelTextChanged("New Label")
viewModel.save()
@@ -336,10 +347,10 @@ class MemberLabelViewModelTest {
@Test
fun `save sets saveState to NetworkError when setLabel returns NetworkResult NetworkError`() = runTest(testDispatcher) {
coEvery { memberLabelRepo.getLabel(groupId, any<RecipientId>()) } returns MemberLabel(emoji = null, text = "Original")
coEvery { memberLabelRepo.getLabel(groupId, any<Recipient>()) } returns MemberLabel(emoji = null, text = "Original")
coEvery { memberLabelRepo.setLabel(any(), any()) } returns NetworkResult.NetworkError(IOException("Network failure"))
val viewModel = MemberLabelViewModel(memberLabelRepo, groupId, recipientId)
val viewModel = createViewModel()
viewModel.onLabelTextChanged("New Label")
viewModel.save()
@@ -348,13 +359,131 @@ class MemberLabelViewModelTest {
@Test
fun `save sets saveState to InsufficientRights when setLabel returns ApplicationError with GroupInsufficientRightsException`() = runTest(testDispatcher) {
coEvery { memberLabelRepo.getLabel(groupId, any<RecipientId>()) } returns MemberLabel(emoji = null, text = "Original")
coEvery { memberLabelRepo.getLabel(groupId, any<Recipient>()) } returns MemberLabel(emoji = null, text = "Original")
coEvery { memberLabelRepo.setLabel(any(), any()) } returns NetworkResult.ApplicationError(GroupInsufficientRightsException(RuntimeException("Insufficient rights (test)")))
val viewModel = MemberLabelViewModel(memberLabelRepo, groupId, recipientId)
val viewModel = createViewModel()
viewModel.onLabelTextChanged("New Label")
viewModel.save()
assertEquals(SaveState.InsufficientRights, viewModel.uiState.value.saveState)
}
@Test
fun `save shows about override warning when recipient has about text and the warning hasn't been dismissed`() = runTest(testDispatcher) {
coEvery { memberLabelRepo.getLabel(groupId, any<Recipient>()) } returns null
coEvery { memberLabelRepo.getRecipient(any()) } returns Recipient(about = "Some about text")
coEvery { memberLabelRepo.setLabel(any(), any()) } returns NetworkResult.Success(Unit)
every { memberLabelRepo.hasDismissedMemberLabelAboutOverrideWarning() } returns false
val viewModel = createViewModel()
viewModel.onLabelTextChanged("New Label")
viewModel.save()
assertTrue(viewModel.uiState.value.showAboutOverrideSheet)
}
@Test
fun `save shows about override warning when recipient has about emoji and the warning hasn't been dismissed`() = runTest(testDispatcher) {
coEvery { memberLabelRepo.getLabel(groupId, any<Recipient>()) } returns null
coEvery { memberLabelRepo.getRecipient(any()) } returns Recipient(about = null, aboutEmoji = "😎")
coEvery { memberLabelRepo.setLabel(any(), any()) } returns NetworkResult.Success(Unit)
every { memberLabelRepo.hasDismissedMemberLabelAboutOverrideWarning() } returns false
val viewModel = createViewModel()
viewModel.onLabelTextChanged("New Label")
viewModel.save()
assertTrue(viewModel.uiState.value.showAboutOverrideSheet)
}
@Test
fun `save does not show about override warning when label is cleared`() = runTest(testDispatcher) {
coEvery { memberLabelRepo.getLabel(groupId, any<Recipient>()) } returns MemberLabel(emoji = "🎉", text = "Original")
coEvery { memberLabelRepo.getRecipient(any()) } returns Recipient(about = "Some about text", aboutEmoji = null)
coEvery { memberLabelRepo.setLabel(any(), any()) } returns NetworkResult.Success(Unit)
every { memberLabelRepo.hasDismissedMemberLabelAboutOverrideWarning() } returns false
val viewModel = createViewModel()
viewModel.clearLabel()
viewModel.save()
assertFalse(viewModel.uiState.value.showAboutOverrideSheet)
assertEquals(SaveState.Success, viewModel.uiState.value.saveState)
}
@Test
fun `save does not show about override warning when recipient has no about text or emoji`() = runTest(testDispatcher) {
coEvery { memberLabelRepo.getLabel(groupId, any<Recipient>()) } returns null
coEvery { memberLabelRepo.getRecipient(any()) } returns Recipient(about = null, aboutEmoji = null)
coEvery { memberLabelRepo.setLabel(any(), any()) } returns NetworkResult.Success(Unit)
val viewModel = createViewModel()
viewModel.onLabelTextChanged("New Label")
viewModel.save()
assertFalse(viewModel.uiState.value.showAboutOverrideSheet)
assertEquals(SaveState.Success, viewModel.uiState.value.saveState)
}
@Test
fun `save does not show about override warning if the warning has been dismissed`() = runTest(testDispatcher) {
coEvery { memberLabelRepo.getLabel(groupId, any<Recipient>()) } returns null
coEvery { memberLabelRepo.getRecipient(any()) } returns Recipient(about = "Some about text")
coEvery { memberLabelRepo.setLabel(any(), any()) } returns NetworkResult.Success(Unit)
every { memberLabelRepo.hasDismissedMemberLabelAboutOverrideWarning() } returns true
val viewModel = createViewModel()
viewModel.onLabelTextChanged("New Label")
viewModel.save()
assertFalse(viewModel.uiState.value.showAboutOverrideSheet)
assertEquals(SaveState.Success, viewModel.uiState.value.saveState)
}
@Test
fun `onAboutOverrideSheetShown resets showAboutOverrideSheet`() = runTest(testDispatcher) {
coEvery { memberLabelRepo.getLabel(groupId, any<Recipient>()) } returns null
coEvery { memberLabelRepo.getRecipient(any()) } returns Recipient(about = "Some about text")
coEvery { memberLabelRepo.setLabel(any(), any()) } returns NetworkResult.Success(Unit)
every { memberLabelRepo.hasDismissedMemberLabelAboutOverrideWarning() } returns false
val viewModel = createViewModel()
viewModel.onLabelTextChanged("New Label")
viewModel.save()
assertTrue(viewModel.uiState.value.showAboutOverrideSheet)
viewModel.onAboutOverrideSheetShown()
assertFalse(viewModel.uiState.value.showAboutOverrideSheet)
}
@Test
fun `onAboutOverrideSheetDismissed sets saveState to Success`() = runTest(testDispatcher) {
coEvery { memberLabelRepo.getLabel(groupId, any<Recipient>()) } returns null
val viewModel = createViewModel()
viewModel.onAboutOverrideSheetDismissed(dontShowAgain = false)
assertEquals(SaveState.Success, viewModel.uiState.value.saveState)
}
@Test
fun `onAboutOverrideSheetDismissed marks about override warning as dismissed when dontShowAgain = true`() = runTest(testDispatcher) {
coEvery { memberLabelRepo.getLabel(groupId, any<Recipient>()) } returns null
val viewModel = createViewModel()
viewModel.onAboutOverrideSheetDismissed(dontShowAgain = true)
verify(exactly = 1) { memberLabelRepo.markMemberLabelAboutOverrideWarningDismissed() }
}
@Test
fun `onAboutOverrideSheetDismissed does not mark about override warning as dismissed when dontShowAgain = false`() = runTest(testDispatcher) {
coEvery { memberLabelRepo.getLabel(groupId, any<Recipient>()) } returns null
val viewModel = createViewModel()
viewModel.onAboutOverrideSheetDismissed(dontShowAgain = false)
verify(exactly = 0) { memberLabelRepo.markMemberLabelAboutOverrideWarningDismissed() }
}
}