Skip to content

Commit 6c60aa0

Browse files
committed
Test other edge cases
1 parent 02642b1 commit 6c60aa0

7 files changed

Lines changed: 136 additions & 7 deletions

File tree

tests/CurrentRateTest.php

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
use Peso\Core\Responses\ErrorResponse;
1111
use Peso\Core\Responses\ExchangeRateResponse;
1212
use Peso\Services\CurrencyApiService;
13+
use Peso\Services\CurrencyApiService\Subscription;
1314
use Peso\Services\Tests\Helpers\MockClient;
1415
use PHPUnit\Framework\TestCase;
1516
use Symfony\Component\Cache\Adapter\ArrayAdapter;
@@ -22,7 +23,7 @@ public function testRate(): void
2223
$cache = new Psr16Cache(new ArrayAdapter());
2324
$http = MockClient::get();
2425

25-
$service = new CurrencyApiService('xxxfreexxx', cache: $cache, httpClient: $http);
26+
$service = new CurrencyApiService('xxxfreexxx', Subscription::Free, cache: $cache, httpClient: $http);
2627
$today = Calendar::parse('2025-07-28');
2728

2829
$response = $service->send(new CurrentExchangeRateRequest('EUR', 'USD'));
@@ -53,7 +54,7 @@ public function testRateWithSymbols(): void
5354
$cache = new Psr16Cache(new ArrayAdapter());
5455
$http = MockClient::get();
5556

