package io.kaif.mobile.view.daemon; import static org.mockito.Mockito.*; import java.io.IOException; import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicReference; import org.mockito.Mock; import org.mockito.MockitoAnnotations; import android.test.AndroidTestCase; import io.kaif.mobile.event.vote.VoteArticleSuccessEvent; import io.kaif.mobile.event.vote.VoteDebateSuccessEvent; import io.kaif.mobile.model.Vote; import io.kaif.mobile.service.VoteService; import io.kaif.mobile.test.ModelFixture; import rx.Observable; public class VoteDaemonTest extends AndroidTestCase implements ModelFixture { @Mock private VoteService mockVoteService; private VoteDaemon daemon; @Override protected void setUp() throws Exception { super.setUp(); MockitoAnnotations.initMocks(this); daemon = new VoteDaemon(mockVoteService); } public void testVoteArticle() throws InterruptedException { final Observable<Void> expected = Observable.just(null); when(mockVoteService.voteArticle(new VoteService.VoteArticleEntry("aId", Vote.VoteState.UP))).thenReturn(expected); AtomicReference<VoteArticleSuccessEvent> ref = new AtomicReference<>(); CountDownLatch latch = new CountDownLatch(1); daemon.getSubject(VoteArticleSuccessEvent.class) .cast(VoteArticleSuccessEvent.class) .subscribe(articleEvent -> { ref.set(articleEvent); latch.countDown(); }); daemon.voteArticle("aId", Vote.VoteState.EMPTY, Vote.VoteState.UP); latch.await(3, TimeUnit.SECONDS); assertEquals(new VoteArticleSuccessEvent("aId", Vote.VoteState.UP), ref.get()); } public void testVoteDebate() throws InterruptedException { final Observable<Void> expected = Observable.just(null); when(mockVoteService.voteDebate(new VoteService.VoteDebateEntry("aId", Vote.VoteState.UP))).thenReturn(expected); AtomicReference<VoteDebateSuccessEvent> ref = new AtomicReference<>(); CountDownLatch latch = new CountDownLatch(1); daemon.getSubject(VoteDebateSuccessEvent.class) .cast(VoteDebateSuccessEvent.class) .subscribe(debateSuccessEvent -> { ref.set(debateSuccessEvent); latch.countDown(); }); daemon.voteDebate("aId", Vote.VoteState.EMPTY, Vote.VoteState.UP); latch.await(3, TimeUnit.SECONDS); assertEquals(new VoteDebateSuccessEvent("aId", Vote.VoteState.UP), ref.get()); } public void testVoteArticle_failed() throws InterruptedException { final Observable<Void> expected = Observable.error(new IOException()); when(mockVoteService.voteArticle(new VoteService.VoteArticleEntry("aId", Vote.VoteState.UP))).thenReturn(expected); AtomicReference<VoteArticleSuccessEvent> ref = new AtomicReference<>(); CountDownLatch latch = new CountDownLatch(2); daemon.getSubject(VoteArticleSuccessEvent.class) .cast(VoteArticleSuccessEvent.class) .subscribe(articleEvent -> { ref.set(articleEvent); latch.countDown(); }); daemon.voteArticle("aId", Vote.VoteState.EMPTY, Vote.VoteState.UP); latch.await(3, TimeUnit.SECONDS); assertEquals(new VoteArticleSuccessEvent("aId", Vote.VoteState.EMPTY), ref.get()); } public void testVoteDebate_failed() throws InterruptedException { final Observable<Void> expected = Observable.error(new IOException()); when(mockVoteService.voteDebate(new VoteService.VoteDebateEntry("aId", Vote.VoteState.UP))).thenReturn(expected); AtomicReference<VoteDebateSuccessEvent> ref = new AtomicReference<>(); CountDownLatch latch = new CountDownLatch(2); daemon.getSubject(VoteDebateSuccessEvent.class).subscribe(event -> { ref.set(event); latch.countDown(); }); daemon.voteDebate("aId", Vote.VoteState.EMPTY, Vote.VoteState.UP); latch.await(3, TimeUnit.SECONDS); assertEquals(new VoteDebateSuccessEvent("aId", Vote.VoteState.EMPTY), ref.get()); } }