public function getExchangeRate($sourceCurrency, $destinationCurrency)
 {
     $rates = $this->apiCall($sourceCurrency, [$destinationCurrency]);
     if (!isset($rates[$destinationCurrency])) {
         throw new FixerCurrencyConversionException("Destination currency {$destinationCurrency} not found in API response");
     }
     return ExchangeRate::create($sourceCurrency, $destinationCurrency, $rates[$destinationCurrency]);
 }
 public function testConvert()
 {
     $sourceCurrency = 'EUR';
     $destinationCurrency = 'USD';
     $mockRate = 1.23;
     $exchangeRate = ExchangeRate::create($sourceCurrency, $destinationCurrency, $mockRate);
     $rateProvider = $this->getMock(ExchangeRatesProviderInterface::class);
     $rateProvider->expects($this->once())->method('getExchangeRate')->will($this->returnValue($exchangeRate));
     $converter = new CurrencyConverter($rateProvider);
     $converted = $converter->convert(100, $sourceCurrency, $destinationCurrency);
     $this->assertEquals(123, $converted);
 }
 public function testGetExchangeRates()
 {
     $sourceCurrency = 'EUR';
     $destinationCurrencies = ['USD', 'GBP'];
     $mockRate = 1.23;
     $exchangeRates = [];
     foreach ($destinationCurrencies as $destinationCurrency) {
         $exchangeRates[] = ExchangeRate::create($sourceCurrency, $destinationCurrency, $mockRate);
     }
     $repository = $this->getMock(ExchangeRateRepositoryInterface::class);
     $repository->expects($this->once())->method('findAllBySourceCurrencyAndDestinationCurrencies')->will($this->returnValue($exchangeRates));
     $dbProvider = new DbExchangeRatesProvider($repository);
     $rates = $dbProvider->getExchangeRates($sourceCurrency, $destinationCurrencies);
     $this->assertInternalType('array', $rates);
     $this->validateExchangeRates($rates, $sourceCurrency, $destinationCurrencies);
 }