Skip to content

Commit

Permalink
Fix remarks
Browse files Browse the repository at this point in the history
  • Loading branch information
Rawa committed Oct 17, 2023
1 parent 55c3143 commit fa25d66
Show file tree
Hide file tree
Showing 7 changed files with 31 additions and 39 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ import net.mullvad.mullvadvpn.compose.state.ConnectUiState
import net.mullvad.mullvadvpn.compose.test.CIRCULAR_PROGRESS_INDICATOR
import net.mullvad.mullvadvpn.compose.test.CONNECT_BUTTON_TEST_TAG
import net.mullvad.mullvadvpn.compose.test.LOCATION_INFO_TEST_TAG
import net.mullvad.mullvadvpn.compose.test.NOTIFICATION_BANNER
import net.mullvad.mullvadvpn.compose.test.NOTIFICATION_BANNER_ACTION
import net.mullvad.mullvadvpn.compose.test.RECONNECT_BUTTON_TEST_TAG
import net.mullvad.mullvadvpn.compose.test.SCROLLABLE_COLUMN_TEST_TAG
import net.mullvad.mullvadvpn.compose.test.SELECT_LOCATION_BUTTON_TEST_TAG
Expand Down Expand Up @@ -334,7 +334,7 @@ class ConnectScreenTest {
daysLeftUntilExpiry = null,
inAppNotification =
InAppNotification.TunnelStateError(
ErrorState(ErrorStateCause.StartTunnelError, true)
ErrorState(ErrorStateCause.StartTunnelError, false)
)
),
uiSideEffect = MutableSharedFlow<ConnectViewModel.UiSideEffect>().asSharedFlow()
Expand Down Expand Up @@ -800,7 +800,7 @@ class ConnectScreenTest {
}

// Act
composeTestRule.onNodeWithTag(NOTIFICATION_BANNER).performClick()
composeTestRule.onNodeWithTag(NOTIFICATION_BANNER_ACTION).performClick()

// Assert
verify { mockedClickHandler.invoke() }
Expand Down Expand Up @@ -833,7 +833,7 @@ class ConnectScreenTest {
}

// Act
composeTestRule.onNodeWithTag(NOTIFICATION_BANNER).performClick()
composeTestRule.onNodeWithTag(NOTIFICATION_BANNER_ACTION).performClick()

