package brainslug.flow.execution.async;
import brainslug.flow.context.BrainslugContext;
import brainslug.flow.context.TriggerContext;
import org.junit.Test;
import org.mockito.InOrder;
import java.util.Date;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.*;
public class AsyncTriggerExecutorTest {
AsyncTriggerStore asyncTriggerStore = mock(AsyncTriggerStore.class);
AbstractRetryStrategy retryStrategy = mock(AbstractRetryStrategy.class);
BrainslugContext brainslugContext() {
BrainslugContext context = mock(BrainslugContext.class);
return context;
}
@Test
public void shouldRemoveTriggerOnSuccessfulExecution() {
// given:
BrainslugContext context = brainslugContext();
AsyncTrigger asyncTriggerWithRetriesLeft = spy(new AsyncTrigger());
AsyncTriggerExecutor asyncTriggerExecutor = new AsyncTriggerExecutor();
when(retryStrategy.nextRetry(anyLong(), any(Date.class))).thenReturn(new Date(0));
when(asyncTriggerStore.removeTrigger(any(AsyncTrigger.class))).thenReturn(true);
// when:
asyncTriggerExecutor.execute(asyncTriggerWithRetriesLeft, retryStrategy, context, asyncTriggerStore);
// then:
InOrder order = inOrder(asyncTriggerWithRetriesLeft, asyncTriggerStore, retryStrategy);
order.verify(asyncTriggerStore).removeTrigger(asyncTriggerWithRetriesLeft);
}
@Test
public void shouldIncrementRetriesOnFailedExecution() {
// given:
BrainslugContext context = brainslugContext();
AsyncTrigger asyncTriggerWithRetriesLeft = spy(new AsyncTrigger());
AsyncTriggerExecutor asyncTriggerExecutor = new AsyncTriggerExecutor();
doThrow(new RuntimeException()).when(context).trigger(any(TriggerContext.class));
when(retryStrategy.nextRetry(anyLong(), any(Date.class))).thenReturn(new Date(0));
// when:
asyncTriggerExecutor.execute(asyncTriggerWithRetriesLeft, retryStrategy, context, asyncTriggerStore);
// then:
InOrder order = inOrder(asyncTriggerWithRetriesLeft, asyncTriggerStore, retryStrategy);
order.verify(asyncTriggerWithRetriesLeft).incrementRetries();
order.verify(retryStrategy).nextRetry(eq(1l), any(Date.class));
order.verify(asyncTriggerStore).updateTrigger(asyncTriggerWithRetriesLeft);
}
}