From 7a9f351f6c2b3f2ad44efc4e0c68bd2bc28d4546 Mon Sep 17 00:00:00 2001 From: Samuel Mwangi Date: Sat, 5 Aug 2023 10:45:37 +0300 Subject: [PATCH] Paper cuts --- src/Enum/Status.php | 2 ++ .../Requests/Payment/WalletBalanceRequest.php | 2 +- src/ValueObjects/DataBundlesResponse.php | 7 +++-- src/ValueObjects/DataBundlesResponseEntry.php | 3 +- tests/MobileDataTest.php | 31 ++++++++++++++++--- 5 files changed, 36 insertions(+), 9 deletions(-) diff --git a/src/Enum/Status.php b/src/Enum/Status.php index faf765c..878a71d 100644 --- a/src/Enum/Status.php +++ b/src/Enum/Status.php @@ -7,6 +7,8 @@ enum Status: string { case INSUFFICIENT_BALANCE = 'InsufficientBalance'; + case INVALID_REQUEST = 'InvalidRequest'; + case NOT_SUPPORTED = 'NotSupported'; case INCOMPLETE = 'Incomplete'; case SUBMITTED = 'Submitted'; case BUFFERED = 'Buffered'; diff --git a/src/Saloon/Requests/Payment/WalletBalanceRequest.php b/src/Saloon/Requests/Payment/WalletBalanceRequest.php index ae8d3c1..2e0015c 100644 --- a/src/Saloon/Requests/Payment/WalletBalanceRequest.php +++ b/src/Saloon/Requests/Payment/WalletBalanceRequest.php @@ -17,7 +17,7 @@ class WalletBalanceRequest extends BaseRequest { use HasJsonBody; - public Service $service = Service::PAYMENT; + public Service $service = Service::DATA; protected Method $method = Method::GET; public function resolveEndpoint(): string diff --git a/src/ValueObjects/DataBundlesResponse.php b/src/ValueObjects/DataBundlesResponse.php index 5a3c280..c3d2494 100644 --- a/src/ValueObjects/DataBundlesResponse.php +++ b/src/ValueObjects/DataBundlesResponse.php @@ -23,10 +23,11 @@ public static function fromResponse(Response $response): DataBundlesResponse ->map(function (array $entry) { return new DataBundlesResponseEntry( number: PhoneNumber::make(data_get($entry, 'phoneNumber')), - provider: data_get($entry, 'provider'), + provider: data_get($entry, 'provider','Athena'), status: Status::from(data_get($entry, 'status')), - transactionId: data_get($entry, 'transactionId'), - value: Money::make(data_get($entry, 'value')) + transactionId: data_get($entry, 'transactionId','InvalidRequest'), + value: Money::make(data_get($entry, 'value','USD 0.0')), + errorMessage: data_get($entry, 'errorMessage'), ); }); diff --git a/src/ValueObjects/DataBundlesResponseEntry.php b/src/ValueObjects/DataBundlesResponseEntry.php index 3a3e5de..16a9807 100644 --- a/src/ValueObjects/DataBundlesResponseEntry.php +++ b/src/ValueObjects/DataBundlesResponseEntry.php @@ -14,7 +14,8 @@ public function __construct( public readonly string $provider, public readonly Status $status, public readonly string $transactionId, - public readonly Money $value + public readonly Money $value, + public readonly string|null $errorMessage = null ) { } diff --git a/tests/MobileDataTest.php b/tests/MobileDataTest.php index 22ce13c..7a9a865 100644 --- a/tests/MobileDataTest.php +++ b/tests/MobileDataTest.php @@ -15,20 +15,20 @@ use SamuelMwangiW\Africastalking\ValueObjects\MobileDataTransaction; it('can be resolved') - ->expect(fn () => africastalking()->mobileData()) + ->expect(fn() => africastalking()->mobileData()) ->toBeInstanceOf(MobileData::class); it('can be resolved via the Facade') - ->expect(fn () => Africastalking::mobileData()) + ->expect(fn() => Africastalking::mobileData()) ->toBeInstanceOf(MobileData::class); it('can be resolved via bundles alias') - ->expect(fn () => africastalking()->bundles()) + ->expect(fn() => africastalking()->bundles()) ->toBeInstanceOf(MobileData::class); it('sends idempotency requests') ->expect( - fn () => app(MobileData::class)->idempotent('key_123') + fn() => app(MobileData::class)->idempotent('key_123') )->toBeInstanceOf(MobileData::class) ->idempotencyKey()->toBe('key_123'); @@ -158,3 +158,26 @@ ->entries->toHaveCount(3) ->each->toBeInstanceOf(DataBundlesResponseEntry::class); })->with('phone-numbers'); + +it('defaults values for an invalid request', function (): void { + Saloon::fake([ + SendRequest::class => MockResponse::fixture('mobile-data/invalid'), + ]); + + $object = app(MobileData::class); + $result = $object + ->to( + phoneNumber: fake()->e164PhoneNumber(), + quantity: 7, + validity: BundlesValidity::DAILY + )->idempotent(key: fake()->uuid()) + ->send(); + + expect($result) + ->toBeInstanceOf(DataBundlesResponse::class) + ->entries->toHaveCount(1) + ->each->toBeInstanceOf(DataBundlesResponseEntry::class) + ->and($result->entries->first()) + ->provider->toBe('Athena') + ->transactionId->toBe('InvalidRequest'); +});