package com.kickstarter.viewmodels;
import android.content.Intent;
import android.util.Pair;
import com.kickstarter.KSRobolectricTestCase;
import com.kickstarter.factories.CategoryFactory;
import com.kickstarter.factories.LocationFactory;
import com.kickstarter.factories.ProjectFactory;
import com.kickstarter.factories.UserFactory;
import com.kickstarter.libs.CurrentUserType;
import com.kickstarter.libs.Environment;
import com.kickstarter.libs.MockCurrentUser;
import com.kickstarter.libs.preferences.MockBooleanPreference;
import com.kickstarter.models.Category;
import com.kickstarter.models.Project;
import com.kickstarter.models.User;
import com.kickstarter.services.DiscoveryParams;
import com.kickstarter.services.MockApiClient;
import com.kickstarter.ui.IntentKey;
import org.junit.Test;
import java.util.Arrays;
import java.util.List;
import rx.observers.TestSubscriber;
public final class ThanksViewModelTest extends KSRobolectricTestCase {
@Test
public void testThanksViewModel_projectName() {
final ThanksViewModel vm = new ThanksViewModel(environment());
final Project project = ProjectFactory.project();
final TestSubscriber<String> projectNameTest = new TestSubscriber<>();
vm.outputs.projectName().subscribe(projectNameTest);
vm.intent(new Intent().putExtra(IntentKey.PROJECT, project));
projectNameTest.assertValues(project.name());
}
@Test
public void testThanksViewModel_showRatingDialog() {
final MockBooleanPreference hasSeenAppRatingPreference = new MockBooleanPreference(false);
final MockBooleanPreference hasSeenGamesNewsletterPreference = new MockBooleanPreference(true);
final Environment environment = environment()
.toBuilder()
.hasSeenAppRatingPreference(hasSeenAppRatingPreference)
.hasSeenGamesNewsletterPreference(hasSeenGamesNewsletterPreference)
.build();
final ThanksViewModel vm = new ThanksViewModel(environment);
final TestSubscriber<Void> showRatingDialogTest = new TestSubscriber<>();
vm.outputs.showRatingDialog().subscribe(showRatingDialogTest);
final Project project = ProjectFactory.project();
vm.intent(new Intent().putExtra(IntentKey.PROJECT, project));
showRatingDialogTest.assertValueCount(1);
}
@Test
public void testThanksViewModel_dontShowRatingDialogIfAlreadySeen() {
final MockBooleanPreference hasSeenAppRatingPreference = new MockBooleanPreference(true);
final MockBooleanPreference hasSeenGamesNewsletterPreference = new MockBooleanPreference(true);
final Environment environment = environment()
.toBuilder()
.hasSeenAppRatingPreference(hasSeenAppRatingPreference)
.hasSeenGamesNewsletterPreference(hasSeenGamesNewsletterPreference)
.build();
final ThanksViewModel vm = new ThanksViewModel(environment);
final TestSubscriber<Void> showRatingDialogTest = new TestSubscriber<>();
vm.outputs.showRatingDialog().subscribe(showRatingDialogTest);
final Project project = ProjectFactory.project();
vm.intent(new Intent().putExtra(IntentKey.PROJECT, project));
showRatingDialogTest.assertValueCount(0);
}
@Test
public void testThanksViewModel_dontShowRatingDialogIfGamesNewsletterWillDisplay() {
final MockBooleanPreference hasSeenAppRatingPreference = new MockBooleanPreference(false);
final MockBooleanPreference hasSeenGamesNewsletterPreference = new MockBooleanPreference(false);
final User user = UserFactory.user().toBuilder().gamesNewsletter(false).build();
final CurrentUserType currentUser = new MockCurrentUser(user);
final Environment environment = environment()
.toBuilder()
.currentUser(currentUser)
.hasSeenAppRatingPreference(hasSeenAppRatingPreference)
.hasSeenGamesNewsletterPreference(hasSeenGamesNewsletterPreference)
.build();
final ThanksViewModel vm = new ThanksViewModel(environment);
final TestSubscriber<Void> showRatingDialogTest = new TestSubscriber<>();
vm.outputs.showRatingDialog().subscribe(showRatingDialogTest);
final Project project = ProjectFactory.project()
.toBuilder()
.category(CategoryFactory.tabletopGamesCategory())
.build();
vm.intent(new Intent().putExtra(IntentKey.PROJECT, project));
showRatingDialogTest.assertValueCount(0);
}
@Test
public void testThanksViewModel_showGamesNewsletterDialog() {
final MockBooleanPreference hasSeenGamesNewsletterPreference = new MockBooleanPreference(false);
final User user = UserFactory.user().toBuilder().gamesNewsletter(false).build();
final CurrentUserType currentUser = new MockCurrentUser(user);
final Environment environment = environment()
.toBuilder()
.currentUser(currentUser)
.hasSeenGamesNewsletterPreference(hasSeenGamesNewsletterPreference)
.build();
final ThanksViewModel vm = new ThanksViewModel(environment);
final TestSubscriber<Void> showGamesNewsletterDialogTest = new TestSubscriber<>();
vm.outputs.showGamesNewsletterDialog().subscribe(showGamesNewsletterDialogTest);
final Project project = ProjectFactory.project()
.toBuilder()
.category(CategoryFactory.tabletopGamesCategory())
.build();
vm.intent(new Intent().putExtra(IntentKey.PROJECT, project));
showGamesNewsletterDialogTest.assertValueCount(1);
assertEquals(Arrays.asList(false, true), hasSeenGamesNewsletterPreference.values());
koalaTest.assertValueCount(0);
}
@Test
public void testThanksViewModel_dontShowGamesNewsletterDialogIfRootCategoryIsNotGames() {
final MockBooleanPreference hasSeenGamesNewsletterPreference = new MockBooleanPreference(false);
final User user = UserFactory.user().toBuilder().gamesNewsletter(false).build();
final CurrentUserType currentUser = new MockCurrentUser(user);
final Environment environment = environment()
.toBuilder()
.currentUser(currentUser)
.hasSeenGamesNewsletterPreference(hasSeenGamesNewsletterPreference)
.build();
final ThanksViewModel vm = new ThanksViewModel(environment);
final TestSubscriber<Void> showGamesNewsletterDialogTest = new TestSubscriber<>();
vm.outputs.showGamesNewsletterDialog().subscribe(showGamesNewsletterDialogTest);
final Project project = ProjectFactory.project()
.toBuilder()
.category(CategoryFactory.ceramicsCategory())
.build();
vm.intent(new Intent().putExtra(IntentKey.PROJECT, project));
showGamesNewsletterDialogTest.assertValueCount(0);
}
@Test
public void testThanksViewModel_dontShowGamesNewsletterDialogIfUserHasAlreadySeen() {
final MockBooleanPreference hasSeenGamesNewsletterPreference = new MockBooleanPreference(true);
final User user = UserFactory.user().toBuilder().gamesNewsletter(false).build();
final CurrentUserType currentUser = new MockCurrentUser(user);
final Environment environment = environment()
.toBuilder()
.currentUser(currentUser)
.hasSeenGamesNewsletterPreference(hasSeenGamesNewsletterPreference)
.build();
final ThanksViewModel vm = new ThanksViewModel(environment);
final TestSubscriber<Void> showGamesNewsletterDialogTest = new TestSubscriber<>();
vm.outputs.showGamesNewsletterDialog().subscribe(showGamesNewsletterDialogTest);
final Project project = ProjectFactory.project()
.toBuilder()
.category(CategoryFactory.tabletopGamesCategory())
.build();
vm.intent(new Intent().putExtra(IntentKey.PROJECT, project));
showGamesNewsletterDialogTest.assertValueCount(0);
}
@Test
public void testThanksViewModel_dontShowGamesNewsletterDialogIfUserHasAlreadySignedUp() {
final MockBooleanPreference hasSeenGamesNewsletterPreference = new MockBooleanPreference(false);
final User user = UserFactory.user().toBuilder().gamesNewsletter(true).build();
final CurrentUserType currentUser = new MockCurrentUser(user);
final Environment environment = environment()
.toBuilder()
.currentUser(currentUser)
.hasSeenGamesNewsletterPreference(hasSeenGamesNewsletterPreference)
.build();
final ThanksViewModel vm = new ThanksViewModel(environment);
final TestSubscriber<Void> showGamesNewsletterDialogTest = new TestSubscriber<>();
vm.outputs.showGamesNewsletterDialog().subscribe(showGamesNewsletterDialogTest);
final Project project = ProjectFactory.project()
.toBuilder()
.category(CategoryFactory.tabletopGamesCategory())
.build();
vm.intent(new Intent().putExtra(IntentKey.PROJECT, project));
showGamesNewsletterDialogTest.assertValueCount(0);
}
@Test
public void testThanksViewModel_showRecommendations() {
final ThanksViewModel vm = new ThanksViewModel(environment());
final Project project = ProjectFactory.project();
final TestSubscriber<Pair<List<Project>, Category>> showRecommendationsTest = new TestSubscriber<>();
vm.outputs.showRecommendations().subscribe(showRecommendationsTest);
vm.intent(new Intent().putExtra(IntentKey.PROJECT, project));
showRecommendationsTest.assertValueCount(1);
}
@Test
public void testThanksViewModel_share() {
final ThanksViewModel vm = new ThanksViewModel(environment());
final Project project = ProjectFactory.project();
final TestSubscriber<Project> startShareTest = new TestSubscriber<>();
vm.outputs.startShare().subscribe(startShareTest);
final TestSubscriber<Project> startShareOnFacebookTest = new TestSubscriber<>();
vm.outputs.startShareOnFacebook().subscribe(startShareOnFacebookTest);
final TestSubscriber<Project> startShareOnTwitterTest = new TestSubscriber<>();
vm.outputs.startShareOnTwitter().subscribe(startShareOnTwitterTest);
vm.intent(new Intent().putExtra(IntentKey.PROJECT, project));
vm.inputs.shareClick();
startShareTest.assertValues(project);
koalaTest.assertValues("Checkout Show Share Sheet");
vm.inputs.shareOnFacebookClick();
startShareOnFacebookTest.assertValues(project);
koalaTest.assertValues("Checkout Show Share Sheet", "Checkout Show Share");
vm.inputs.shareOnTwitterClick();
startShareOnTwitterTest.assertValues(project);
koalaTest.assertValues("Checkout Show Share Sheet", "Checkout Show Share", "Checkout Show Share");
}
@Test
public void testThanksViewModel_signupToGamesNewsletterOnClick() {
final User user = UserFactory.user().toBuilder().gamesNewsletter(false).build();
final CurrentUserType currentUser = new MockCurrentUser(user);
final Environment environment = environment().toBuilder()
.currentUser(currentUser)
.build();
final ThanksViewModel vm = new ThanksViewModel(environment);
final TestSubscriber<User> updateUserSettingsTest = new TestSubscriber<>();
((MockApiClient) environment.apiClient()).observable()
.filter(e -> "update_user_settings".equals(e.first))
.map(e -> (User) e.second.get("user"))
.subscribe(updateUserSettingsTest);
final TestSubscriber<Void> showConfirmGamesNewsletterDialogTest = TestSubscriber.create();
vm.outputs.showConfirmGamesNewsletterDialog().subscribe(showConfirmGamesNewsletterDialogTest);
final Project project = ProjectFactory.project().toBuilder().category(CategoryFactory.tabletopGamesCategory()).build();
vm.intent(new Intent().putExtra(IntentKey.PROJECT, project));
vm.signupToGamesNewsletterClick();
updateUserSettingsTest.assertValues(user.toBuilder().gamesNewsletter(true).build());
showConfirmGamesNewsletterDialogTest.assertValueCount(0);
koalaTest.assertValues("Newsletter Subscribe");
}
@Test
public void testThanksViewModel_showNewsletterConfirmationPromptAfterSignupForGermanUser() {
final User user = UserFactory.user().toBuilder()
.gamesNewsletter(false)
.location(LocationFactory.germany())
.build();
final CurrentUserType currentUser = new MockCurrentUser(user);
final Environment environment = environment().toBuilder()
.currentUser(currentUser)
.build();
final ThanksViewModel vm = new ThanksViewModel(environment);
final TestSubscriber<Void> showConfirmGamesNewsletterDialogTest = TestSubscriber.create();
vm.outputs.showConfirmGamesNewsletterDialog().subscribe(showConfirmGamesNewsletterDialogTest);
final Project project = ProjectFactory.project().toBuilder().category(CategoryFactory.tabletopGamesCategory()).build();
vm.intent(new Intent().putExtra(IntentKey.PROJECT, project));
vm.signupToGamesNewsletterClick();
showConfirmGamesNewsletterDialogTest.assertValueCount(1);
koalaTest.assertValues("Newsletter Subscribe");
}
@Test
public void testThanksViewModel_startDiscovery() {
final ThanksViewModel vm = new ThanksViewModel(environment());
final Category category = CategoryFactory.category();
final TestSubscriber<DiscoveryParams> startDiscoveryTest = new TestSubscriber<>();
vm.outputs.startDiscovery().subscribe(startDiscoveryTest);
vm.inputs.categoryClick(null, category);
startDiscoveryTest.assertValues(DiscoveryParams.builder().category(category).build());
koalaTest.assertValue("Checkout Finished Discover More");
}
@Test
public void testThanksViewModel_startProject() {
final ThanksViewModel vm = new ThanksViewModel(environment());
final Project project = ProjectFactory.project();
final TestSubscriber<Project> startProjectTest = new TestSubscriber<>();
vm.outputs.startProject().subscribe(startProjectTest);
vm.inputs.projectClick(null, project);
startProjectTest.assertValues(project);
koalaTest.assertValue("Checkout Finished Discover Open Project");
}
}