package com.kickstarter.services; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.util.Pair; import com.kickstarter.factories.ActivityEnvelopeFactory; import com.kickstarter.factories.ActivityFactory; import com.kickstarter.factories.BackingFactory; import com.kickstarter.factories.CategoryFactory; import com.kickstarter.factories.CommentFactory; import com.kickstarter.factories.CommentsEnvelopeFactory; import com.kickstarter.factories.LocationFactory; import com.kickstarter.factories.MessageFactory; import com.kickstarter.factories.MessageThreadsEnvelopeFactory; import com.kickstarter.factories.ProjectFactory; import com.kickstarter.factories.SurveyResponseFactory; import com.kickstarter.factories.UpdateFactory; import com.kickstarter.factories.UserFactory; import com.kickstarter.libs.Config; import com.kickstarter.models.Backing; import com.kickstarter.models.Category; import com.kickstarter.models.Comment; import com.kickstarter.models.Empty; import com.kickstarter.models.Location; import com.kickstarter.models.Message; import com.kickstarter.models.MessageThread; import com.kickstarter.models.Project; import com.kickstarter.models.ProjectNotification; import com.kickstarter.models.SurveyResponse; import com.kickstarter.models.Update; import com.kickstarter.models.User; import com.kickstarter.services.apiresponses.AccessTokenEnvelope; import com.kickstarter.services.apiresponses.ActivityEnvelope; import com.kickstarter.services.apiresponses.CommentsEnvelope; import com.kickstarter.services.apiresponses.DiscoverEnvelope; import com.kickstarter.services.apiresponses.MessageThreadEnvelope; import com.kickstarter.services.apiresponses.MessageThreadsEnvelope; import java.util.Arrays; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; import rx.Observable; import rx.subjects.PublishSubject; public class MockApiClient implements ApiClientType { private final PublishSubject<Pair<String, Map<String, Object>>> observable = PublishSubject.create(); /** * Emits when endpoints on the client are called. The key in the pair is the underscore-separated * name of the method, and the value is a map of argument names/values. */ public @NonNull Observable<Pair<String, Map<String, Object>>> observable() { return observable; } @Override public @NonNull Observable<Config> config() { return Observable.empty(); } @Override public @NonNull Observable<ActivityEnvelope> fetchActivities() { return Observable.just( ActivityEnvelopeFactory.activityEnvelope(Collections.singletonList(ActivityFactory.activity())) ); } @Override public @NonNull Observable<ActivityEnvelope> fetchActivities(final @Nullable Integer count) { return fetchActivities().take(count); } @Override public @NonNull Observable<ActivityEnvelope> fetchActivitiesWithPaginationPath(final @NonNull String paginationPath) { return Observable.empty(); } @Override public @NonNull Observable<List<Category>> fetchCategories() { return Observable.just( Arrays.asList( CategoryFactory.artCategory(), CategoryFactory.bluesCategory(), CategoryFactory.ceramicsCategory(), CategoryFactory.gamesCategory(), CategoryFactory.musicCategory(), CategoryFactory.photographyCategory(), CategoryFactory.tabletopGamesCategory(), CategoryFactory.textilesCategory(), CategoryFactory.worldMusicCategory() ) ); } @Override public @NonNull Observable<List<ProjectNotification>> fetchProjectNotifications() { return Observable.empty(); } @Override public @NonNull Observable<Project> fetchProject(final @NonNull String param) { return Observable.just( ProjectFactory.project() .toBuilder() .slug(param) .build() ); } @Override public @NonNull Observable<Project> fetchProject(final @NonNull Project project) { return Observable.just(project); } @Override public @NonNull Observable<DiscoverEnvelope> fetchProjects(final @NonNull DiscoveryParams params) { return Observable.just( DiscoverEnvelope .builder() .projects( Arrays.asList( ProjectFactory.project(), ProjectFactory.allTheWayProject(), ProjectFactory.successfulProject() ) ) .urls( DiscoverEnvelope.UrlsEnvelope .builder() .api( DiscoverEnvelope.UrlsEnvelope.ApiEnvelope .builder() .moreProjects("http://more.projects.please") .build() ) .build() ) .build() ); } @Override public @NonNull Observable<DiscoverEnvelope> fetchProjects(final @NonNull String paginationUrl) { return Observable.empty(); } @Override public @NonNull Observable<CommentsEnvelope> fetchComments(final @NonNull Project project) { return Observable.just(CommentsEnvelopeFactory.commentsEnvelope()); } @Override public @NonNull Observable<CommentsEnvelope> fetchComments(final @NonNull Update update) { return Observable.just(CommentsEnvelopeFactory.commentsEnvelope()); } @Override public @NonNull Observable<CommentsEnvelope> fetchComments(final @NonNull String paginationPath) { return Observable.just(CommentsEnvelopeFactory.commentsEnvelope()); } @Override public @NonNull Observable<MessageThreadEnvelope> fetchMessagesForThread(final @NonNull MessageThread messageThread) { return Observable.empty(); } @Override public @NonNull Observable<MessageThreadsEnvelope> fetchMessageThreads() { return Observable.just(MessageThreadsEnvelopeFactory.messageThreadsEnvelope()); } @Override public @NonNull Observable<MessageThreadsEnvelope> fetchMessageThreads(final @Nullable Project project) { return Observable.just(MessageThreadsEnvelopeFactory.messageThreadsEnvelope()); } @Override public @NonNull Observable<MessageThreadsEnvelope> fetchMessageThreadsWithPaginationPath(final @NonNull String paginationPath) { return Observable.empty(); } @Override public @NonNull Observable<Update> fetchUpdate(final @NonNull String projectParam, final @NonNull String updateParam) { return Observable.just(UpdateFactory.update()); } @Override public @NonNull Observable<Update> fetchUpdate(final @NonNull Update update) { return Observable.empty(); } @Override public @NonNull Observable<AccessTokenEnvelope> loginWithFacebook(final @NonNull String accessToken) { return Observable.just( AccessTokenEnvelope.builder() .user(UserFactory.user() .toBuilder() .build() ) .accessToken("deadbeef") .build() ); } @Override public @NonNull Observable<AccessTokenEnvelope> loginWithFacebook(final @NonNull String fbAccessToken, final @NonNull String code) { return Observable.just( AccessTokenEnvelope.builder() .user(UserFactory.user() .toBuilder() .build() ) .accessToken("deadbeef") .build() ); } @Override public @NonNull Observable<AccessTokenEnvelope> registerWithFacebook(final @NonNull String fbAccessToken, final boolean sendNewsletters) { return Observable.empty(); } @Override public @NonNull Observable<Backing> fetchProjectBacking(final @NonNull Project project, final @NonNull User user) { return Observable.just(BackingFactory.backing(project, user)); } @Override public @NonNull Observable<Category> fetchCategory(final @NonNull String param) { return Observable.just(CategoryFactory.musicCategory()); } @Override public @NonNull Observable<Category> fetchCategory(final @NonNull Category category) { return Observable.empty(); } @Override public @NonNull Observable<User> fetchCurrentUser() { return Observable.empty(); } @Override public @NonNull Observable<Location> fetchLocation(final @NonNull String param) { return Observable.just(LocationFactory.sydney()); } @Override public @NonNull Observable<AccessTokenEnvelope> login(final @NonNull String email, final @NonNull String password) { return Observable.just( AccessTokenEnvelope.builder() .user(UserFactory.user() .toBuilder() .build() ) .accessToken("deadbeef") .build() ); } @Override public @NonNull Observable<AccessTokenEnvelope> login(final @NonNull String email, final @NonNull String password, final @NonNull String code) { return Observable.just( AccessTokenEnvelope.builder() .user(UserFactory.user() .toBuilder() .build() ) .accessToken("deadbeef") .build() ); } @Override public @NonNull Observable<Comment> postComment(final @NonNull Project project, final @NonNull String body) { return Observable.just(CommentFactory.comment().toBuilder().body(body).build()); } @Override public @NonNull Observable<Comment> postComment(final @NonNull Update update, final @NonNull String body) { return Observable.just(CommentFactory.comment().toBuilder().body(body).build()); } @Override public @NonNull Observable<Empty> registerPushToken(final @NonNull String token) { return Observable.empty(); } @Override public @NonNull Observable<User> resetPassword(final @NonNull String email) { return Observable.just(UserFactory.user()); } @Override public @NonNull Observable<Message> sendMessageToThread(final @NonNull MessageThread thread, final @NonNull String body) { return Observable.just(MessageFactory.message()); } @Override public @NonNull Observable<AccessTokenEnvelope> signup(final @NonNull String name, final @NonNull String email, final @NonNull String password, final @NonNull String passwordConfirmation, final boolean sendNewsletters) { return Observable.just( AccessTokenEnvelope.builder() .user(UserFactory.user() .toBuilder() .name(name) .build() ) .accessToken("deadbeef") .build() ); } @Override public @NonNull Observable<Project> starProject(final @NonNull Project project) { return Observable.just(project.toBuilder().isStarred(true).build()); } @Override public @NonNull Observable<SurveyResponse> fetchSurveyResponse(final int surveyResponseId) { return Observable.just(SurveyResponseFactory.surveyResponse().toBuilder().id(surveyResponseId).build()); } @Override public @NonNull Observable<Project> toggleProjectStar(final @NonNull Project project) { return Observable.just(project.toBuilder().isStarred(!project.isStarred()).build()); } @Override public @NonNull Observable<List<SurveyResponse>> fetchUnansweredSurveys() { return Observable.just(Arrays.asList(SurveyResponseFactory.surveyResponse(), SurveyResponseFactory.surveyResponse())); } @Override public @NonNull Observable<ProjectNotification> updateProjectNotifications(final @NonNull ProjectNotification projectNotification, final boolean checked) { return Observable.just(projectNotification.toBuilder().email(checked).mobile(checked).build()); } @Override public @NonNull Observable<User> updateUserSettings(final @NonNull User user) { observable.onNext( Pair.create("update_user_settings", new HashMap<String, Object>() { { put("user", user); } }) ); return Observable.just(user); } }