diff options
| author | Albin <albin@mullvad.net> | 2023-11-27 17:23:12 +0100 |
|---|---|---|
| committer | Albin <albin@mullvad.net> | 2023-11-27 17:23:12 +0100 |
| commit | 3b093e0ee4afd159412d9921d8707478874d2392 (patch) | |
| tree | cf499ed6dc34f582cb70181f8ee84c58389370b0 /android/app/src/test | |
| parent | 851b1343afa7dfd93547e7836d90e6eb73330d3a (diff) | |
| parent | 836a7937974141aa4ad55750556e5d607c956665 (diff) | |
| download | mullvadvpn-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')
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" } } |
