@Test
  public void testDisallowed() throws Exception {
    final InvocationContext context = mock(InvocationContext.class);

    final Invocation invocation = mock(Invocation.class);
    when(invocation.getInvocationContext()).thenReturn(context);

    CashRepository cashRepository = mock(CashRepository.class);
    final CoinReceiveCash cash1 = new CoinReceiveCash();
    cash1.confirm(BigMoney.of(CurrencyUnit.of("BTC"), BigDecimal.TEN), new Date());
    final CoinReceiveCash cash2 = new CoinReceiveCash();
    cash2.confirm(BigMoney.of(CurrencyUnit.of("BTC"), BigDecimal.ONE), new Date());
    when(cashRepository.findByDueDate(any(Date.class))).thenReturn(ImmutableList.of(cash1, cash2));

    DueDateService dateService = mock(DueDateService.class);

    final GlobalMaxAmountPerDayExecutingInterceptor interceptor =
        new GlobalMaxAmountPerDayExecutingInterceptor("BTC 10");
    interceptor.setCashRepository(cashRepository);
    interceptor.setService(dateService);

    final ValidationCode validationCode = interceptor.intercept(invocation);

    assertThat(validationCode, is(ValidationCode.EXCEEDED_GLOBAL_MAX_AMOUNT_PER_DAY));

    verify(dateService).computeDueDate(any(Date.class));
    verify(invocation, never()).invoke();
  }
  @Test
  public void testAllowed() throws Exception {
    final InvocationContext context = mock(InvocationContext.class);

    final Invocation invocation = mock(Invocation.class);
    when(invocation.getInvocationContext()).thenReturn(context);

    CashRepository cashRepository = mock(CashRepository.class);
    final CoinReceiveCash cash1 = new CoinReceiveCash();
    cash1.confirm(BigMoney.of(CurrencyUnit.of("BTC"), BigDecimal.TEN), new Date());
    final CoinReceiveCash cash2 = new CoinReceiveCash();
    cash2.confirm(BigMoney.of(CurrencyUnit.of("BTC"), BigDecimal.ONE), new Date());
    when(cashRepository.findByDueDate(any(Date.class)))
        .thenReturn(ImmutableList.of(cash1), ImmutableList.of(cash2));

    DueDateService dateService = mock(DueDateService.class);

    final GlobalMaxAmountPerDayExecutingInterceptor interceptor =
        new GlobalMaxAmountPerDayExecutingInterceptor("BTC 10");
    interceptor.setCashRepository(cashRepository);
    interceptor.setService(dateService);

    final ValidationCode validationCode1 = interceptor.intercept(invocation);
    final ValidationCode validationCode2 = interceptor.intercept(invocation);

    assertThat(validationCode1, anyOf(nullValue(), is(ValidationCode.SUCCESSFUL)));
    assertThat(validationCode2, anyOf(nullValue(), is(ValidationCode.SUCCESSFUL)));

    verify(invocation, times(2)).invoke();
    verify(dateService, times(2)).computeDueDate(any(Date.class));
    verify(invocation, times(2)).invoke();
  }