summaryrefslogtreecommitdiffhomepage
path: root/android/app/src/test
diff options
context:
space:
mode:
authorAlbin <albin@mullvad.net>2023-11-27 17:23:12 +0100
committerAlbin <albin@mullvad.net>2023-11-27 17:23:12 +0100
commit3b093e0ee4afd159412d9921d8707478874d2392 (patch)
treecf499ed6dc34f582cb70181f8ee84c58389370b0 /android/app/src/test
parent851b1343afa7dfd93547e7836d90e6eb73330d3a (diff)
parent836a7937974141aa4ad55750556e5d607c956665 (diff)
downloadmullvadvpn-3b093e0ee4afd159412d9921d8707478874d2392.tar.xz
mullvadvpn-3b093e0ee4afd159412d9921d8707478874d2392.zip
Merge branch 'fix-clipboard-copypaste-bug-on-voucherredeemdialog-when-it-droid-402'
Diffstat (limited to 'android/app/src/test')
-rw-r--r--android/app/src/test/kotlin/net/mullvad/mullvadvpn/utils/VoucherRegexHelperParameterizedTest.kt45
-rw-r--r--android/app/src/test/kotlin/net/mullvad/mullvadvpn/viewmodel/VoucherDialogViewModelTest.kt93
2 files changed, 120 insertions, 18 deletions
diff --git a/android/app/src/test/kotlin/net/mullvad/mullvadvpn/utils/VoucherRegexHelperParameterizedTest.kt b/android/app/src/test/kotlin/net/mullvad/mullvadvpn/utils/VoucherRegexHelperParameterizedTest.kt
new file mode 100644
index 0000000000..60db08b85f
--- /dev/null
+++ b/android/app/src/test/kotlin/net/mullvad/mullvadvpn/utils/VoucherRegexHelperParameterizedTest.kt
@@ -0,0 +1,45 @@
+package net.mullvad.mullvadvpn.utils
+
+import net.mullvad.mullvadvpn.lib.common.test.TestCoroutineRule
+import net.mullvad.mullvadvpn.util.VoucherRegexHelper
+import org.hamcrest.CoreMatchers.equalTo
+import org.hamcrest.MatcherAssert.assertThat
+import org.junit.Rule
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.junit.runners.Parameterized
+
+private const val IS_ACCEPTED_FORMAT = true
+private const val IS_UNACCEPTED_FORMAT = false
+
+@RunWith(Parameterized::class)
+class VoucherRegexHelperParameterizedTest(
+ private val isValid: Boolean,
+ private val voucher: String
+) {
+ @get:Rule val testCoroutineRule = TestCoroutineRule()
+
+ @Test
+ fun testVoucherFormat() {
+ assertThat(VoucherRegexHelper.validate(voucher), equalTo(isValid))
+ }
+
+ companion object {
+ @JvmStatic
+ @Parameterized.Parameters
+ fun data(): Collection<Array<Any>> =
+ listOf(
+ arrayOf(IS_ACCEPTED_FORMAT, "1"),
+ arrayOf(IS_ACCEPTED_FORMAT, "a"),
+ arrayOf(IS_ACCEPTED_FORMAT, "A"),
+ arrayOf(IS_ACCEPTED_FORMAT, "AAAA"),
+ arrayOf(IS_ACCEPTED_FORMAT, "AAAABBBB11112222"),
+ arrayOf(IS_ACCEPTED_FORMAT, "AAAA BBBB 1111 2222"),
+ arrayOf(IS_ACCEPTED_FORMAT, "AAAA-AAAA-1111-2222\r"),
+ arrayOf(IS_ACCEPTED_FORMAT, "AAAA-AAAA-1111-2222\n"),
+ arrayOf(IS_UNACCEPTED_FORMAT, "@"),
+ arrayOf(IS_UNACCEPTED_FORMAT, "AAAABBBBCCCCDDDD\t"),
+ arrayOf(IS_UNACCEPTED_FORMAT, "AAAA_BBBB_CCCC_DDDD")
+ )
+ }
+}
diff --git a/android/app/src/test/kotlin/net/mullvad/mullvadvpn/viewmodel/VoucherDialogViewModelTest.kt b/android/app/src/test/kotlin/net/mullvad/mullvadvpn/viewmodel/VoucherDialogViewModelTest.kt
index bf87799d87..01ce6659cb 100644
--- a/android/app/src/test/kotlin/net/mullvad/mullvadvpn/viewmodel/VoucherDialogViewModelTest.kt
+++ b/android/app/src/test/kotlin/net/mullvad/mullvadvpn/viewmodel/VoucherDialogViewModelTest.kt
@@ -1,22 +1,29 @@
package net.mullvad.mullvadvpn.viewmodel
import android.content.res.Resources
+import app.cash.turbine.test
import io.mockk.coEvery
import io.mockk.coVerify
import io.mockk.every
import io.mockk.mockk
-import io.mockk.mockkStatic
import io.mockk.unmockkAll
+import kotlin.test.assertEquals
+import kotlin.test.assertIs
+import kotlin.test.assertTrue
+import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.test.runTest
+import net.mullvad.mullvadvpn.compose.state.VoucherDialogState
import net.mullvad.mullvadvpn.lib.common.test.TestCoroutineRule
+import net.mullvad.mullvadvpn.model.VoucherSubmission
import net.mullvad.mullvadvpn.model.VoucherSubmissionError
import net.mullvad.mullvadvpn.model.VoucherSubmissionResult
import net.mullvad.mullvadvpn.ui.serviceconnection.ServiceConnectionContainer
import net.mullvad.mullvadvpn.ui.serviceconnection.ServiceConnectionManager
+import net.mullvad.mullvadvpn.ui.serviceconnection.ServiceConnectionState
import net.mullvad.mullvadvpn.ui.serviceconnection.VoucherRedeemer
+import net.mullvad.mullvadvpn.ui.serviceconnection.voucherRedeemer
import org.junit.After
import org.junit.Before
-import org.junit.Ignore
import org.junit.Rule
import org.junit.Test
@@ -24,21 +31,19 @@ class VoucherDialogViewModelTest {
@get:Rule val testCoroutineRule = TestCoroutineRule()
private val mockServiceConnectionManager: ServiceConnectionManager = mockk()
- private val mockVoucherRedeemer: VoucherRedeemer = mockk()
private val mockServiceConnectionContainer: ServiceConnectionContainer = mockk()
- private val mockResources: Resources = mockk()
+ private val mockVoucherSubmission: VoucherSubmission = mockk()
+ private val serviceConnectionState =
+ MutableStateFlow<ServiceConnectionState>(ServiceConnectionState.Disconnected)
- private val mockVoucherSubmissionErrorResult: VoucherSubmissionResult =
- VoucherSubmissionResult.Error(VoucherSubmissionError.OtherError)
+ private val mockVoucherRedeemer: VoucherRedeemer = mockk()
+ private val mockResources: Resources = mockk()
private lateinit var viewModel: VoucherDialogViewModel
@Before
fun setUp() {
- mockkStatic(CACHE_EXTENSION_CLASS)
- every { mockServiceConnectionManager.connectionState.value.readyContainer() } returns
- mockServiceConnectionContainer
- every { mockServiceConnectionContainer.voucherRedeemer } returns mockVoucherRedeemer
+ every { mockServiceConnectionManager.connectionState } returns serviceConnectionState
viewModel =
VoucherDialogViewModel(
@@ -53,21 +58,73 @@ class VoucherDialogViewModelTest {
}
@Test
- @Ignore("TODO: Fix this failing test and then enable it again.")
- fun test_submit_invalid_voucher() = runTest {
+ fun testSubmitVoucher() = runTest {
+ val voucher = DUMMY_INVALID_VOUCHER
+ val dummyStringResource = DUMMY_STRING_RESOURCE
+
+ // Arrange
+ every { mockServiceConnectionManager.voucherRedeemer() } returns mockVoucherRedeemer
+ every { mockVoucherSubmission.timeAdded } returns 0
+ coEvery { mockVoucherRedeemer.submit(voucher) } returns
+ VoucherSubmissionResult.Ok(mockVoucherSubmission)
+
+ // Act
+ assertIs<VoucherDialogState.Default>(viewModel.uiState.value.voucherViewModelState)
+ viewModel.onRedeem(voucher)
+
+ // Assert
+ coVerify(exactly = 1) { mockVoucherRedeemer.submit(voucher) }
+ }
+
+ @Test
+ fun testInsertInvalidVoucher() = runTest {
+ val voucher = DUMMY_INVALID_VOUCHER
+ val dummyStringResource = DUMMY_STRING_RESOURCE
+
+ // Arrange
+ every { mockServiceConnectionManager.voucherRedeemer() } returns mockVoucherRedeemer
+ every { mockResources.getString(any()) } returns dummyStringResource
+ every { mockVoucherSubmission.timeAdded } returns 0
+ coEvery { mockVoucherRedeemer.submit(voucher) } returns
+ VoucherSubmissionResult.Error(VoucherSubmissionError.OtherError)
+
+ // Act, Assert
+ viewModel.uiState.test {
+ assertEquals(viewModel.uiState.value, awaitItem())
+ serviceConnectionState.value =
+ ServiceConnectionState.ConnectedReady(mockServiceConnectionContainer)
+ viewModel.onRedeem(voucher)
+ assertTrue { awaitItem().voucherViewModelState is VoucherDialogState.Verifying }
+ assertTrue { awaitItem().voucherViewModelState is VoucherDialogState.Error }
+ }
+ }
+
+ @Test
+ fun testInsertValidVoucher() = runTest {
val voucher = DUMMY_VALID_VOUCHER
val dummyStringResource = DUMMY_STRING_RESOURCE
+
// Arrange
+ every { mockServiceConnectionManager.voucherRedeemer() } returns mockVoucherRedeemer
every { mockResources.getString(any()) } returns dummyStringResource
- coEvery { mockVoucherRedeemer.submit(voucher) } returns mockVoucherSubmissionErrorResult
+ every { mockVoucherSubmission.timeAdded } returns 0
+ coEvery { mockVoucherRedeemer.submit(voucher) } returns
+ VoucherSubmissionResult.Ok(VoucherSubmission(0, DUMMY_STRING_RESOURCE))
+
// Act, Assert
- viewModel.onRedeem(voucher)
- coVerify(exactly = 1) { mockVoucherRedeemer.submit(voucher) }
+ viewModel.uiState.test {
+ assertEquals(viewModel.uiState.value, awaitItem())
+ serviceConnectionState.value =
+ ServiceConnectionState.ConnectedReady(mockServiceConnectionContainer)
+ viewModel.onRedeem(voucher)
+ assertTrue { awaitItem().voucherViewModelState is VoucherDialogState.Verifying }
+ assertTrue { awaitItem().voucherViewModelState is VoucherDialogState.Success }
+ }
}
companion object {
- private const val CACHE_EXTENSION_CLASS = "net.mullvad.mullvadvpn.util.CacheExtensionsKt"
- private const val DUMMY_VALID_VOUCHER = "DUMMY_VALID_VOUCHER"
- private const val DUMMY_STRING_RESOURCE = "DUMMY_STRING_RESOURCE"
+ private const val DUMMY_VALID_VOUCHER = "dummy_valid_voucher"
+ private const val DUMMY_INVALID_VOUCHER = "dummy_invalid_voucher"
+ private const val DUMMY_STRING_RESOURCE = "dummy_string_resource"
}
}