package com.fernandocejas.frodo.aspect; import com.fernandocejas.frodo.internal.Counter; import com.fernandocejas.frodo.internal.MessageManager; import com.fernandocejas.frodo.internal.StopWatch; import com.fernandocejas.frodo.joinpoint.TestJoinPoint; import com.fernandocejas.frodo.joinpoint.TestProceedingJoinPoint; import org.aspectj.lang.JoinPoint; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.runners.MockitoJUnitRunner; import rx.observers.TestSubscriber; import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.BDDMockito.given; import static org.mockito.Matchers.anyInt; import static org.mockito.Matchers.anyLong; import static org.mockito.Matchers.anyObject; import static org.mockito.Matchers.anyString; import static org.mockito.Matchers.eq; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verifyNoMoreInteractions; @RunWith(MockitoJUnitRunner.class) public class LogSubscriberTest { private LogSubscriber logSubscriber; @Mock private Counter counter; @Mock private StopWatch stopWatch; @Mock private MessageManager messageManager; private TestSubscriber subscriber; private TestJoinPoint joinPoint; @Before public void setUp() { logSubscriber = new LogSubscriber(counter, stopWatch, messageManager); subscriber = new TestSubscriber(); joinPoint = new TestJoinPoint.Builder(subscriber.getClass()) .withParamTypes(String.class) .withParamNames("param") .withParamValues("value") .build(); } @Test public void annotatedClassMustCheckTargetType() { final JoinPoint joinPoint = mock(JoinPoint.class); given(joinPoint.getTarget()).willReturn(subscriber); assertThat(LogSubscriber.classAnnotatedWithRxLogSubscriber(joinPoint)).isTrue(); verify(joinPoint).getTarget(); verifyNoMoreInteractions(joinPoint); } @Test public void shouldWeaveClassOfTypeSubscriber() { final TestJoinPoint joinPoint = new TestJoinPoint.Builder(subscriber.getClass()).build(); final TestProceedingJoinPoint proceedingJoinPoint = new TestProceedingJoinPoint(joinPoint); assertThat(LogSubscriber.classAnnotatedWithRxLogSubscriber(proceedingJoinPoint)).isTrue(); } @Test public void shouldNotWeaveClassOfOtherTypeThanSubscriber() { final TestJoinPoint joinPoint = new TestJoinPoint.Builder(this.getClass()).build(); final TestProceedingJoinPoint proceedingJoinPoint = new TestProceedingJoinPoint(joinPoint); assertThat(LogSubscriber.classAnnotatedWithRxLogSubscriber(proceedingJoinPoint)).isFalse(); } @Test public void printOnStartMessageBeforeSubscriberOnStartExecution() { logSubscriber.beforeOnStartExecution(joinPoint); verify(messageManager).printSubscriberOnStart(subscriber.getClass().getSimpleName()); } @Test public void printOnNextMessageBeforeSubscriberOnNextExecution() { logSubscriber.beforeOnNextExecution(joinPoint); verify(counter).increment(); verify(stopWatch).start(); verify(messageManager).printSubscriberOnNext(eq(subscriber.getClass().getSimpleName()), eq("value"), anyString()); } @Test public void printOnNextMessageBeforeSubscriberOnNextExecutionWithEmptyValues() { final TestJoinPoint joinPointTest = new TestJoinPoint.Builder(subscriber.getClass()).withParamTypes(String.class) .withParamNames("param") .withParamValues() .build(); logSubscriber.beforeOnNextExecution(joinPointTest); verify(counter).increment(); verify(stopWatch).start(); verify(messageManager).printSubscriberOnNext(eq(subscriber.getClass().getSimpleName()), anyObject(), anyString()); } @Test public void printOnErrorMessageAfterSubscriberOnErrorExecution() { logSubscriber.afterOnErrorExecution(joinPoint, new IllegalStateException()); verify(stopWatch).stop(); verify(counter).tally(); verify(messageManager).printSubscriberOnError(eq(subscriber.getClass().getSimpleName()), anyString(), anyLong(), anyInt()); verify(counter).clear(); verify(stopWatch).reset(); } @Test public void printOnCompleteMessageBeforeSubscriberOnCompleteExecution() { logSubscriber.beforeOnCompletedExecution(joinPoint); verify(stopWatch).stop(); verify(messageManager).printSubscriberOnCompleted(eq(subscriber.getClass().getSimpleName()), anyLong(), anyInt()); verify(counter).tally(); verify(counter).clear(); verify(stopWatch).getTotalTimeMillis(); verify(stopWatch).reset(); } @Test public void printUnsubscribeMessageAfterSubscriberUnsubscribeMethodCall() { logSubscriber.afterUnsubscribeMethodCall(joinPoint); verify(messageManager).printSubscriberUnsubscribe(subscriber.getClass().getSimpleName()); } @Test public void printRequestedItemsAfterSubscriberRequestMethodCall() { logSubscriber.afterRequestMethodCall(joinPoint, 10); verify(messageManager).printSubscriberRequestedItems(subscriber.getClass().getSimpleName(), 10); } }