diff --git a/src/Api.php b/src/Api.php index cb14c9f..a3f8936 100644 --- a/src/Api.php +++ b/src/Api.php @@ -14,6 +14,7 @@ use Zoomyboy\LaravelNami\Data\Member; use Zoomyboy\LaravelNami\Data\MemberEntry; use Zoomyboy\LaravelNami\Data\Membership; use Zoomyboy\LaravelNami\Data\MembershipEntry; +use Zoomyboy\LaravelNami\Exceptions\MemberDataCorruptedException; use Zoomyboy\LaravelNami\Exceptions\NotAuthenticatedException; use Zoomyboy\LaravelNami\Support\Paginator; @@ -294,7 +295,11 @@ class Api public function member(int $groupId, int $memberId): Member { - return Member::from($this->rawMember($groupId, $memberId)); + $rawMember = $this->rawMember($groupId, $memberId); + + throw_unless(Member::isCorrupted($rawMember), MemberDataCorruptedException::class, $rawMember); + + return Member::from($rawMember); } public function hasGroup(int $groupId): bool diff --git a/src/Data/Member.php b/src/Data/Member.php index f14316d..07c4d36 100644 --- a/src/Data/Member.php +++ b/src/Data/Member.php @@ -155,4 +155,20 @@ class Member extends Data { return MemberRequestFactory::new(); } + + /** + * @param array<string, mixed> $rawData + */ + public static function isCorrupted(array $rawData): bool + { + if (!data_get($rawData, 'eintrittsdatum')) { + return false; + } + + if (!data_get($rawData, 'landId')) { + return false; + } + + return true; + } } diff --git a/src/Exceptions/MemberDataCorruptedException.php b/src/Exceptions/MemberDataCorruptedException.php new file mode 100644 index 0000000..9dff1af --- /dev/null +++ b/src/Exceptions/MemberDataCorruptedException.php @@ -0,0 +1,16 @@ +<?php + +namespace Zoomyboy\LaravelNami\Exceptions; + +use Exception; + +class MemberDataCorruptedException extends Exception implements Skippable +{ + /** + * @param array<string, mixed> $rawMember + */ + public function __construct(public array $rawMember) + { + parent::__construct('Member data corrupted'); + } +} diff --git a/src/Exceptions/Skippable.php b/src/Exceptions/Skippable.php new file mode 100644 index 0000000..5128ccc --- /dev/null +++ b/src/Exceptions/Skippable.php @@ -0,0 +1,7 @@ +<?php + +namespace Zoomyboy\LaravelNami\Exceptions; + +interface Skippable +{ +} diff --git a/tests/Unit/Api/FetchMemberTest.php b/tests/Unit/Api/FetchMemberTest.php index f8eaeb6..5484d8d 100644 --- a/tests/Unit/Api/FetchMemberTest.php +++ b/tests/Unit/Api/FetchMemberTest.php @@ -2,6 +2,7 @@ namespace Zoomyboy\LaravelNami\Tests\Unit\Member; +use Zoomyboy\LaravelNami\Exceptions\MemberDataCorruptedException; use Zoomyboy\LaravelNami\Fakes\MemberFake; use Zoomyboy\LaravelNami\NamiException; use Zoomyboy\LaravelNami\Tests\TestCase; @@ -112,6 +113,19 @@ class FetchMemberTest extends TestCase $this->assertNull($member->genderId); } + /** + * @testWith [{"eintrittsdatum": null}] + * [{"landId": null}] + */ + public function testFailsFetchingWhenJoinedAtDateIsMissing(array $data): void + { + $this->expectException(MemberDataCorruptedException::class); + + app(MemberFake::class)->shows(1000, 1001, $data); + + $this->login()->member(1000, 1001); + } + public function testMemberFetchCanFail(): void { $this->expectException(NamiException::class);