Skip to content

Commit

Permalink
NTV-280: Cannot edit a pledge with a sold out reward on a project wit…
Browse files Browse the repository at this point in the history
…h add-ons (#1454)
  • Loading branch information
Arkariang authored Nov 16, 2021
1 parent bd8f8d8 commit 6351253
Show file tree
Hide file tree
Showing 4 changed files with 90 additions and 10 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -208,7 +208,7 @@ private ProjectFactory() {}
public static @NonNull Project backedProjectRewardAvailableAddOnsNotBackedAddOns() {
final Project project = project();

final Reward reward = RewardFactory.reward().toBuilder().hasAddons(true).build();
final Reward reward = RewardFactory.reward().toBuilder().hasAddons(true).isAvailable(true).build();

final Backing backing = Backing.builder()
.amount(10.0f)
Expand Down Expand Up @@ -296,7 +296,10 @@ private ProjectFactory() {}
public static @NonNull Project backedProjectWithRewardLimitReached() {
final Project project = project();

final Reward reward = RewardFactory.limitReached();
final Reward reward = RewardFactory.limitReached()
.toBuilder()
.hasAddons(true)
.build();

final Backing backing = Backing.builder()
.amount(10.0f)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -392,8 +392,8 @@ interface RewardViewHolderViewModel {
/**
* Use cases for enabling/disabling access to launch the next fragment
* - If the selected reward has no addOns the CTA button will be enable if available
* - If the previously selected reward has addOns but not BackedAddOns CTA button available is reward available
* - If the previously selected reward has add-ons and has Backed addOns, CTA button available (they still can update the addOns selection)
* - If selecting other reward CTA button available if reward available
* - If the previously selected reward has addOns, baked AddOns or not CTA button available
*/
private fun shouldContinueFlow(project: Project, rw: Reward): Boolean {
val hasAddOns = rw.hasAddons()
Expand All @@ -402,16 +402,12 @@ interface RewardViewHolderViewModel {

return when {
!hasAddOns && isSelectable(project, rw) -> true
hasAddOns && selectingOtherRw && RewardUtils.isAvailable(project, rw) -> true
hasAddOns && !selectingOtherRw -> RewardUtils.isAvailable(project, rw)
isUpdatingSameRewardWithBackedAddOns(hasAddOns, project, selectingOtherRw, rw) -> true
selectingOtherRw && RewardUtils.isAvailable(project, rw) -> true
hasAddOns && !selectingOtherRw && project.isLive -> true
else -> false
}
}

private fun isUpdatingSameRewardWithBackedAddOns(hasAddOns: Boolean, project: Project, selectingOtherRw: Boolean, rw: Reward) =
hasAddOns && hasBackedAddOns(project) && !selectingOtherRw && RewardUtils.hasStarted(rw) && project.isLive

/**
* In case the `suggested_no_reward_amount` is active and the selected reward is no reward
* update the value with one of the variants. Otherwise return the reward as it is
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,20 @@ class RewardViewUtilsTest : KSRobolectricTestCase() {
assertEquals(R.string.Continue, RewardViewUtils.pledgeButtonText(backedProjectRwHasAvailableNotBackedAddOns, backedRwAvailableAddOns))
}

/**
* Given a backedProject the backed reward
* has available addOns
* when not backed addOns
* when reward is not available
* Then the text for the button should be R.string.Continue
*/
@Test
fun rewardBackedHasAvailableAddOns_whenNotBackedAddOnsAndRewardUnavailable_textContinue() {
val backedProjectRwHasAvailableNotBackedAddOns = ProjectFactory.backedProjectWithRewardLimitReached()
val backedRwAvailableAddOns = requireNotNull(backedProjectRwHasAvailableNotBackedAddOns.backing()?.reward())
assertEquals(R.string.Continue, RewardViewUtils.pledgeButtonText(backedProjectRwHasAvailableNotBackedAddOns, backedRwAvailableAddOns))
}

@Test
fun testShippingSummary() {
val ksString = ksString()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -157,6 +157,7 @@ class RewardViewHolderViewModelTest : KSRobolectricTestCase() {

this.vm.inputs.configureWith(ProjectDataFactory.project(ProjectFactory.project()), RewardFactory.noReward())
this.buttonIsGone.assertValue(false)
this.buttonIsEnabled.assertValue(true)
this.buttonCTA.assertValuesAndClear(R.string.Select)
}

Expand All @@ -166,9 +167,75 @@ class RewardViewHolderViewModelTest : KSRobolectricTestCase() {

this.vm.inputs.configureWith(ProjectDataFactory.project(ProjectFactory.project()), RewardFactory.limitReached())
this.buttonIsGone.assertValue(false)
this.buttonIsEnabled.assertValue(false)
this.buttonCTA.assertValue(R.string.No_longer_available)
}

@Test
fun testButtonUIOutputs_whenProjectIsLiveAndBacked_soldOutReward_bakedAddOns() {
setUpEnvironment(environment())

val rw = RewardFactory.limitReached()
.toBuilder()
.hasAddons(true)
.build()

val addOn = RewardFactory.addOn()

val backing = BackingFactory.backing()
.toBuilder()
.rewardId(rw.id())
.reward(rw)
.addOns(listOf(addOn))
.build()

val project = ProjectFactory.project()
.toBuilder()
.backing(backing)
.build()

val projectData = ProjectDataFactory.project(project)
.toBuilder()
.backing(backing)
.build()

this.vm.inputs.configureWith(projectData, rw)
this.buttonIsGone.assertValue(false)
this.buttonIsEnabled.assertValues(true)
this.buttonCTA.assertValue(R.string.Continue)
}

@Test
fun testButtonUIOutputs_whenProjectIsLiveAndBacked_soldOutReward_NoBakedAddOns() {
setUpEnvironment(environment())

val rw = RewardFactory.limitReached()
.toBuilder()
.hasAddons(true)
.build()

val backing = BackingFactory.backing()
.toBuilder()
.rewardId(rw.id())
.reward(rw)
.build()

val project = ProjectFactory.project()
.toBuilder()
.backing(backing)
.build()

val projectData = ProjectDataFactory.project(project)
.toBuilder()
.backing(backing)
.build()

this.vm.inputs.configureWith(projectData, rw)
this.buttonIsGone.assertValue(false)
this.buttonIsEnabled.assertValues(true)
this.buttonCTA.assertValue(R.string.Continue)
}

@Test
fun testButtonUIOutputs_whenProjectIsLiveAndUnbacked_expiredReward() {
setUpEnvironment(environment())
Expand Down

0 comments on commit 6351253

Please sign in to comment.