Skip to content

Commit 4864588

Browse files
committed
Add new query parameter “places” and “soruce”
In order to get a specific set of decimal places and the exchange rate from a specific source i have added logic to do so
1 parent 4655873 commit 4864588

File tree

2 files changed

+113
-2
lines changed

2 files changed

+113
-2
lines changed

src/Service/ExchangerateHost.php

Lines changed: 33 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,8 @@ final class ExchangerateHost extends HttpService
3434
const LATEST_URL = 'https://api.exchangerate.host/latest?base=%s&v=%s';
3535

3636
const HISTORICAL_URL = 'https://api.exchangerate.host/%s?base=%s';
37+
const OPTION_PLACES = 'places';
38+
const OPTION_SOURCE = 'source';
3739

3840
/**
3941
* {@inheritdoc}
@@ -48,7 +50,7 @@ protected function getLatestExchangeRate(ExchangeRateQuery $exchangeQuery): Exch
4850
date('Y-m-d')
4951
);
5052

51-
return $this->doCreateRate($url, $currencyPair);
53+
return $this->doCreateRate($this->additionalQueryParameters($url, $exchangeQuery), $currencyPair);
5254
}
5355

5456
/**
@@ -64,7 +66,7 @@ protected function getHistoricalExchangeRate(HistoricalExchangeRateQuery $exchan
6466
$exchangeQuery->getCurrencyPair()->getBaseCurrency()
6567
);
6668

67-
return $this->doCreateRate($url, $currencyPair);
69+
return $this->doCreateRate($this->additionalQueryParameters($url, $exchangeQuery), $currencyPair);
6870
}
6971

7072
/**
@@ -111,4 +113,33 @@ public function getName(): string
111113
{
112114
return 'exchangeratehost';
113115
}
116+
117+
private function additionalQueryParameters(string $url, $exchangeRateQuery): string
118+
{
119+
if (isset($this->options[self::OPTION_PLACES])) {
120+
$places = $this->options[self::OPTION_PLACES];
121+
}
122+
123+
if ($exchangeRateQuery->getOption(self::OPTION_PLACES)) {
124+
$places = $exchangeRateQuery->getOption(self::OPTION_PLACES);
125+
}
126+
127+
if (isset($this->options[self::OPTION_SOURCE])) {
128+
$source = $this->options[self::OPTION_SOURCE];
129+
}
130+
131+
if ($exchangeRateQuery->getOption(self::OPTION_SOURCE)) {
132+
$source = $exchangeRateQuery->getOption(self::OPTION_SOURCE);
133+
}
134+
135+
if (isset($places)) {
136+
$url .= '&places=' . $places;
137+
}
138+
139+
if (isset($source)) {
140+
$url .= '&source='. $source;
141+
}
142+
143+
return $url;
144+
}
114145
}

tests/Tests/Service/ExchangerateHostTest.php

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,86 @@ public function it_fetches_a_historical_rate()
8686
$this->assertSame($pair, $rate->getCurrencyPair());
8787
}
8888

89+
/**
90+
* @test
91+
*/
92+
public function it_fetches_uses_a_specific_source_option()
93+
{
94+
$pair = CurrencyPair::createFromString('EUR/AUD');
95+
$uri = 'https://api.exchangerate.host/2000-01-03?base=EUR&source=ecb';
96+
$content = file_get_contents(__DIR__.'/../../Fixtures/Service/ExchangerateHost/historical.json');
97+
$date = new \DateTime('2000-01-03');
98+
99+
$service = new ExchangerateHost($this->getHttpAdapterMock($uri, $content), null, ['source' => 'ecb']);
100+
101+
$rate = $service->getExchangeRate(new HistoricalExchangeRateQuery($pair, $date));
102+
103+
$this->assertEquals(1.5346, $rate->getValue());
104+
$this->assertEquals($date, $rate->getDate());
105+
$this->assertEquals('exchangeratehost', $rate->getProviderName());
106+
$this->assertSame($pair, $rate->getCurrencyPair());
107+
}
108+
109+
/**
110+
* @test
111+
*/
112+
public function it_fetches_uses_a_specific_source_option_overridden_by_exchange_query_method()
113+
{
114+
$pair = CurrencyPair::createFromString('EUR/AUD');
115+
$uri = 'https://api.exchangerate.host/2000-01-03?base=EUR&source=testing';
116+
$content = file_get_contents(__DIR__.'/../../Fixtures/Service/ExchangerateHost/historical.json');
117+
$date = new \DateTime('2000-01-03');
118+
119+
$service = new ExchangerateHost($this->getHttpAdapterMock($uri, $content), null, ['source' => 'ecb']);
120+
121+
$rate = $service->getExchangeRate(new HistoricalExchangeRateQuery($pair, $date, ['source' => 'testing']));
122+
123+
$this->assertEquals(1.5346, $rate->getValue());
124+
$this->assertEquals($date, $rate->getDate());
125+
$this->assertEquals('exchangeratehost', $rate->getProviderName());
126+
$this->assertSame($pair, $rate->getCurrencyPair());
127+
}
128+
129+
/**
130+
* @test
131+
*/
132+
public function it_fetches_uses_a_specific_places_option_overridden_by_exchange_query_method()
133+
{
134+
$pair = CurrencyPair::createFromString('EUR/AUD');
135+
$uri = 'https://api.exchangerate.host/2000-01-03?base=EUR&places=10';
136+
$content = file_get_contents(__DIR__.'/../../Fixtures/Service/ExchangerateHost/historical.json');
137+
$date = new \DateTime('2000-01-03');
138+
139+
$service = new ExchangerateHost($this->getHttpAdapterMock($uri, $content), null, ['places' => 6]);
140+
141+
$rate = $service->getExchangeRate(new HistoricalExchangeRateQuery($pair, $date, ['places' => 10]));
142+
143+
$this->assertEquals(1.5346, $rate->getValue());
144+
$this->assertEquals($date, $rate->getDate());
145+
$this->assertEquals('exchangeratehost', $rate->getProviderName());
146+
$this->assertSame($pair, $rate->getCurrencyPair());
147+
}
148+
149+
/**
150+
* @test
151+
*/
152+
public function it_fetches_uses_a_specific_places_option()
153+
{
154+
$pair = CurrencyPair::createFromString('EUR/AUD');
155+
$uri = 'https://api.exchangerate.host/2000-01-03?base=EUR&places=6';
156+
$content = file_get_contents(__DIR__.'/../../Fixtures/Service/ExchangerateHost/historical.json');
157+
$date = new \DateTime('2000-01-03');
158+
159+
$service = new ExchangerateHost($this->getHttpAdapterMock($uri, $content), null, ['places' => 6]);
160+
161+
$rate = $service->getExchangeRate(new HistoricalExchangeRateQuery($pair, $date));
162+
163+
$this->assertEquals(1.5346, $rate->getValue());
164+
$this->assertEquals($date, $rate->getDate());
165+
$this->assertEquals('exchangeratehost', $rate->getProviderName());
166+
$this->assertSame($pair, $rate->getCurrencyPair());
167+
}
168+
89169
/**
90170
* @test
91171
*/

0 commit comments

Comments
 (0)