package com.kickstarter.viewmodels; import android.support.annotation.NonNull; import android.util.Pair; import com.kickstarter.KSRobolectricTestCase; import com.kickstarter.factories.PhotoFactory; import com.kickstarter.factories.ProjectFactory; import com.kickstarter.libs.Environment; import com.kickstarter.libs.utils.NumberUtils; import com.kickstarter.models.Project; import org.joda.time.DateTime; import org.junit.Test; import rx.observers.TestSubscriber; public final class ProjectSearchResultHolderViewModelTest extends KSRobolectricTestCase { private ProjectSearchResultHolderViewModel.ViewModel vm; private final TestSubscriber<Project> notifyDelegateOfResultClick = new TestSubscriber<>(); private final TestSubscriber<String> percentFundedTextViewText = new TestSubscriber<>(); private final TestSubscriber<Project> projectForDeadlineCountdownUnitTextView = new TestSubscriber<>(); private final TestSubscriber<String> projectNameTextViewText = new TestSubscriber<>(); private final TestSubscriber<String> projectPhotoUrl = new TestSubscriber<>(); private void setUpEnvironment(final @NonNull Environment environment) { this.vm = new ProjectSearchResultHolderViewModel.ViewModel(environment); this.vm.outputs.notifyDelegateOfResultClick().subscribe(this.notifyDelegateOfResultClick); this.vm.outputs.percentFundedTextViewText().subscribe(this.percentFundedTextViewText); this.vm.outputs.projectForDeadlineCountdownUnitTextView().subscribe(this.projectForDeadlineCountdownUnitTextView); this.vm.outputs.projectNameTextViewText().subscribe(this.projectNameTextViewText); this.vm.outputs.projectPhotoUrl().subscribe(this.projectPhotoUrl); } @Test public void testEmitsProjectImage() { final Project project = ProjectFactory.project() .toBuilder() .photo( PhotoFactory.photo() .toBuilder() .med("http://www.kickstarter.com/med.jpg") .build() ) .build(); setUpEnvironment(environment()); this.vm.inputs.configureWith(Pair.create(project, false)); this.projectPhotoUrl.assertValues("http://www.kickstarter.com/med.jpg"); } @Test public void testEmitsFeaturedProjectImage() { final Project project = ProjectFactory.project() .toBuilder() .photo( PhotoFactory.photo() .toBuilder() .full("http://www.kickstarter.com/full.jpg") .build() ) .build(); setUpEnvironment(environment()); this.vm.inputs.configureWith(Pair.create(project, true)); this.projectPhotoUrl.assertValues("http://www.kickstarter.com/full.jpg"); } @Test public void testEmitsProjectName() { final Project project = ProjectFactory.project(); setUpEnvironment(environment()); this.vm.inputs.configureWith(Pair.create(project, true)); this.projectNameTextViewText.assertValues(project.name()); } @Test public void testEmitsProjectStats() { final Project project = ProjectFactory.project() .toBuilder() .pledged(100) .goal(200) .deadline(new DateTime().plusHours(24 * 10 + 1)) .build(); setUpEnvironment(environment()); this.vm.inputs.configureWith(Pair.create(project, true)); this.percentFundedTextViewText.assertValues(NumberUtils.flooredPercentage(project.percentageFunded())); this.projectForDeadlineCountdownUnitTextView.assertValues(project); } @Test public void testEmitsProjectClicked() { final Project project = ProjectFactory.project(); setUpEnvironment(environment()); this.vm.inputs.configureWith(Pair.create(project, true)); this.vm.inputs.projectClicked(); this.notifyDelegateOfResultClick.assertValues(project); } }