// Assert
verify { mockedClickHandler.invoke() }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,10 +27,11 @@ import androidx.constraintlayout.compose.ConstraintLayout
import androidx.constraintlayout.compose.Dimension
import net.mullvad.mullvadvpn.compose.component.MullvadTopBar
import net.mullvad.mullvadvpn.compose.test.NOTIFICATION_BANNER
import net.mullvad.mullvadvpn.compose.test.NOTIFICATION_BANNER_ACTION
import net.mullvad.mullvadvpn.compose.util.rememberPrevious
import net.mullvad.mullvadvpn.lib.theme.AlphaDescription
import net.mullvad.mullvadvpn.lib.theme.AppTheme
import net.mullvad.mullvadvpn.lib.theme.Dimens
import net.mullvad.mullvadvpn.lib.theme.color.AlphaDescription
import net.mullvad.mullvadvpn.repository.InAppNotification
import net.mullvad.mullvadvpn.ui.VersionInfo
import net.mullvad.mullvadvpn.ui.notification.StatusLevel
Expand Down Expand Up @@ -86,8 +87,8 @@ fun NotificationBanner(
onClickShowAccount: () -> Unit,
onClickDismissNewDevice: () -> Unit
) {
// Fix for animating to invisible state
val previous = rememberPrevious(current = notification, shouldUpdate = { _, _ -> true })
// Fix for animating t hide
AnimatedVisibility(
visible = notification != null,
enter = slideInVertically(initialOffsetY = { -it }),
Expand Down Expand Up @@ -183,6 +184,7 @@ private fun Notification(notificationBannerData: NotificationData) {
end.linkTo(parent.end)
bottom.linkTo(parent.bottom)
}
.testTag(NOTIFICATION_BANNER_ACTION)
.padding(all = Dimens.notificationEndIconPadding),
onClick = it.onClick
) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,5 +24,6 @@ const val LOCATION_INFO_TEST_TAG = "location_info_test_tag"

// ConnectScreen - Notification banner
const val NOTIFICATION_BANNER = "notification_banner"
const val NOTIFICATION_BANNER_ACTION = "notification_banner_action"

const val LOGIN_TITLE_TEST_TAG = "login_title_test_tag"
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
package net.mullvad.mullvadvpn.constant

const val ACCOUNT_EXPIRY_POLL_INTERVAL: Long = 15 /* s */ * 1000 /* ms */
const val ACCOUNT_EXPIRY_CLOSE_TO_EXPIRY_THRESHOLD_DAYS = 3
Original file line number Diff line number Diff line change
Expand Up @@ -2,24 +2,20 @@ package net.mullvad.mullvadvpn.usecase

import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.distinctUntilChanged
import kotlinx.coroutines.flow.flowOf
import kotlinx.coroutines.flow.map
import net.mullvad.mullvadvpn.constant.ACCOUNT_EXPIRY_CLOSE_TO_EXPIRY_THRESHOLD_DAYS
import net.mullvad.mullvadvpn.model.AccountExpiry
import net.mullvad.mullvadvpn.repository.AccountRepository
import net.mullvad.mullvadvpn.repository.InAppNotification
import net.mullvad.mullvadvpn.ui.serviceconnection.ServiceConnectionManager
import net.mullvad.mullvadvpn.util.flatMapReadyConnectionOrDefault
import org.joda.time.DateTime

class AccountExpiryNotificationUseCase(
private val serviceConnectionManager: ServiceConnectionManager,
private val accountRepository: AccountRepository,
) {
fun notifications(): Flow<List<InAppNotification>> =
serviceConnectionManager.connectionState
.flatMapReadyConnectionOrDefault(flowOf(emptyList())) {
it.container.accountDataSource.accountExpiry
.map { accountExpiry -> accountExpiryNotification(accountExpiry) }
.map(::listOfNotNull)
}
accountRepository.accountExpiryState
.map(::accountExpiryNotification)
.map(::listOfNotNull)
.distinctUntilChanged()

private fun accountExpiryNotification(accountExpiry: AccountExpiry) =
Expand All @@ -28,7 +24,8 @@ class AccountExpiryNotificationUseCase(
} else null

private fun AccountExpiry.isCloseToExpiring(): Boolean {
val threeDaysFromNow = DateTime.now().plusDays(3)
val threeDaysFromNow =
DateTime.now().plusDays(ACCOUNT_EXPIRY_CLOSE_TO_EXPIRY_THRESHOLD_DAYS)
return this.date()?.isBefore(threeDaysFromNow) == true
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,8 @@ class TunnelStateNotificationUseCase(
} else null
}
is TunnelState.Error -> InAppNotification.TunnelStateError(tunnelUiState.errorState)
else -> null
is TunnelState.Connected,
TunnelState.Disconnected -> null
}

private fun ConnectionProxy.tunnelUiStateFlow(): Flow<TunnelState> =
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,11 +11,8 @@ import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.test.runTest
import net.mullvad.mullvadvpn.lib.common.test.TestCoroutineRule
import net.mullvad.mullvadvpn.model.AccountExpiry
import net.mullvad.mullvadvpn.repository.AccountRepository
import net.mullvad.mullvadvpn.repository.InAppNotification
import net.mullvad.mullvadvpn.ui.serviceconnection.ServiceConnectionAccountDataSource
import net.mullvad.mullvadvpn.ui.serviceconnection.ServiceConnectionContainer
import net.mullvad.mullvadvpn.ui.serviceconnection.ServiceConnectionManager
import net.mullvad.mullvadvpn.ui.serviceconnection.ServiceConnectionState
import org.joda.time.DateTime
import org.junit.After
import org.junit.Before
Expand All @@ -25,24 +22,17 @@ import org.junit.Test
class AccountExpiryNotificationUseCaseTest {
@get:Rule val testCoroutineRule = TestCoroutineRule()

private val mockServiceConnectionManager: ServiceConnectionManager = mockk()
private val mockServiceConnectionContainer: ServiceConnectionContainer = mockk()
private val serviceConnectionState =
MutableStateFlow<ServiceConnectionState>(ServiceConnectionState.Disconnected)
private val accountExpiry = MutableStateFlow<AccountExpiry>(AccountExpiry.Missing)
private lateinit var accountExpiryNotificationUseCase: AccountExpiryNotificationUseCase

@Before
fun setup() {
MockKAnnotations.init(this)

val accountDataSource = mockk<ServiceConnectionAccountDataSource>()
every { mockServiceConnectionManager.connectionState } returns serviceConnectionState
every { mockServiceConnectionContainer.accountDataSource } returns accountDataSource
every { accountDataSource.accountExpiry } returns accountExpiry
val accountRepository = mockk<AccountRepository>()
every { accountRepository.accountExpiryState } returns accountExpiry

accountExpiryNotificationUseCase =
AccountExpiryNotificationUseCase(mockServiceConnectionManager)
accountExpiryNotificationUseCase = AccountExpiryNotificationUseCase(accountRepository)
}

@After
Expand All @@ -63,11 +53,13 @@ class AccountExpiryNotificationUseCaseTest {
// Arrange, Act, Assert
accountExpiryNotificationUseCase.notifications().test {
assertTrue { awaitItem().isEmpty() }
val expiryDate = DateTime.now().plusDays(2)
accountExpiry.value = AccountExpiry.Available(expiryDate)
serviceConnectionState.value =
ServiceConnectionState.ConnectedReady(mockServiceConnectionContainer)
assertEquals(listOf(InAppNotification.AccountExpiry(expiryDate)), awaitItem())
val closeToExpiry = AccountExpiry.Available(DateTime.now().plusDays(2))
accountExpiry.value = closeToExpiry

assertEquals(
listOf(InAppNotification.AccountExpiry(closeToExpiry.expiryDateTime)),
awaitItem()
)
}
}

Expand All @@ -77,8 +69,6 @@ class AccountExpiryNotificationUseCaseTest {
accountExpiryNotificationUseCase.notifications().test {
assertTrue { awaitItem().isEmpty() }
accountExpiry.value = AccountExpiry.Available(DateTime.now().plusDays(4))
serviceConnectionState.value =
ServiceConnectionState.ConnectedReady(mockServiceConnectionContainer)
expectNoEvents()
}
}
Expand Down

0 comments on commit fa25d66

Please sign in to comment.