package com.piggymetrics.statistics.service; import com.google.common.collect.ImmutableMap; import com.piggymetrics.statistics.client.ExchangeRatesClient; import com.piggymetrics.statistics.domain.Currency; import com.piggymetrics.statistics.domain.ExchangeRatesContainer; import org.junit.Before; import org.junit.Test; import org.mockito.InjectMocks; import org.mockito.Mock; import java.math.BigDecimal; import java.util.Map; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import static org.mockito.Mockito.*; import static org.mockito.MockitoAnnotations.initMocks; public class ExchangeRatesServiceImplTest { @InjectMocks private ExchangeRatesServiceImpl ratesService; @Mock private ExchangeRatesClient client; @Before public void setup() { initMocks(this); } @Test public void shouldReturnCurrentRatesWhenContainerIsEmptySoFar() { ExchangeRatesContainer container = new ExchangeRatesContainer(); container.setRates(ImmutableMap.of( Currency.EUR.name(), new BigDecimal("0.8"), Currency.RUB.name(), new BigDecimal("80") )); when(client.getRates(Currency.getBase())).thenReturn(container); Map<Currency, BigDecimal> result = ratesService.getCurrentRates(); verify(client, times(1)).getRates(Currency.getBase()); assertEquals(container.getRates().get(Currency.EUR.name()), result.get(Currency.EUR)); assertEquals(container.getRates().get(Currency.RUB.name()), result.get(Currency.RUB)); assertEquals(BigDecimal.ONE, result.get(Currency.USD)); } @Test public void shouldNotRequestRatesWhenTodaysContainerAlreadyExists() { ExchangeRatesContainer container = new ExchangeRatesContainer(); container.setRates(ImmutableMap.of( Currency.EUR.name(), new BigDecimal("0.8"), Currency.RUB.name(), new BigDecimal("80") )); when(client.getRates(Currency.getBase())).thenReturn(container); // initialize container ratesService.getCurrentRates(); // use existing container ratesService.getCurrentRates(); verify(client, times(1)).getRates(Currency.getBase()); } @Test public void shouldConvertCurrency() { ExchangeRatesContainer container = new ExchangeRatesContainer(); container.setRates(ImmutableMap.of( Currency.EUR.name(), new BigDecimal("0.8"), Currency.RUB.name(), new BigDecimal("80") )); when(client.getRates(Currency.getBase())).thenReturn(container); final BigDecimal amount = new BigDecimal(100); final BigDecimal expectedConvertionResult = new BigDecimal("1.25"); BigDecimal result = ratesService.convert(Currency.RUB, Currency.USD, amount); assertTrue(expectedConvertionResult.compareTo(result) == 0); } @Test(expected = IllegalArgumentException.class) public void shouldFailToConvertWhenAmountIsNull() { ratesService.convert(Currency.EUR, Currency.RUB, null); } }