Skip to content

Commit adec8ba

Browse files
committed
TrivialService
1 parent f2ed3dc commit adec8ba

2 files changed

Lines changed: 99 additions & 0 deletions

File tree

src/Services/TrivialService.php

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Peso\Core\Services;
6+
7+
use Arokettu\Date\Date;
8+
use Override;
9+
use Peso\Core\Exceptions\ExchangeRateNotFoundException;
10+
use Peso\Core\Exceptions\RequestNotSupportedException;
11+
use Peso\Core\Requests\CurrentExchangeRateRequest;
12+
use Peso\Core\Requests\HistoricalExchangeRateRequest;
13+
use Peso\Core\Responses\ErrorResponse;
14+
use Peso\Core\Responses\ExchangeRateResponse;
15+
use Peso\Core\Types\Decimal;
16+
17+
final readonly class TrivialService implements PesoServiceInterface
18+
{
19+
#[Override]
20+
public function send(object $request): ExchangeRateResponse|ErrorResponse
21+
{
22+
if ($request instanceof CurrentExchangeRateRequest || $request instanceof HistoricalExchangeRateRequest) {
23+
if ($request->baseCurrency === $request->quoteCurrency) {
24+
return new ExchangeRateResponse(new Decimal('1'), Date::today());
25+
} else {
26+
return new ErrorResponse(ExchangeRateNotFoundException::fromRequest($request));
27+
}
28+
}
29+
30+
return new ErrorResponse(RequestNotSupportedException::fromRequest($request));
31+
}
32+
33+
#[Override]
34+
public function supports(object $request): bool
35+
{
36+
return
37+
($request instanceof CurrentExchangeRateRequest || $request instanceof HistoricalExchangeRateRequest) &&
38+
$request->baseCurrency === $request->quoteCurrency;
39+
}
40+
}
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Peso\Core\Tests\Services;
6+
7+
use Arokettu\Date\Calendar;
8+
use Arokettu\Date\Date;
9+
use Peso\Core\Exceptions\ExchangeRateNotFoundException;
10+
use Peso\Core\Exceptions\RequestNotSupportedException;
11+
use Peso\Core\Requests\CurrentConversionRequest;
12+
use Peso\Core\Requests\CurrentExchangeRateRequest;
13+
use Peso\Core\Requests\HistoricalExchangeRateRequest;
14+
use Peso\Core\Responses\ErrorResponse;
15+
use Peso\Core\Responses\ExchangeRateResponse;
16+
use Peso\Core\Services\TrivialService;
17+
use Peso\Core\Types\Decimal;
18+
use PHPUnit\Framework\TestCase;
19+
20+
final class TrivialServiceTest extends TestCase
21+
{
22+
public function testSupports(): void
23+
{
24+
$service = new TrivialService();
25+
26+
self::assertTrue($service->supports(new CurrentExchangeRateRequest('EUR', 'EUR')));
27+
self::assertTrue($service->supports(new HistoricalExchangeRateRequest('PHP', 'PHP', Date::today())));
28+
self::assertFalse($service->supports(new CurrentExchangeRateRequest('TRY', 'RUB')));
29+
self::assertFalse($service->supports(new HistoricalExchangeRateRequest('HUF', 'ZAR', Date::today())));
30+
self::assertFalse($service->supports(new CurrentConversionRequest(Decimal::init(1), 'EUR', 'EUR')));
31+
}
32+
33+
public function testRate(): void
34+
{
35+
$service = new TrivialService();
36+
37+
$response = $service->send(new CurrentExchangeRateRequest('EUR', 'EUR'));
38+
self::assertInstanceOf(ExchangeRateResponse::class, $response);
39+
self::assertEquals('1', $response->rate->value);
40+
41+
$response = $service->send(new HistoricalExchangeRateRequest('HUF', 'HUF', Calendar::parse('2025-06-13')));
42+
self::assertInstanceOf(ExchangeRateResponse::class, $response);
43+
self::assertEquals('1', $response->rate->value);
44+
45+
$response = $service->send(new CurrentExchangeRateRequest('USD', 'CAD'));
46+
self::assertInstanceOf(ErrorResponse::class, $response);
47+
self::assertInstanceOf(ExchangeRateNotFoundException::class, $response->exception);
48+
self::assertEquals('Unable to find exchange rate for USD/CAD', $response->exception->getMessage());
49+
50+
// does not perform conversions
51+
$response = $service->send(new CurrentConversionRequest(Decimal::init('1.00'), 'USD', 'USD'));
52+
self::assertInstanceOf(ErrorResponse::class, $response);
53+
self::assertInstanceOf(RequestNotSupportedException::class, $response->exception);
54+
self::assertEquals(
55+
'Unsupported request type: "Peso\Core\Requests\CurrentConversionRequest"',
56+
$response->exception->getMessage(),
57+
);
58+
}
59+
}

0 commit comments

Comments
 (0)