BIT-493: Add full file send support (#651)

This commit is contained in:
David Perez authored and Álison Fernandes committed 2024-06-20 17:08:07 +01:00
1 parent 6f796725a1
commit 89a818aeaa
8 files changed
+290 -77

No files matched your search

@@ -336,7 +336,12 @@ class AddSendScreenTest : BaseComposeTest() {
permissionsManager.checkPermissionResult = true
mutableStateFlow.value = DEFAULT_STATE.copy(
viewState = DEFAULT_VIEW_STATE.copy(
selectedType = AddSendState.ViewState.Content.SendType.File,
selectedType = AddSendState.ViewState.Content.SendType.File(
name = null,
displaySize = null,
sizeBytes = null,
uri = null,
),
),
)
composeTestRule
@@ -357,7 +362,12 @@ class AddSendScreenTest : BaseComposeTest() {
permissionsManager.getPermissionsResult = false
mutableStateFlow.value = DEFAULT_STATE.copy(
viewState = DEFAULT_VIEW_STATE.copy(
selectedType = AddSendState.ViewState.Content.SendType.File,
selectedType = AddSendState.ViewState.Content.SendType.File(
name = null,
displaySize = null,
sizeBytes = null,
uri = null,
),
),
)
composeTestRule
@@ -1,5 +1,6 @@
package com.x8bit.bitwarden.ui.tools.feature.send.addsend
import android.net.Uri
import androidx.lifecycle.SavedStateHandle
import app.cash.turbine.test
import com.bitwarden.core.SendView
@@ -18,6 +19,7 @@ import com.x8bit.bitwarden.data.vault.repository.model.RemovePasswordSendResult
import com.x8bit.bitwarden.data.vault.repository.model.UpdateSendResult
import com.x8bit.bitwarden.ui.platform.base.BaseViewModelTest
import com.x8bit.bitwarden.ui.platform.base.util.asText
import com.x8bit.bitwarden.ui.platform.manager.intent.IntentManager
import com.x8bit.bitwarden.ui.tools.feature.send.addsend.model.AddSendType
import com.x8bit.bitwarden.ui.tools.feature.send.addsend.util.toSendView
import com.x8bit.bitwarden.ui.tools.feature.send.addsend.util.toViewState
@@ -277,6 +279,63 @@ class AddSendViewModelTest : BaseViewModelTest() {
)
}
@Test
fun `SaveClick with file missing should show error dialog`() {
val initialState = DEFAULT_STATE.copy(
viewState = DEFAULT_VIEW_STATE.copy(
common = DEFAULT_COMMON_STATE.copy(name = "test"),
selectedType = AddSendState.ViewState.Content.SendType.File(
uri = null,
name = null,
displaySize = null,
sizeBytes = null,
),
),
)
val viewModel = createViewModel(initialState)
viewModel.trySendAction(AddSendAction.SaveClick)
assertEquals(
initialState.copy(
dialogState = AddSendState.DialogState.Error(
title = R.string.an_error_has_occurred.asText(),
message = R.string.validation_field_required.asText(R.string.file.asText()),
),
),
viewModel.stateFlow.value,
)
}
@Test
fun `SaveClick with file too large should show error dialog`() {
val initialState = DEFAULT_STATE.copy(
viewState = DEFAULT_VIEW_STATE.copy(
common = DEFAULT_COMMON_STATE.copy(name = "test"),
selectedType = AddSendState.ViewState.Content.SendType.File(
uri = mockk(),
name = "test.png",
displaySize = null,
// Max size is 104857600
sizeBytes = 104857601,
),
),
)
val viewModel = createViewModel(initialState)
viewModel.trySendAction(AddSendAction.SaveClick)
assertEquals(
initialState.copy(
dialogState = AddSendState.DialogState.Error(
title = R.string.an_error_has_occurred.asText(),
message = R.string.max_file_size.asText(),
),
),
viewModel.stateFlow.value,
)
}
@Test
fun `CopyLinkClick with nonnull sendUrl should copy to clipboard`() {
val sendUrl = "www.test.com/send-stuff"
@@ -584,11 +643,41 @@ class AddSendViewModelTest : BaseViewModelTest() {
@Test
fun `FileChose should emit ShowToast`() = runTest {
val viewModel = createViewModel()
viewModel.eventFlow.test {
viewModel.trySendAction(AddSendAction.FileChoose(fileData = mockk()))
assertEquals(AddSendEvent.ShowToast("Not Yet Implemented".asText()), awaitItem())
}
val initialState = DEFAULT_STATE.copy(
viewState = DEFAULT_VIEW_STATE.copy(
selectedType = AddSendState.ViewState.Content.SendType.File(
uri = null,
name = null,
displaySize = null,
sizeBytes = null,
),
),
)
val fileName = "test.png"
val uri = mockk<Uri>()
val size = 50L
val fileData = IntentManager.FileData(
fileName = fileName,
uri = uri,
sizeBytes = size,
)
val viewModel = createViewModel(initialState)
viewModel.trySendAction(AddSendAction.FileChoose(fileData = fileData))
assertEquals(
initialState.copy(
viewState = DEFAULT_VIEW_STATE.copy(
selectedType = AddSendState.ViewState.Content.SendType.File(
uri = uri,
name = fileName,
displaySize = null,
sizeBytes = size,
),
),
),
viewModel.stateFlow.value,
)
}
@Test
@@ -606,7 +695,12 @@ class AddSendViewModelTest : BaseViewModelTest() {
val viewModel = createViewModel()
val premiumUserState = DEFAULT_STATE.copy(isPremiumUser = true)
val expectedViewState = DEFAULT_VIEW_STATE.copy(
selectedType = AddSendState.ViewState.Content.SendType.File,
selectedType = AddSendState.ViewState.Content.SendType.File(
name = null,
displaySize = null,
sizeBytes = null,
uri = null,
),
)
// Make sure we are a premium user
mutableUserStateFlow.tryEmit(
@@ -1,7 +1,7 @@
package com.x8bit.bitwarden.ui.tools.feature.send.addsend.util
import com.bitwarden.core.SendFileView
import com.bitwarden.core.SendType
import com.x8bit.bitwarden.data.vault.datasource.sdk.model.createMockFileView
import com.x8bit.bitwarden.data.vault.datasource.sdk.model.createMockSendView
import com.x8bit.bitwarden.ui.tools.feature.send.addsend.AddSendState
import org.junit.jupiter.api.Assertions.assertEquals
@@ -21,17 +21,23 @@ class AddSendStateExtensionsTest {
key = null,
accessCount = 0U,
text = null,
file = SendFileView(
id = "",
fileName = "",
size = "",
sizeName = "",
file = createMockFileView(number = 1).copy(
id = null,
size = null,
sizeName = null,
),
hasPassword = false,
)
val result = DEFAULT_VIEW_STATE
.copy(selectedType = AddSendState.ViewState.Content.SendType.File)
.copy(
selectedType = AddSendState.ViewState.Content.SendType.File(
name = "mockFileName-1",
displaySize = "mockSizeName-1",
sizeBytes = 1,
uri = null,
),
)
.toSendView(FIXED_CLOCK)
assertEquals(sendView, result)
@@ -21,7 +21,12 @@ class SendViewExtensionsTest {
baseWebSendUrl = "www.test.com/",
)
assertEquals(DEFAULT_STATE, result)
assertEquals(
DEFAULT_STATE.copy(
common = DEFAULT_COMMON.copy(originalSendView = sendView),
),
result,
)
}
@Test
@@ -33,7 +38,13 @@ class SendViewExtensionsTest {
baseWebSendUrl = "www.test.com/",
)
assertEquals(DEFAULT_STATE.copy(selectedType = DEFAULT_TEXT_TYPE), result)
assertEquals(
DEFAULT_STATE.copy(
common = DEFAULT_COMMON.copy(originalSendView = sendView),
selectedType = DEFAULT_TEXT_TYPE,
),
result,
)
}
}
@@ -70,7 +81,12 @@ private val DEFAULT_TEXT_TYPE: AddSendState.ViewState.Content.SendType.Text =
)
private val DEFAULT_FILE_TYPE: AddSendState.ViewState.Content.SendType.File =
AddSendState.ViewState.Content.SendType.File
AddSendState.ViewState.Content.SendType.File(
name = "mockFileName-1",
displaySize = "mockSizeName-1",
sizeBytes = null,
uri = null,
)
private val DEFAULT_STATE: AddSendState.ViewState.Content =
AddSendState.ViewState.Content(