mirror of
https://github.com/signalapp/Signal-Android.git
synced 2026-04-18 15:56:24 +01:00
Warn user when their member label will show instead of their about text.
This commit is contained in:
committed by
Greyson Parrelli
parent
622d9c909f
commit
dc1fdffe6a
@@ -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() }
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user