/*
* Copyright 2016 Jacek Marchwicki <jacek.marchwicki@gmail.com>
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations under
* the License.
*/
package com.appunite.rx.example.ui.posts.create;
import com.appunite.rx.ResponseOrError;
import com.appunite.rx.example.dao.posts.PostsDao;
import com.appunite.rx.example.dao.posts.model.AddPost;
import com.appunite.rx.example.dao.posts.model.PostWithBody;
import com.appunite.rx.example.dao.posts.model.PostsResponse;
import com.google.common.collect.ImmutableList;
import org.junit.Before;
import org.junit.Test;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import java.io.IOException;
import rx.observers.TestSubscriber;
import rx.schedulers.Schedulers;
import rx.schedulers.TestScheduler;
import rx.subjects.TestSubject;
import static com.google.common.truth.Truth.assert_;
import static org.mockito.Matchers.any;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
public class CreatePostPresenterTest {
@Mock
PostsDao postsDao;
private TestScheduler testScheduler = Schedulers.test();
private CreatePostPresenter postPresenter;
private TestSubject<ResponseOrError<PostsResponse>> postsSubject = TestSubject.create(testScheduler);
private TestSubject<ResponseOrError<PostWithBody>> addPostResult = TestSubject.create(testScheduler);
@Before
public void setUp() throws Exception {
MockitoAnnotations.initMocks(this);
when(postsDao.postsObservable()).thenReturn(postsSubject);
when(postsDao.postRequestObserver(any(AddPost.class))).thenReturn(addPostResult);
postPresenter = new CreatePostPresenter(postsDao, testScheduler);
}
@Test
public void testAfterStart_presenterIsNotNull() throws Exception {
assert_().that(postPresenter).isNotNull();
}
@Test
public void testAfterNavigationUpClick_closeActivity() throws Exception {
final TestSubscriber<Object> finishActivity = new TestSubscriber<>();
postPresenter.finishActivityObservable().subscribe(finishActivity);
postPresenter.navigationClickObserver().onNext(null);
assert_().that(finishActivity.getOnNextEvents()).hasSize(1);
}
@Test
public void testAfterStart_activityIsNotClosed() throws Exception {
final TestSubscriber<Object> finishActivity = new TestSubscriber<>();
postPresenter.finishActivityObservable().subscribe(finishActivity);
assert_().that(finishActivity.getOnNextEvents()).isEmpty();
}
@Test
public void testAfterFillingDataAndClickSend_postIsSent() throws Exception {
fillDataAndSubmit();
verify(postsDao).postRequestObserver(new AddPost("pies", "body"));
}
@Test
public void testClickSendWithoutData_postIsNotSend() throws Exception {
postPresenter.sendObservable().onNext(null);
verify(postsDao, never()).postRequestObserver(any(AddPost.class));
}
@Test
public void testClickSendWithEmptyData_postIsNotSend() throws Exception {
postPresenter.bodyObservable().onNext("");
postPresenter.nameObservable().onNext("");
postPresenter.sendObservable().onNext(null);
verify(postsDao, never()).postRequestObserver(any(AddPost.class));
}
@Test
public void testAfterSaveSuccess_closeActivity() throws Exception {
final TestSubscriber<Object> finishActivity = new TestSubscriber<>();
postPresenter.finishActivityObservable().subscribe(finishActivity);
fillDataAndSubmit();
returnCorrectResponse();
assert_().that(finishActivity.getOnNextEvents()).hasSize(1);
}
@Test
public void testAfterSaveSuccess_doNotShowError() throws Exception {
final TestSubscriber<Object> showError = new TestSubscriber<>();
postPresenter.postErrorObservable().subscribe(showError);
fillDataAndSubmit();
returnCorrectResponse();
assert_().that(showError.getOnNextEvents()).isEmpty();
}
@Test
public void testAfterSaveFail_showError() throws Exception {
final TestSubscriber<Object> showError = new TestSubscriber<>();
postPresenter.postErrorObservable().subscribe(showError);
fillDataAndSubmit();
returnException();
assert_().that(showError.getOnNextEvents()).hasSize(1);
}
@Test
public void testAfterSaveFail_doNotCloseActivity() throws Exception {
final TestSubscriber<Object> finishActivity = new TestSubscriber<>();
postPresenter.finishActivityObservable().subscribe(finishActivity);
fillDataAndSubmit();
returnException();
assert_().that(finishActivity.getOnNextEvents()).isEmpty();
}
@Test
public void testAfterBodyIsNotSendAndSubmitClick_showBodyEmptyError() throws Exception {
final TestSubscriber<Object> bodyEmptyError = new TestSubscriber<>();
postPresenter.showBodyIsEmptyErrorObservable().subscribe(bodyEmptyError);
postPresenter.nameObservable().onNext("pies");
postPresenter.sendObservable().onNext(null);
assert_().that(bodyEmptyError.getOnNextEvents()).hasSize(1);
}
@Test
public void testAfterNameIsNotSendAndSubmitClick_showNameEmptyError() throws Exception {
final TestSubscriber<Object> nameEmptyError = new TestSubscriber<>();
postPresenter.showNameIsEmptyErrorObservable().subscribe(nameEmptyError);
postPresenter.bodyObservable().onNext("pies");
postPresenter.sendObservable().onNext(null);
assert_().that(nameEmptyError.getOnNextEvents()).hasSize(1);
}
@Test
public void testAfterBodyIsNullSendAndSubmitClick_showBodyEmptyError() throws Exception {
final TestSubscriber<Object> bodyEmptyError = new TestSubscriber<>();
postPresenter.showBodyIsEmptyErrorObservable().subscribe(bodyEmptyError);
postPresenter.nameObservable().onNext("pies");
postPresenter.bodyObservable().onNext(null);
postPresenter.sendObservable().onNext(null);
assert_().that(bodyEmptyError.getOnNextEvents()).hasSize(1);
}
@Test
public void testAfterNameIsNullSendAndSubmitClick_showNameEmptyError() throws Exception {
final TestSubscriber<Object> nameEmptyError = new TestSubscriber<>();
postPresenter.showNameIsEmptyErrorObservable().subscribe(nameEmptyError);
postPresenter.nameObservable().onNext(null);
postPresenter.bodyObservable().onNext("pies");
postPresenter.sendObservable().onNext(null);
assert_().that(nameEmptyError.getOnNextEvents()).hasSize(1);
}
@Test
public void testAfterBodyIsEmptyStringSendAndSubmitClick_showBodyEmptyError() throws Exception {
final TestSubscriber<Object> bodyEmptyError = new TestSubscriber<>();
postPresenter.showBodyIsEmptyErrorObservable().subscribe(bodyEmptyError);
postPresenter.nameObservable().onNext("pies");
postPresenter.bodyObservable().onNext("");
postPresenter.sendObservable().onNext(null);
assert_().that(bodyEmptyError.getOnNextEvents()).hasSize(1);
}
@Test
public void testAfterNameIsEmptyStringSendAndSubmitClick_showNameEmptyError() throws Exception {
final TestSubscriber<Object> nameEmptyError = new TestSubscriber<>();
postPresenter.showNameIsEmptyErrorObservable().subscribe(nameEmptyError);
postPresenter.nameObservable().onNext("");
postPresenter.bodyObservable().onNext("pies");
postPresenter.sendObservable().onNext(null);
assert_().that(nameEmptyError.getOnNextEvents()).hasSize(1);
}
@Test
public void testAfterStart_progressBarIsHidden() throws Exception {
final TestSubscriber<Boolean> showProgress = new TestSubscriber<>();
postPresenter.progressObservable().subscribe(showProgress);
assert_().that(showProgress.getOnNextEvents()).isEqualTo(ImmutableList.of(false));
}
@Test
public void testAfterFillingDataAndClickSend_progressBarIsShowed() throws Exception {
final TestSubscriber<Object> showProgress = new TestSubscriber<>();
postPresenter.progressObservable().subscribe(showProgress);
fillDataAndSubmit();
assert_().that(showProgress.getOnNextEvents()).isEqualTo(ImmutableList.of(false, true));
}
@Test
public void testAfterSaveSucces_progressBarIsHidden() throws Exception {
final TestSubscriber<Object> hideProgressBar = new TestSubscriber<>();
postPresenter.progressObservable().subscribe(hideProgressBar);
fillDataAndSubmit();
returnCorrectResponse();
assert_().that(hideProgressBar.getOnNextEvents()).isEqualTo(ImmutableList.of(false,true,false));
}
@Test
public void testAfterSaveFail_progressBarIsHidden() throws Exception {
final TestSubscriber<Object> hideProgressBar = new TestSubscriber<>();
postPresenter.progressObservable().subscribe(hideProgressBar);
fillDataAndSubmit();
returnException();
assert_().that(hideProgressBar.getOnNextEvents()).isEqualTo(ImmutableList.of(false,true,false));
}
private void fillDataAndSubmit() {
postPresenter.bodyObservable().onNext("body");
postPresenter.nameObservable().onNext("pies");
postPresenter.sendObservable().onNext(null);
}
private void returnCorrectResponse() {
addPostResult.onNext(ResponseOrError.fromData(new PostWithBody("id", "krowa", "123")), 0);
testScheduler.triggerActions();
}
private void returnException() {
final IOException e = new IOException("xyz");
addPostResult.onNext(ResponseOrError.<PostWithBody>fromError(e), 0);
testScheduler.triggerActions();
}
}