56-
$service = new CurrencyApiService('xxxfreexxx', symbols: [
57+
$service = new CurrencyApiService('xxxfreexxx', Subscription::Free, symbols: [
5758
'EUR', 'USD',
5859
], cache: $cache, httpClient: $http);
5960
$today = Calendar::parse('2025-07-28');
@@ -86,7 +87,7 @@ public function testInvalidCurrency(): void
8687
$cache = new Psr16Cache(new ArrayAdapter());
8788
$http = MockClient::get();
8889

89-
$service = new CurrencyApiService('xxxfreexxx', cache: $cache, httpClient: $http);
90+
$service = new CurrencyApiService('xxxfreexxx', Subscription::Free, cache: $cache, httpClient: $http);
9091

9192
$response = $service->send(new CurrentExchangeRateRequest('XBT', 'USD'));
9293
self::assertInstanceOf(ErrorResponse::class, $response);

tests/EdgeCasesTest.php

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Peso\Services\Tests;
6+
7+
use Peso\Core\Exceptions\RequestNotSupportedException;
8+
use Peso\Core\Requests\CurrentConversionRequest;
9+
use Peso\Core\Requests\CurrentExchangeRateRequest;
10+
use Peso\Core\Responses\ErrorResponse;
11+
use Peso\Core\Services\SDK\Exceptions\HttpFailureException;
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+
18+
final class EdgeCasesTest extends TestCase
19+
{
20+
public function testInvalidRequest(): void
21+
{
22+
$service = new CurrencyApiService('xxx', Subscription::Free);
23+
24+
$response = $service->send(new CurrentConversionRequest(Decimal::init('100'), 'TRY', 'PHP'));
25+
self::assertInstanceOf(ErrorResponse::class, $response);
26+
self::assertInstanceOf(RequestNotSupportedException::class, $response->exception);
27+
self::assertEquals(
28+
'Unsupported request type: "Peso\Core\Requests\CurrentConversionRequest"',
29+
$response->exception->getMessage(),
30+
);
31+
}
32+
33+
public function testInvalidKey(): void
34+
{
35+
$http = MockClient::get();
36+
$service = new CurrencyApiService('invalid', Subscription::Free, httpClient: $http);
37+
38+
self::expectException(HttpFailureException::class);
39+
self::expectExceptionMessage('Invalid authentication credentials');
40+
$service->send(new CurrentExchangeRateRequest('TRY', 'PHP'));
41+
}
42+
}

tests/HistoricalRateTest.php

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
use Peso\Core\Responses\ErrorResponse;
1111
use Peso\Core\Responses\ExchangeRateResponse;
1212
use Peso\Services\CurrencyApiService;
13+
use Peso\Services\CurrencyApiService\Subscription;
1314
use Peso\Services\Tests\Helpers\MockClient;
1415
use PHPUnit\Framework\TestCase;
1516
use Symfony\Component\Cache\Adapter\ArrayAdapter;
@@ -22,7 +23,7 @@ public function testRate(): void
2223
$cache = new Psr16Cache(new ArrayAdapter());
2324
$http = MockClient::get();
2425

25-
$service = new CurrencyApiService('xxxfreexxx', cache: $cache, httpClient: $http);
26+
$service = new CurrencyApiService('xxxfreexxx', Subscription::Free, cache: $cache, httpClient: $http);
2627
$date = Calendar::parse('2025-06-13');
2728

2829
$response = $service->send(new HistoricalExchangeRateRequest('EUR', 'USD', $date));
@@ -53,7 +54,7 @@ public function testRateWithSymbols(): void
5354
$cache = new Psr16Cache(new ArrayAdapter());
5455
$http = MockClient::get();
5556

56-
$service = new CurrencyApiService('xxxfreexxx', symbols: [
57+
$service = new CurrencyApiService('xxxfreexxx', Subscription::Free, symbols: [
5758
'EUR', 'USD',
5859
], cache: $cache, httpClient: $http);
5960
$date = Calendar::parse('2025-06-13');
@@ -89,7 +90,7 @@ public function testInvalidCurrency(): void
8990
$cache = new Psr16Cache(new ArrayAdapter());
9091
$http = MockClient::get();
9192

92-
$service = new CurrencyApiService('xxxfreexxx', cache: $cache, httpClient: $http);
93+
$service = new CurrencyApiService('xxxfreexxx', Subscription::Free, cache: $cache, httpClient: $http);
9394
$date = Calendar::parse('2025-06-13');
9495

9596
$response = $service->send(new HistoricalExchangeRateRequest('XBT', 'USD', $date));

tests/SupportTest.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,14 +11,15 @@
1111
use Peso\Core\Requests\HistoricalExchangeRateRequest;
1212
use Peso\Core\Types\Decimal;
1313
use Peso\Services\CurrencyApiService;
14+
use Peso\Services\CurrencyApiService\Subscription;
1415
use PHPUnit\Framework\TestCase;
1516
use stdClass;
1617

1718
final class SupportTest extends TestCase
1819
{
1920
public function testRequests(): void
2021
{
21-
$service = new CurrencyApiService('xxxfreexxx');
22+
$service = new CurrencyApiService('xxxfreexxx', Subscription::Free);
2223

2324
self::assertTrue($service->supports(new CurrentExchangeRateRequest('EUR', 'USD')));
2425
self::assertTrue($service->supports(new HistoricalExchangeRateRequest('EUR', 'USD', Date::today())));

tests/UserAgentTest.php

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Peso\Services\Tests;
6+
7+
use Composer\InstalledVersions;
8+
use Http\Discovery\Psr17Factory;
9+
use Peso\Core\Requests\CurrentExchangeRateRequest;
10+
use Peso\Services\CurrencyApiService;
11+
use Peso\Services\CurrencyApiService\Subscription;
12+
use Peso\Services\Tests\Helpers\MockClient;
13+
use PHPUnit\Framework\TestCase;
14+
use Psr\Http\Message\RequestFactoryInterface;
15+
use Psr\Http\Message\RequestInterface;
16+
use Symfony\Component\Cache\Adapter\ArrayAdapter;
17+
use Symfony\Component\Cache\Psr16Cache;
18+
19+
final class UserAgentTest extends TestCase
20+
{
21+
public function testUserAgent(): void
22+
{
23+
$cache = new Psr16Cache(new ArrayAdapter());
24+
$http = MockClient::get();
25+
26+
$service = new CurrencyApiService('xxxfreexxx', Subscription::Free, cache: $cache, httpClient: $http);
27+
28+
$pesoVersion = InstalledVersions::getPrettyVersion('peso/core');
29+
$clientVersion = InstalledVersions::getPrettyVersion('peso/currencyapi-service');
30+
31+
$service->send(new CurrentExchangeRateRequest('EUR', 'USD'));
32+
33+
$request = $http->getLastRequest();
34+
35+
self::assertEquals("Peso/$pesoVersion CurrencyAPI/$clientVersion", $request->getHeaderLine('User-Agent'));
36+
}
37+
38+
public function testCustomUserAgent(): void
39+
{
40+
$cache = new Psr16Cache(new ArrayAdapter());
41+
$http = MockClient::get();
42+
$requestFactory = new class implements RequestFactoryInterface
43+
{
44+
private RequestFactoryInterface $factory;
45+
46+
public function __construct()
47+
{
48+
$this->factory = new Psr17Factory();
49+
}
50+
51+
public function createRequest(string $method, mixed $uri): RequestInterface
52+
{
53+
return $this->factory->createRequest($method, $uri)->withHeader(
54+
'user-agent',
55+
'CustomSuffix/1.0',
56+
);
57+
}
58+
};
59+
60+
$service = new CurrencyApiService(
61+
apiKey: 'xxxfreexxx',
62+
subscription: Subscription::Free,
63+
cache: $cache,
64+
httpClient: $http,
65+
requestFactory: $requestFactory,
66+
);
67+
68+
$pesoVersion = InstalledVersions::getPrettyVersion('peso/core');
69+
$clientVersion = InstalledVersions::getPrettyVersion('peso/currencyapi-service');
70+
71+
$service->send(new CurrentExchangeRateRequest('EUR', 'USD'));
72+
73+
$request = $http->getLastRequest();
74+
75+
self::assertEquals(
76+
"Peso/$pesoVersion CurrencyAPI/$clientVersion CustomSuffix/1.0",
77+
$request->getHeaderLine('User-Agent'),
78+
);
79+
}
80+
}

tests/data/invalid-base.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
{"message":"Validation error","errors":{"base_currency":["The selected base currency is invalid."]},"info":"For more information, see documentation: https:\/\/currencyapi.com\/docs\/status-codes#_422"}

tests/data/invalid-key.json

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
{
2+
"message":"Invalid authentication credentials"
3+
}

0 commit comments

Comments
 (0)