package com.kickstarter.viewmodels; import android.content.Intent; import android.support.annotation.NonNull; import android.util.Pair; import com.kickstarter.KSRobolectricTestCase; import com.kickstarter.factories.BackingFactory; import com.kickstarter.factories.LocationFactory; import com.kickstarter.factories.RewardFactory; import com.kickstarter.libs.Environment; import com.kickstarter.libs.MockCurrentUser; import com.kickstarter.libs.utils.DateTimeUtils; import com.kickstarter.libs.utils.NumberUtils; import com.kickstarter.models.Backing; import com.kickstarter.models.Location; import com.kickstarter.models.Project; import com.kickstarter.models.Reward; import com.kickstarter.models.RewardsItem; import com.kickstarter.models.User; import com.kickstarter.services.ApiClientType; import com.kickstarter.services.MockApiClient; import com.kickstarter.ui.IntentKey; import org.junit.Test; import java.util.List; import rx.Observable; import rx.observers.TestSubscriber; import static java.util.Collections.emptyList; public final class ViewPledgeViewModelTest extends KSRobolectricTestCase { @Test public void testBackerNameTextViewText() { final Backing backing = BackingFactory.backing(); final ViewPledgeViewModel vm = vm(backing); final TestSubscriber<String> backerNameTextViewTextTest = TestSubscriber.create(); vm.outputs.backerNameTextViewText().subscribe(backerNameTextViewTextTest); vm.intent(intent(backing)); backerNameTextViewTextTest.assertValues(backing.backer().name()); } @Test public void testBackerNumberTextViewText() { final Backing backing = BackingFactory.backing(); final ViewPledgeViewModel vm = vm(backing); final TestSubscriber<String> backerNumberTextViewTextTest = TestSubscriber.create(); vm.outputs.backerNumberTextViewText().subscribe(backerNumberTextViewTextTest); vm.intent(intent(backing)); backerNumberTextViewTextTest.assertValues(NumberUtils.format(backing.sequence())); } @Test public void testBackingAmountAndDateTextViewText() { final Backing backing = BackingFactory.backing().toBuilder() .amount(50.0f) .build(); final ViewPledgeViewModel vm = vm(backing); final TestSubscriber<Pair<String, String>> backingAmountAndDateTextViewTextTest = TestSubscriber.create(); vm.outputs.backingAmountAndDateTextViewText().subscribe(backingAmountAndDateTextViewTextTest); vm.intent(intent(backing)); backingAmountAndDateTextViewTextTest.assertValues(Pair.create("$50", DateTimeUtils.fullDate(backing.pledgedAt()))); } @Test public void testBackingStatus() { final Backing backing = BackingFactory.backing(); final ViewPledgeViewModel vm = vm(backing); final TestSubscriber<String> backingStatusTextViewTest = TestSubscriber.create(); vm.outputs.backingStatus().subscribe(backingStatusTextViewTest); vm.intent(intent(backing)); backingStatusTextViewTest.assertValue(backing.status()); } @Test public void testCreatorNameTextViewText() { final Backing backing = BackingFactory.backing(); final ViewPledgeViewModel vm = vm(backing); final TestSubscriber<String> creatorNameTextViewTextTest = TestSubscriber.create(); vm.outputs.creatorNameTextViewText().subscribe(creatorNameTextViewTextTest); vm.intent(intent(backing)); creatorNameTextViewTextTest.assertValues(backing.project().creator().name()); } @Test public void testGoBackOnProjectClick() { final Backing backing = BackingFactory.backing(); final ViewPledgeViewModel vm = vm(backing); final TestSubscriber<Void> goBackTest = TestSubscriber.create(); vm.outputs.goBack().subscribe(goBackTest); vm.intent(intent(backing)); goBackTest.assertNoValues(); vm.inputs.projectClicked(); goBackTest.assertValueCount(1); } @Test public void testLoadBackerAvatar() { final Backing backing = BackingFactory.backing(); final ViewPledgeViewModel vm = vm(backing); final TestSubscriber<String> loadBackerAvatarTest = TestSubscriber.create(); vm.outputs.loadBackerAvatar().subscribe(loadBackerAvatarTest); vm.intent(intent(backing)); loadBackerAvatarTest.assertValues(backing.backer().avatar().medium()); } @Test public void testLoadProjectPhoto() { final Backing backing = BackingFactory.backing(); final ViewPledgeViewModel vm = vm(backing); final TestSubscriber<String> loadProjectPhotoTest = TestSubscriber.create(); vm.outputs.loadProjectPhoto().subscribe(loadProjectPhotoTest); vm.intent(intent(backing)); loadProjectPhotoTest.assertValues(backing.project().photo().full()); } @Test public void testProjectNameTextViewText() { final Backing backing = BackingFactory.backing(); final ViewPledgeViewModel vm = vm(backing); final TestSubscriber<String> projectNameTextViewTextTest = TestSubscriber.create(); vm.outputs.projectNameTextViewText().subscribe(projectNameTextViewTextTest); vm.intent(intent(backing)); projectNameTextViewTextTest.assertValues(backing.project().name()); } @Test public void testRewardMinimumAndDescriptionTextViewText() { final Reward reward = RewardFactory.reward().toBuilder() .minimum(100.0f) .build(); final Backing backing = BackingFactory.backing().toBuilder() .reward(reward) .build(); final ViewPledgeViewModel vm = vm(backing); final TestSubscriber<Pair<String, String>> rewardMinimumAndDescriptionTextViewTextTest = TestSubscriber.create(); vm.outputs.rewardMinimumAndDescriptionTextViewText().subscribe(rewardMinimumAndDescriptionTextViewTextTest); vm.intent(intent(backing)); rewardMinimumAndDescriptionTextViewTextTest.assertValues(Pair.create("$100", backing.reward().description())); } @Test public void testRewardsItemAreHidden() { final Reward reward = RewardFactory.reward().toBuilder() .rewardsItems(null) .build(); final Backing backing = BackingFactory.backing().toBuilder() .reward(reward) .build(); final ViewPledgeViewModel vm = vm(backing); final TestSubscriber<List<RewardsItem>> rewardsItemsTest = TestSubscriber.create(); vm.outputs.rewardsItems().subscribe(rewardsItemsTest); final TestSubscriber<Boolean> rewardsItemsAreHiddenTest = TestSubscriber.create(); vm.outputs.rewardsItemsAreHidden().subscribe(rewardsItemsAreHiddenTest); vm.intent(intent(backing)); rewardsItemsTest.assertValues(emptyList()); rewardsItemsAreHiddenTest.assertValues(true); } @Test public void testRewardsItemAreEmitted() { final Reward reward = RewardFactory.itemized(); final Backing backing = BackingFactory.backing().toBuilder() .reward(reward) .build(); final ViewPledgeViewModel vm = vm(backing); final TestSubscriber<List<RewardsItem>> rewardsItemsTest = TestSubscriber.create(); vm.outputs.rewardsItems().subscribe(rewardsItemsTest); final TestSubscriber<Boolean> rewardsItemsAreHiddenTest = TestSubscriber.create(); vm.outputs.rewardsItemsAreHidden().subscribe(rewardsItemsAreHiddenTest); vm.intent(intent(backing)); rewardsItemsTest.assertValues(reward.rewardsItems()); rewardsItemsAreHiddenTest.assertValues(false); } @Test public void testShipping_withoutShippingLocation() { final Backing backing = BackingFactory.backing(); final ViewPledgeViewModel vm = vm(backing); final TestSubscriber<String> shippingLocationTextViewTextTest = TestSubscriber.create(); vm.outputs.shippingLocationTextViewText().subscribe(shippingLocationTextViewTextTest); final TestSubscriber<String> shippingAmountTextViewTextTest = TestSubscriber.create(); vm.outputs.shippingAmountTextViewText().subscribe(shippingAmountTextViewTextTest); final TestSubscriber<Boolean> shippingSectionIsHiddenTest = TestSubscriber.create(); vm.outputs.shippingSectionIsHidden().subscribe(shippingSectionIsHiddenTest); vm.intent(intent(backing)); shippingLocationTextViewTextTest.assertNoValues(); shippingAmountTextViewTextTest.assertNoValues(); shippingSectionIsHiddenTest.assertValues(true); } @Test public void testShipping_withShippingLocation() { final Location location = LocationFactory.sydney(); final Reward reward = RewardFactory.rewardWithShipping(); final Backing backing = BackingFactory.backing().toBuilder() .location(location) .reward(reward) .rewardId(reward.id()) .shippingAmount(5.0f) .build(); final ViewPledgeViewModel vm = vm(backing); final TestSubscriber<String> shippingLocationTextViewTextTest = TestSubscriber.create(); vm.outputs.shippingLocationTextViewText().subscribe(shippingLocationTextViewTextTest); final TestSubscriber<String> shippingAmountTextViewTextTest = TestSubscriber.create(); vm.outputs.shippingAmountTextViewText().subscribe(shippingAmountTextViewTextTest); final TestSubscriber<Boolean> shippingSectionIsHiddenTest = TestSubscriber.create(); vm.outputs.shippingSectionIsHidden().subscribe(shippingSectionIsHiddenTest); vm.intent(intent(backing)); shippingLocationTextViewTextTest.assertValues("Sydney, AU"); shippingAmountTextViewTextTest.assertValues("$5"); shippingSectionIsHiddenTest.assertValues(false); } private @NonNull ApiClientType apiClient(final @NonNull Backing backing) { return new MockApiClient() { @Override public @NonNull Observable<Backing> fetchProjectBacking(final @NonNull Project project, final @NonNull User user) { return Observable.just(backing); } }; } private @NonNull Environment environment(final @NonNull Backing backing) { return environment().toBuilder() .apiClient(apiClient(backing)) .currentUser(new MockCurrentUser(backing.backer())) .build(); } private @NonNull Intent intent(final @NonNull Backing backing) { return new Intent().putExtra(IntentKey.PROJECT, backing.project()); } private @NonNull ViewPledgeViewModel vm(final @NonNull Backing backing) { return new ViewPledgeViewModel(environment(backing)); } }