Skip to content

Commit d43bdfe

Browse files
committed
Historical conversion test
1 parent 72ddef7 commit d43bdfe

9 files changed

Lines changed: 182 additions & 1 deletion

tests/Helpers/MockClient.php

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,33 @@ static function (RequestInterface $request) {
107107
return new Response(body: fopen(__DIR__ . '/../data/conv/latest-USD.json', 'r'));
108108

109109
case 'apikey=xxxpaidxxx&base_currency=EUR&value=1234.56&currencies=USD%2CJPY%2CPHP%2CBYN':
110-
return new Response(body: fopen(__DIR__ . '/../data/conv/latest-EUR-USD,JPY,PHP,BYN.json', 'r'));
110+
return new Response(
111+
body: fopen(__DIR__ . '/../data/conv/latest-EUR-USD,JPY,PHP,BYN.json', 'r'),
112+
);
113+
114+
case 'apikey=xxxpaidxxx&base_currency=EUR&value=1234.56&' .
115+
'currencies=USD%2CJPY%2CPHP%2CBYN&date=2025-06-13':
116+
return new Response(
117+
body: fopen(__DIR__ . '/../data/conv/2025-06-13-EUR-USD,JPY,PHP,BYN.json', 'r'),
118+
);
119+
120+
case 'apikey=xxxpaidxxx&base_currency=EUR&value=1234.56&date=2025-06-13':
121+
return new Response(body: fopen(__DIR__ . '/../data/conv/2025-06-13-EUR.json', 'r'));
122+
123+
case 'apikey=xxxpaidxxx&base_currency=EUR&value=12.3456&date=2025-06-13':
124+
return new Response(body: fopen(__DIR__ . '/../data/conv/2025-06-13-EUR-small.json', 'r'));
125+
126+
case 'apikey=xxxpaidxxx&base_currency=EUR&value=1234.56&currencies=USD&date=2025-06-13':
127+
return new Response(body: fopen(__DIR__ . '/../data/conv/2025-06-13-EUR-USD.json', 'r'));
128+
129+
case 'apikey=xxxpaidxxx&base_currency=USD&value=1234.56&date=2025-06-13':
130+
return new Response(body: fopen(__DIR__ . '/../data/conv/2025-06-13-USD.json', 'r'));
131+
132+
case 'apikey=xxxpaidxxx&base_currency=USD&value=1234.56&currencies=RUB&date=2025-06-13':
133+
return new Response(body: fopen(__DIR__ . '/../data/conv/2025-06-13-USD-RUB.json', 'r'));
134+
135+
case 'apikey=xxxpaidxxx&base_currency=RUB&value=1234.56&currencies=PHP&date=2025-06-13':
136+
return new Response(body: fopen(__DIR__ . '/../data/conv/2025-06-13-RUB-PHP.json', 'r'));
111137

112138
default:
113139
throw new \LogicException('Non-mocked query: ' . $query);

tests/HistoricalConversionTest.php

Lines changed: 148 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,148 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Peso\Services\Tests;
6+
7+
use Arokettu\Date\Calendar;
8+
use Peso\Core\Exceptions\ConversionNotPerformedException;
9+
use Peso\Core\Requests\HistoricalConversionRequest;
10+
use Peso\Core\Responses\ConversionResponse;
11+
use Peso\Core\Responses\ErrorResponse;
12+
use Peso\Core\Types\Decimal;
13+
use Peso\Services\CurrencyApiService;
14+
use Peso\Services\CurrencyApiService\Subscription;
15+
use Peso\Services\Tests\Helpers\MockClient;
16+
use PHPUnit\Framework\TestCase;
17+
use Symfony\Component\Cache\Adapter\ArrayAdapter;
18+
use Symfony\Component\Cache\Psr16Cache;
19+
20+
final class HistoricalConversionTest extends TestCase
21+
{
22+
public function testCurrentConv(): void
23+
{
24+
$cache = new Psr16Cache(new ArrayAdapter());
25+
$http = MockClient::get();
26+
27+
$service = new CurrencyApiService('xxxpaidxxx', Subscription::Paid, cache: $cache, httpClient: $http);
28+
$date = Calendar::parse('2025-06-13');
29+
30+
$response = $service->send(
31+
new HistoricalConversionRequest(Decimal::init('1234.56'), 'EUR', 'USD', $date),
32+
);
33+
self::assertInstanceOf(ConversionResponse::class, $response);
34+
self::assertEquals('1425.3747463979', $response->amount->value);
35+
self::assertEquals('2025-06-13', $response->date->toString());
36+
37+
$response = $service->send(
38+
new HistoricalConversionRequest(Decimal::init('1234.56'), 'USD', 'RUB', $date),
39+
);
40+
self::assertInstanceOf(ConversionResponse::class, $response);
41+
self::assertEquals('98381.209399934', $response->amount->value);
42+
self::assertEquals('2025-06-13', $response->date->toString());
43+
44+
$response = $service->send(
45+
new HistoricalConversionRequest(Decimal::init('1234.56'), 'RUB', 'PHP', $date),
46+
);
47+
self::assertInstanceOf(ConversionResponse::class, $response);
48+
self::assertEquals('870.9696081416', $response->amount->value);
49+
self::assertEquals('2025-06-13', $response->date->toString());
50+
}
51+
52+
public function testCurrentMulticonv(): void
53+
{
54+
$cache = new Psr16Cache(new ArrayAdapter());
55+
$http = MockClient::get();
56+
57+
$service = new CurrencyApiService(
58+
'xxxpaidxxx',
59+
Subscription::Paid,
60+
multiconversion: true,
61+
cache: $cache,
62+
httpClient: $http,
63+
);
64+
$date = Calendar::parse('2025-06-13');
65+
66+
$response = $service->send(
67+
new HistoricalConversionRequest(Decimal::init('1234.56'), 'EUR', 'USD', $date),
68+
);
69+
self::assertInstanceOf(ConversionResponse::class, $response);
70+
self::assertEquals('1425.3747463979', $response->amount->value);
71+
self::assertEquals('2025-06-13', $response->date->toString());
72+
73+
$response = $service->send(
74+
new HistoricalConversionRequest(Decimal::init('1234.56'), 'EUR', 'JPY', $date),
75+
);
76+
self::assertInstanceOf(ConversionResponse::class, $response);
77+
self::assertEquals('205514.22533423', $response->amount->value);
78+
self::assertEquals('2025-06-13', $response->date->toString());
79+
80+
$response = $service->send(
81+
new HistoricalConversionRequest(Decimal::init('1234.56'), 'EUR', 'PHP', $date),
82+
);
83+
self::assertInstanceOf(ConversionResponse::class, $response);
84+
self::assertEquals('80134.552261185', $response->amount->value);
85+
self::assertEquals('2025-06-13', $response->date->toString());
86+
87+
self::assertCount(1, $http->getRequests());
88+
89+
// different amount
90+
91+
$response = $service->send(
92+
new HistoricalConversionRequest(Decimal::init('12.3456'), 'EUR', 'USD', $date),
93+
);
94+
self::assertInstanceOf(ConversionResponse::class, $response);
95+
self::assertEquals('14.253747464', $response->amount->value);
96+
self::assertEquals('2025-06-13', $response->date->toString());
97+
98+
// different currency
99+
100+
$response = $service->send(
101+
new HistoricalConversionRequest(Decimal::init('1234.56'), 'USD', 'EUR', $date),
102+
);
103+
self::assertInstanceOf(ConversionResponse::class, $response);
104+
self::assertEquals('1069.2896008237', $response->amount->value);
105+
self::assertEquals('2025-06-13', $response->date->toString());
106+
107+
self::assertCount(3, $http->getRequests());
108+
}
109+
110+
public function testCurrentMulticonvSymbols(): void
111+
{
112+
$cache = new Psr16Cache(new ArrayAdapter());
113+
$http = MockClient::get();
114+
115+
$service = new CurrencyApiService(
116+
'xxxpaidxxx',
117+
Subscription::Paid,
118+
symbols: ['USD', 'JPY', 'PHP', 'BYN'],
119+
multiconversion: true,
120+
cache: $cache,
121+
httpClient: $http,
122+
);
123+
$date = Calendar::parse('2025-06-13');
124+
125+
$response = $service->send(
126+
new HistoricalConversionRequest(Decimal::init('1234.56'), 'EUR', 'USD', $date),
127+
);
128+
self::assertInstanceOf(ConversionResponse::class, $response);
129+
self::assertEquals('1425.3747463979', $response->amount->value);
130+
self::assertEquals('2025-06-13', $response->date->toString());
131+
132+
$response = $service->send(
133+
new HistoricalConversionRequest(Decimal::init('1234.56'), 'EUR', 'JPY', $date),
134+
);
135+
self::assertInstanceOf(ConversionResponse::class, $response);
136+
self::assertEquals('205514.22533423', $response->amount->value);
137+
self::assertEquals('2025-06-13', $response->date->toString());
138+
139+
$response = $service->send(
140+
new HistoricalConversionRequest(Decimal::init('1234.56'), 'EUR', 'TRY', $date),
141+
);
142+
self::assertInstanceOf(ErrorResponse::class, $response);
143+
self::assertInstanceOf(ConversionNotPerformedException::class, $response->exception);
144+
self::assertEquals('Unable to convert 1234.56 EUR to TRY on 2025-06-13', $response->exception->getMessage());
145+
146+
self::assertCount(1, $http->getRequests());
147+
}
148+
}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
{"meta":{"last_updated_at":"2025-06-13T23:59:59Z"},"data":{"BYN":{"code":"BYN","value":4651.864640146},"JPY":{"code":"JPY","value":205514.2253342289},"PHP":{"code":"PHP","value":80134.5522611854},"USD":{"code":"USD","value":1425.3747463979}}}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
{"meta":{"last_updated_at":"2025-06-13T23:59:59Z"},"data":{"USD":{"code":"USD","value":1425.3747463979}}}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
{"meta":{"last_updated_at":"2025-06-13T23:59:59Z"},"data":{"ADA":{"code":"ADA","value":22.1416090595},"AED":{"code":"AED","value":52.3572987081},"AFN":{"code":"AFN","value":993.837796021},"ALL":{"code":"ALL","value":1210.5503038441},"AMD":{"code":"AMD","value":5445.9685185611},"ANG":{"code":"ANG","value":24.2916675356},"AOA":{"code":"AOA","value":12989.1723573423},"ARB":{"code":"ARB","value":40.8182127072},"ARS":{"code":"ARS","value":16839.9451602886},"AUD":{"code":"AUD","value":21.9764311069},"AVAX":{"code":"AVAX","value":0.7327328924},"AWG":{"code":"AWG","value":25.5142079605},"AZN":{"code":"AZN","value":24.2313706888},"BAM":{"code":"BAM","value":24.1290330952},"BBD":{"code":"BBD","value":28.507494928},"BDT":{"code":"BDT","value":1747.5594476469},"BGN":{"code":"BGN","value":24.146565397},"BHD":{"code":"BHD","value":5.3594090465},"BIF":{"code":"BIF","value":37457.8635649261},"BMD":{"code":"BMD","value":14.253747464},"BNB":{"code":"BNB","value":0.0216470343},"BND":{"code":"BND","value":18.2613330224},"BOB":{"code":"BOB","value":98.5169320852},"BRL":{"code":"BRL","value":79.0463033412},"BSD":{"code":"BSD","value":14.253747464},"BTC":{"code":"BTC","value":0.0001341311},"BTN":{"code":"BTN","value":1119.0108303122},"BWP":{"code":"BWP","value":190.9785782001},"BYN":{"code":"BYN","value":46.5186464015},"BYR":{"code":"BYR","value":465186.4706143378},"BZD":{"code":"BZD","value":28.507494928},"CAD":{"code":"CAD","value":19.3678515862},"CDF":{"code":"CDF","value":40676.870422787},"CHF":{"code":"CHF","value":11.5630695379},"CLF":{"code":"CLF","value":0.3351056656},"CLP":{"code":"CLP","value":13366.6126566838},"CNY":{"code":"CNY","value":102.2894681296},"COP":{"code":"COP","value":58776.7734642133},"CRC":{"code":"CRC","value":7185.4592208676},"CUC":{"code":"CUC","value":14.253747464},"CUP":{"code":"CUP","value":342.0899391355},"CVE":{"code":"CVE","value":1365.5601876495},"CZK":{"code":"CZK","value":306.425127058},"DAI":{"code":"DAI","value":14.2175031176},"DJF":{"code":"DJF","value":2533.1902530457},"DKK":{"code":"DKK","value":92.0672482123},"DOP":{"code":"DOP","value":840.2870343141},"DOT":{"code":"DOT","value":3.7020229164},"DZD":{"code":"DZD","value":1859.0372018075},"EGP":{"code":"EGP","value":709.3795036432},"ERN":{"code":"ERN","value":213.8062119597},"ETB":{"code":"ETB","value":1916.215254255},"ETH":{"code":"ETH","value":0.0055190124},"EUR":{"code":"EUR","value":12.3456},"FJD":{"code":"FJD","value":32.2813218103},"FKP":{"code":"FKP","value":10.5056513212},"GBP":{"code":"GBP","value":10.5048711637},"GEL":{"code":"GEL","value":38.7940041211},"GGP":{"code":"GGP","value":10.5056513853},"GHS":{"code":"GHS","value":146.6995839412},"GIP":{"code":"GIP","value":10.505651411},"GMD":{"code":"GMD","value":1004.1578735164},"GNF":{"code":"GNF","value":123723.2709907282},"GTQ":{"code":"GTQ","value":109.356765948},"GYD":{"code":"GYD","value":2976.1992120239},"HKD":{"code":"HKD","value":111.9157389339},"HNL":{"code":"HNL","value":371.510153879},"HRK":{"code":"HRK","value":88.9288545693},"HTG":{"code":"HTG","value":1891.4132360466},"HUF":{"code":"HUF","value":4965.8537433952},"IDR":{"code":"IDR","value":231840.4985834577},"ILS":{"code":"ILS","value":51.6252255457},"IMP":{"code":"IMP","value":10.5056505486},"INR":{"code":"INR","value":1226.1709382491},"IQD":{"code":"IQD","value":18654.1369271159},"IRR":{"code":"IRR","value":598377.6472306644},"ISK":{"code":"ISK","value":1779.5469128952},"JEP":{"code":"JEP","value":10.50565119},"JMD":{"code":"JMD","value":2262.4979042106},"JOD":{"code":"JOD","value":10.1201606994},"JPY":{"code":"JPY","value":2055.1422533423},"KES":{"code":"KES","value":1844.3897804914},"KGS":{"code":"KGS","value":1243.8507526923},"KHR":{"code":"KHR","value":57024.1364392428},"KMF":{"code":"KMF","value":6078.6143537903},"KPW":{"code":"KPW","value":12826.9831707745},"KRW":{"code":"KRW","value":19469.4193456349},"KWD":{"code":"KWD","value":4.3451130597},"KYD":{"code":"KYD","value":11.8780753742},"KZT":{"code":"KZT","value":7301.7912154344},"LAK":{"code":"LAK","value":305921.9198613095},"LBP":{"code":"LBP","value":1275964.1836015338},"LKR":{"code":"LKR","value":4256.6278850424},"LRD":{"code":"LRD","value":2836.9782068373},"LSL":{"code":"LSL","value":255.7328029481},"LTC":{"code":"LTC","value":0.164619878},"LTL":{"code":"LTL","value":42.5999425955},"LVL":{"code":"LVL","value":8.6710034157},"LYD":{"code":"LYD","value":77.6052492474},"MAD":{"code":"MAD","value":129.8864430642},"MATIC":{"code":"MATIC","value":69.5068061791},"MDL":{"code":"MDL","value":243.1752423185},"MGA":{"code":"MGA","value":63518.4633976063},"MKD":{"code":"MKD","value":759.2198326305},"MMK":{"code":"MMK","value":29897.2947611615},"MNT":{"code":"MNT","value":51027.0633666298},"MOP":{"code":"MOP","value":114.9653289351},"MRO":{"code":"MRO","value":5088.5853929958},"MRU":{"code":"MRU","value":564.427548509},"MUR":{"code":"MUR","value":645.5456365741},"MVR":{"code":"MVR","value":220.2904271137},"MWK":{"code":"MWK","value":24701.8985426161},"MXN":{"code":"MXN","value":270.334613213},"MYR":{"code":"MYR","value":60.5348176581},"MZN":{"code":"MZN","value":905.2292702074},"NAD":{"code":"NAD","value":254.8839893546},"NGN":{"code":"NGN","value":22058.4507111223},"NIO":{"code":"NIO","value":523.0323131543},"NOK":{"code":"NOK","value":141.160297478},"NPR":{"code":"NPR","value":1958.5710175177},"NZD":{"code":"NZD","value":23.6962886365},"OMR":{"code":"OMR","value":5.4724418896},"OP":{"code":"OP","value":24.0873044762},"PAB":{"code":"PAB","value":14.2476203481},"PEN":{"code":"PEN","value":51.5764805915},"PGK":{"code":"PGK","value":58.1310656216},"PHP":{"code":"PHP","value":801.3455226119},"PKR":{"code":"PKR","value":4034.1238981744},"PLN":{"code":"PLN","value":52.6751615014},"PYG":{"code":"PYG","value":113700.5631044924},"QAR":{"code":"QAR","value":51.8998993245},"RON":{"code":"RON","value":62.125964508},"RSD":{"code":"RSD","value":1440.9222183326},"RUB":{"code":"RUB","value":1135.8710099043},"RWF":{"code":"RWF","value":20245.3104455945},"SAR":{"code":"SAR","value":53.4807836986},"SBD":{"code":"SBD","value":119.5479937127},"SCR":{"code":"SCR","value":208.0763788047},"SDG":{"code":"SDG","value":8573.6290995831},"SEK":{"code":"SEK","value":135.222905339},"SGD":{"code":"SGD","value":18.2620459264},"SHP":{"code":"SHP","value":10.5048710055},"SLE":{"code":"SLE","value":326.4113171746},"SLL":{"code":"SLL","value":325444.1768005299},"SOL":{"code":"SOL","value":0.0958508539},"SOS":{"code":"SOS","value":8148.7682760464},"SRD":{"code":"SRD","value":532.3607447186},"STD":{"code":"STD","value":305279.0000840912},"STN":{"code":"STN","value":305.2789881263},"SVC":{"code":"SVC","value":124.7202903098},"SYP":{"code":"SYP","value":185333.921511476},"SZL":{"code":"SZL","value":255.2642732135},"THB":{"code":"THB","value":462.0379917606},"TJS":{"code":"TJS","value":143.712999274},"TMT":{"code":"TMT","value":49.8881161239},"TND":{"code":"TND","value":41.7529374947},"TOP":{"code":"TOP","value":33.4612482611},"TRY":{"code":"TRY","value":562.0317641677},"TTD":{"code":"TTD","value":96.7880872343},"TWD":{"code":"TWD","value":421.4303510734},"TZS":{"code":"TZS","value":36647.1999590917},"UAH":{"code":"UAH","value":592.8153011867},"UGX":{"code":"UGX","value":51349.299478643},"USD":{"code":"USD","value":14.253747464},"USDC":{"code":"USDC","value":14.2086926518},"USDT":{"code":"USDT","value":14.2132272214},"UYU":{"code":"UYU","value":582.8965457479},"UZS":{"code":"UZS","value":182308.9608861534},"VEF":{"code":"VEF","value":145336234.4343662},"VES":{"code":"VES","value":1453.3623515049},"VND":{"code":"VND","value":371106.7807633014},"VUV":{"code":"VUV","value":1698.3396338726},"WST":{"code":"WST","value":37.3329540864},"XAF":{"code":"XAF","value":8096.9477490397},"XAG":{"code":"XAG","value":0.3923863809},"XAU":{"code":"XAU","value":0.004152101},"XCD":{"code":"XCD","value":38.4851181527},"XDR":{"code":"XDR","value":10.4266173332},"XOF":{"code":"XOF","value":8096.9478019367},"XPD":{"code":"XPD","value":0.0138185364},"XPF":{"code":"XPF","value":1471.7224866028},"XPT":{"code":"XPT","value":0.0116263727},"XRP":{"code":"XRP","value":6.6224319901},"YER":{"code":"YER","value":3464.4026366841},"ZAR":{"code":"ZAR","value":255.3041901092},"ZMK":{"code":"ZMK","value":128300.8316727631},"ZMW":{"code":"ZMW","value":345.3572471299},"ZWG":{"code":"ZWG","value":384.5262644149},"ZWL":{"code":"ZWL","value":960825.090421656}}}

0 commit comments

Comments
 (0)