Updated on 2026-08-14
This commit is contained in:
parent
a5488207ed
commit
2a41321e74
20 changed files with 440 additions and 9 deletions
|
|
@ -13,6 +13,12 @@ sealed class StakingAvailability {
|
|||
data object Unavailable : StakingAvailability()
|
||||
|
||||
data object TemporaryUnavailable : StakingAvailability()
|
||||
|
||||
/**
|
||||
* The P2P API returned HTTP 451 — staking is blocked in the user's region.
|
||||
* New stakes are not offered; an existing stake is shown as a read-only block.
|
||||
*/
|
||||
data object RegionUnavailable : StakingAvailability()
|
||||
}
|
||||
|
||||
/** Staking option if the integration is known (Available or Full), else null. */
|
||||
|
|
@ -22,5 +28,6 @@ val StakingAvailability.optionOrNull: StakingOption?
|
|||
is StakingAvailability.Full -> option
|
||||
StakingAvailability.Unavailable,
|
||||
StakingAvailability.TemporaryUnavailable,
|
||||
StakingAvailability.RegionUnavailable,
|
||||
-> null
|
||||
}
|
||||
|
|
@ -7,4 +7,6 @@ interface StakingFeatureToggles {
|
|||
fun isIntegrationEnabled(integrationId: StakingIntegrationID): Boolean
|
||||
|
||||
fun isSolanaUnstakeValidationEnabled(): Boolean
|
||||
|
||||
fun isRegionUnavailableHandlingEnabled(): Boolean
|
||||
}
|
||||
|
|
@ -182,6 +182,7 @@ internal open class BaseActionsFactory(
|
|||
)
|
||||
is StakingAvailability.Full -> null
|
||||
StakingAvailability.Unavailable -> null
|
||||
StakingAvailability.RegionUnavailable -> null
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -95,14 +95,30 @@ internal class CommonActionsFactoryTest {
|
|||
assertThat(buyAction.unavailabilityReason).isEqualTo(ScenarioUnavailabilityReason.None)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `GIVEN region unavailable WHEN create THEN no stake action offered`() = runTest {
|
||||
// Arrange
|
||||
every { cardTypesResolver.isStart2Coin() } returns false
|
||||
|
||||
// Act
|
||||
val actions = createActions(stakingAvailability = StakingAvailability.RegionUnavailable)
|
||||
|
||||
// Assert
|
||||
assertThat(actions.filterIsInstance<ActionState.Stake>()).isEmpty()
|
||||
}
|
||||
|
||||
private suspend fun createBuyAction(): ActionState.Buy {
|
||||
val actions = factory.create(
|
||||
val actions = createActions(stakingAvailability = StakingAvailability.Unavailable)
|
||||
return actions.filterIsInstance<ActionState.Buy>().single()
|
||||
}
|
||||
|
||||
private suspend fun createActions(stakingAvailability: StakingAvailability): Set<ActionState> {
|
||||
return factory.create(
|
||||
userWallet = userWallet,
|
||||
cryptoCurrencyStatus = cryptoCurrencyStatus,
|
||||
stakingAvailability = StakingAvailability.Unavailable,
|
||||
stakingAvailability = stakingAvailability,
|
||||
yieldSupplyAvailability = YieldSupplyAvailability.Unavailable,
|
||||
shouldShowSwapStories = false,
|
||||
)
|
||||
return actions.filterIsInstance<ActionState.Buy>().single()
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue