[MBL-2995] Create test for Featured Rewards (#2476)

* add test for secret rewards

* fix tests and naming
This commit is contained in:
JL
2026-02-23 15:38:38 -08:00
committed by GitHub
parent 64e27c6489
commit 05a0581d59
4 changed files with 86 additions and 8 deletions

View File

@@ -80,6 +80,22 @@ object RewardFactory {
.build()
}
@JvmStatic
fun featured(): Reward {
return reward().toBuilder()
.isFeatured(true)
.title("Featured reward")
.build()
}
@JvmStatic
fun secret(): Reward {
return reward().toBuilder()
.isSecretReward(true)
.title("Secret reward")
.build()
}
fun endingSoon(): Reward {
return reward().toBuilder()
.endsAt(DateTime.now().plusDays(2))

View File

@@ -19,6 +19,7 @@ import com.kickstarter.libs.utils.RewardUtils.isLocalPickup
import com.kickstarter.libs.utils.RewardUtils.isNoReward
import com.kickstarter.libs.utils.RewardUtils.isReward
import com.kickstarter.libs.utils.RewardUtils.isShippable
import com.kickstarter.libs.utils.RewardUtils.isShippableToLocation
import com.kickstarter.libs.utils.RewardUtils.isTimeLimitedEnd
import com.kickstarter.libs.utils.RewardUtils.isTimeLimitedStart
import com.kickstarter.libs.utils.RewardUtils.isValidTimeRange
@@ -29,6 +30,7 @@ import com.kickstarter.libs.utils.RewardUtils.timeInSecondsUntilDeadline
import com.kickstarter.mock.factories.LocationFactory
import com.kickstarter.mock.factories.ProjectFactory
import com.kickstarter.mock.factories.RewardFactory
import com.kickstarter.mock.factories.ShippingRuleFactory
import com.kickstarter.models.Project
import com.kickstarter.models.Reward
import org.joda.time.DateTime
@@ -491,6 +493,25 @@ class RewardUtilsTest : KSRobolectricTestCase() {
assertFalse(shipsWorldwide(reward))
}
@Test
fun `isShippableToLocation when not restricted returns true`() {
assertTrue(isShippableToLocation(RewardFactory.rewardWithShipping(), null))
assertTrue(isShippableToLocation(RewardFactory.digitalReward(), null))
}
@Test
fun `isShippableToLocation when restricted returns true only for location in rules`() {
val usRule = ShippingRuleFactory.usShippingRule()
val restrictedReward = RewardFactory.reward().toBuilder()
.shippingPreference(Reward.ShippingPreference.RESTRICTED.name)
.shippingType(Reward.SHIPPING_TYPE_MULTIPLE_LOCATIONS)
.shippingRules(listOf(usRule))
.build()
assertTrue(isShippableToLocation(restrictedReward, usRule.location()!!.id()))
assertFalse(isShippableToLocation(restrictedReward, LocationFactory.mexico().id()))
assertFalse(isShippableToLocation(restrictedReward, null))
}
companion object {
private const val DAYS_TO_GO = "days to go"
private const val HOURS_TO_GO = "hours to go"

View File

@@ -311,7 +311,7 @@ class GraphQLTransformersTest : KSRobolectricTestCase() {
}
@Test
fun `test rewardTransformer returns correct featured value`() {
fun `test rewardTransformer maps featured from fragment to reward model`() {
val reward = rewardTransformer(
rewardGr = fragmentReward
)

View File

@@ -173,14 +173,12 @@ class GetShippingRulesUseCaseTest : KSRobolectricTestCase() {
.isAvailable(true)
.build()
val secretReward1 = RewardFactory.reward().toBuilder()
.isSecretReward(true)
val secretReward1 = RewardFactory.secret().toBuilder()
.minimum(30.0)
.isAvailable(true)
.build()
val secretReward2 = RewardFactory.reward().toBuilder()
.isSecretReward(true)
val secretReward2 = RewardFactory.secret().toBuilder()
.minimum(10.0)
.isAvailable(true)
.build()
@@ -218,10 +216,8 @@ class GetShippingRulesUseCaseTest : KSRobolectricTestCase() {
fun `unavailable secret rewards are preserved in order`() = runTest {
val config = ConfigFactory.configForUSUser()
val secretUnavailable = RewardFactory.reward().toBuilder()
.isSecretReward(true)
val secretUnavailable = RewardFactory.secret().toBuilder()
.isAvailable(false)
.minimum(50.0)
.build()
val regularAvailable = RewardFactory.reward().toBuilder()
@@ -252,4 +248,49 @@ class GetShippingRulesUseCaseTest : KSRobolectricTestCase() {
assertEquals(listOf(regularAvailable, secretUnavailable), filtered)
}
@OptIn(ExperimentalCoroutinesApi::class)
@Test
fun `featured and secret rewards are preserved in order`() = runTest {
val config = ConfigFactory.configForUSUser()
val noReward = RewardFactory.noReward().toBuilder()
.isAvailable(true)
.build()
val secretReward = RewardFactory.secret().toBuilder()
.isAvailable(true)
.build()
val featuredReward = RewardFactory.featured().toBuilder()
.isAvailable(true)
.build()
val regularReward = RewardFactory.reward().toBuilder()
.isAvailable(true)
.shippingPreference(Reward.ShippingPreference.UNRESTRICTED.name)
.build()
val project = ProjectFactory.project()
.toBuilder()
.rewards(listOf(noReward, secretReward, featuredReward, regularReward))
.isInPostCampaignPledgingPhase(true)
.postCampaignPledgingEnabled(true)
.build()
val dispatcher = UnconfinedTestDispatcher(testScheduler)
val scope = backgroundScope
val useCase = GetShippingRulesUseCase(project, config, project.rewards() ?: emptyList(), scope, dispatcher)
val state = mutableListOf<ShippingRulesState>()
scope.launch(dispatcher) {
useCase.invoke()
useCase.shippingRulesState.toList(state)
}
advanceUntilIdle()
val filtered = state.last().filteredRw
assertEquals(listOf(noReward, secretReward, featuredReward, regularReward), filtered)
}
}