package com.fernandocejas.frodo.internal.observable;
import com.fernandocejas.frodo.core.optional.Optional;
import com.fernandocejas.frodo.internal.MessageManager;
import com.fernandocejas.frodo.joinpoint.FrodoProceedingJoinPoint;
import java.util.concurrent.TimeUnit;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.runners.MockitoJUnitRunner;
import rx.observers.TestSubscriber;
import rx.schedulers.Schedulers;
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.anyString;
import static org.mockito.Mockito.verify;
@SuppressWarnings("unchecked") @RunWith(MockitoJUnitRunner.class)
public class LogEverythingObservableTest {
@Rule public ObservableRule observableRule = new ObservableRule(this.getClass());
private LogEverythingObservable loggableObservable;
private TestSubscriber subscriber;
@Mock private MessageManager messageManager;
@Before
public void setUp() {
subscriber = new TestSubscriber();
loggableObservable = new LogEverythingObservable(observableRule.joinPoint(), messageManager,
observableRule.info());
}
@Test
public void shouldLogEverythingObservable() throws Throwable {
loggableObservable.get(observableRule.stringType()).subscribe(subscriber);
verify(messageManager).printObservableOnSubscribe(any(ObservableInfo.class));
verify(messageManager).printObservableOnNextWithValue(any(ObservableInfo.class), anyString());
verify(messageManager).printObservableOnCompleted(any(ObservableInfo.class));
verify(messageManager).printObservableOnTerminate(any(ObservableInfo.class));
verify(messageManager).printObservableItemTimeInfo(any(ObservableInfo.class));
verify(messageManager).printObservableOnUnsubscribe(any(ObservableInfo.class));
verify(messageManager).printObservableThreadInfo(any(ObservableInfo.class));
}
@Test
public void shouldFillInObservableBasicInfo() throws Throwable {
loggableObservable.get(observableRule.stringType()).subscribe(subscriber);
final ObservableInfo observableInfo = loggableObservable.getInfo();
final FrodoProceedingJoinPoint frodoProceedingJoinPoint = observableRule.joinPoint();
assertThat(observableInfo.getClassSimpleName()).isEqualTo(
frodoProceedingJoinPoint.getClassSimpleName());
assertThat(observableInfo.getJoinPoint()).isEqualTo(frodoProceedingJoinPoint);
assertThat(observableInfo.getMethodName()).isEqualTo(frodoProceedingJoinPoint.getMethodName());
}
@Test
public void shouldFillInObservableThreadInfo() throws Throwable {
loggableObservable.get(observableRule.stringType())
.subscribeOn(Schedulers.immediate())
.observeOn(Schedulers.immediate())
.subscribe(subscriber);
final ObservableInfo observableInfo = loggableObservable.getInfo();
final Optional<String> subscribeOnThread = observableInfo.getSubscribeOnThread();
final Optional<String> observeOnThread = observableInfo.getObserveOnThread();
final String currentThreadName = Thread.currentThread().getName();
assertThat(subscribeOnThread.isPresent()).isTrue();
assertThat(observeOnThread.isPresent()).isTrue();
assertThat(subscribeOnThread.get()).isEqualTo(currentThreadName);
assertThat(observeOnThread.get()).isEqualTo(currentThreadName);
}
@Test
public void shouldFillInObservableItemsInfo() throws Throwable {
loggableObservable.get(observableRule.stringType())
.delay(2, TimeUnit.SECONDS)
.subscribe(subscriber);
final ObservableInfo observableInfo = loggableObservable.getInfo();
final Optional<Integer> totalEmittedItems = observableInfo.getTotalEmittedItems();
final Optional<Long> totalExecutionTime = observableInfo.getTotalExecutionTime();
assertThat(totalEmittedItems.isPresent()).isTrue();
assertThat(totalExecutionTime.isPresent()).isTrue();
assertThat(totalEmittedItems.get()).isEqualTo(1);
}
}