From 2ea023d4126557cc708efc2f4149daa45433bda2 Mon Sep 17 00:00:00 2001
From: Daniel Seifert <git@daniel-seifert.com>
Date: Tue, 7 Jan 2025 14:05:08 +0100
Subject: [PATCH] assert right return types in Subscriber entity

---
 src/Entities/Subscriber.php            |  86 ++++-----
 tests/unit/Entities/SubscriberTest.php | 245 +++++++++++++++++++++++--
 2 files changed, 263 insertions(+), 68 deletions(-)

diff --git a/src/Entities/Subscriber.php b/src/Entities/Subscriber.php
index 8cc322d..94fd7f9 100644
--- a/src/Entities/Subscriber.php
+++ b/src/Entities/Subscriber.php
@@ -21,9 +21,8 @@ use D3\KlicktippPhpClient\Exceptions\BaseException;
 use D3\KlicktippPhpClient\Resources\Subscriber as SubscriberEndpoint;
 use DateTime;
 use Doctrine\Common\Collections\ArrayCollection;
-use Exception;
 
-class Subscriber extends ArrayCollection
+class Subscriber extends Entity
 {
     public const STATUS_SUBSCRIBED = 'subscribed';
     public const BOUNCE_NOTBOUNCED = 'Not Bounced';
@@ -38,12 +37,12 @@ class Subscriber extends ArrayCollection
 
     public function getId(): ?string
     {
-        return $this->get(SubscriberEndpoint::ID);
+        return $this->getStringOrNullValue($this->get(SubscriberEndpoint::ID));
     }
 
     public function getListId(): ?string
     {
-        return $this->get(SubscriberEndpoint::LISTID);
+        return $this->getStringOrNullValue($this->get(SubscriberEndpoint::LISTID));
     }
 
     public function getOptinTime(): ?DateTime
@@ -60,12 +59,12 @@ class Subscriber extends ArrayCollection
 
     public function getOptinIp(): ?string
     {
-        return $this->get(SubscriberEndpoint::OPTIN_IP);
+        return $this->getStringOrNullValue($this->get(SubscriberEndpoint::OPTIN_IP));
     }
 
     public function getEmailAddress(): ?string
     {
-        return $this->get(SubscriberEndpoint::EMAIL);
+        return $this->getStringOrNullValue($this->get(SubscriberEndpoint::EMAIL));
     }
 
     public function changeEmailAddress(string $emailAddress): void
@@ -77,7 +76,7 @@ class Subscriber extends ArrayCollection
 
     public function getStatus(): ?string
     {
-        return $this->get(SubscriberEndpoint::STATUS);
+        return $this->getStringOrNullValue($this->get(SubscriberEndpoint::STATUS));
     }
 
     public function isSubscribed(): bool
@@ -87,7 +86,7 @@ class Subscriber extends ArrayCollection
 
     public function getBounce(): ?string
     {
-        return $this->get(SubscriberEndpoint::BOUNCE);
+        return $this->getStringOrNullValue($this->get(SubscriberEndpoint::BOUNCE));
     }
 
     public function isBounced(): bool
@@ -102,7 +101,7 @@ class Subscriber extends ArrayCollection
 
     public function getIp(): ?string
     {
-        return $this->get(SubscriberEndpoint::IP);
+        return $this->getStringOrNullValue($this->get(SubscriberEndpoint::IP));
     }
 
     public function getUnsubscription(): ?DateTime
@@ -112,17 +111,17 @@ class Subscriber extends ArrayCollection
 
     public function getUnsubscriptionIp(): ?string
     {
-        return $this->get(SubscriberEndpoint::UNSUBSCRIPTION_IP);
+        return $this->getStringOrNullValue($this->get(SubscriberEndpoint::UNSUBSCRIPTION_IP));
     }
 
     public function getReferrer(): ?string
     {
-        return $this->get(SubscriberEndpoint::REFERRER);
+        return $this->getStringOrNullValue($this->get(SubscriberEndpoint::REFERRER));
     }
 
     public function getSmsPhone(): ?string
     {
-        return $this->get(SubscriberEndpoint::SMS_PHONE);
+        return $this->getStringOrNullValue($this->get(SubscriberEndpoint::SMS_PHONE));
     }
 
     public function setSmsPhone(string $smsPhone): void
@@ -134,12 +133,12 @@ class Subscriber extends ArrayCollection
 
     public function getSmsStatus(): ?string
     {
-        return $this->get(SubscriberEndpoint::SMS_STATUS);
+        return $this->getStringOrNullValue($this->get(SubscriberEndpoint::SMS_STATUS));
     }
 
     public function getSmsBounce(): ?string
     {
-        return $this->get(SubscriberEndpoint::SMS_BOUNCE);
+        return $this->getStringOrNullValue($this->get(SubscriberEndpoint::SMS_BOUNCE));
     }
 
     public function getSmsDate(): ?DateTime
@@ -147,14 +146,14 @@ class Subscriber extends ArrayCollection
         return $this->getDateTimeFromValue($this->get(SubscriberEndpoint::SMS_DATE));
     }
 
-    public function getSmsUnsubscription(): ?string
+    public function getSmsUnsubscription(): ?DateTime
     {
         return $this->getDateTimeFromValue($this->get(SubscriberEndpoint::SMS_UNSUBSCRIPTION));
     }
 
     public function getSmsReferrer(): ?string
     {
-        return $this->get(SubscriberEndpoint::SMS_REFERRER);
+        return $this->getStringOrNullValue($this->get(SubscriberEndpoint::SMS_REFERRER));
     }
 
     public function getFields(): ArrayCollection
@@ -181,14 +180,14 @@ class Subscriber extends ArrayCollection
         return str_starts_with($fieldId, 'field') ? trim($fieldId) : 'field'.trim($fieldId);
     }
 
-    public function getTags(): ArrayCollection
+    public function getTags(): ?ArrayCollection
     {
-        return new ArrayCollection($this->get(SubscriberEndpoint::TAGS) ?? []);
+        return $this->getArrayCollectionFromValue($this->get(SubscriberEndpoint::TAGS));
     }
 
     public function isTagSet(string $tagId): bool
     {
-        return $this->getTags()->contains($tagId);
+        return (bool) $this->getTags()?->contains($tagId);
     }
 
     public function clearTags(): void
@@ -221,14 +220,14 @@ class Subscriber extends ArrayCollection
     /**
      * manuelle Tags
      */
-    public function getManualTags(): ArrayCollection
+    public function getManualTags(): ?ArrayCollection
     {
-        return new ArrayCollection($this->get(SubscriberEndpoint::MANUALTAGS) ?? []);
+        return $this->getArrayCollectionFromValue($this->get(SubscriberEndpoint::MANUALTAGS));
     }
 
     public function isManualTagSet(string $tagId): bool
     {
-        return $this->getManualTags()->containsKey($tagId);
+        return (bool) $this->getManualTags()?->containsKey($tagId);
     }
 
     public function getManualTagTime(string $tagId): ?DateTime
@@ -236,9 +235,9 @@ class Subscriber extends ArrayCollection
         return $this->getDateTimeFromValue($this->getManualTags()->get($tagId));
     }
 
-    public function getSmartTags(): ArrayCollection
+    public function getSmartTags(): ?ArrayCollection
     {
-        return new ArrayCollection($this->get(SubscriberEndpoint::SMARTTAGS) ?? []);
+        return $this->getArrayCollectionFromValue($this->get(SubscriberEndpoint::SMARTTAGS));
     }
 
     public function getSmartTagTime(string $tagId): ?DateTime
@@ -249,9 +248,9 @@ class Subscriber extends ArrayCollection
     /**
      * Kampagne gestartet
      */
-    public function getStartedCampaigns(): ArrayCollection
+    public function getStartedCampaigns(): ?ArrayCollection
     {
-        return new ArrayCollection($this->get(SubscriberEndpoint::CAMPAIGNSSTARTED) ?? []);
+        return $this->getArrayCollectionFromValue($this->get(SubscriberEndpoint::CAMPAIGNSSTARTED));
     }
 
     public function getStartedCampaignTime(string $campaignId): ?DateTime
@@ -262,9 +261,9 @@ class Subscriber extends ArrayCollection
     /**
      * Kampagne beendet
      */
-    public function getFinishedCampaigns(): ArrayCollection
+    public function getFinishedCampaigns(): ?ArrayCollection
     {
-        return new ArrayCollection($this->get(SubscriberEndpoint::CAMPAIGNSFINISHED) ?? []);
+        return $this->getArrayCollectionFromValue($this->get(SubscriberEndpoint::CAMPAIGNSFINISHED));
     }
 
     public function getFinishedCampaignTime(string $campaignId): ?DateTime
@@ -275,41 +274,41 @@ class Subscriber extends ArrayCollection
     /**
      * Email (Marketing Cockpit) erhalten
      */
-    public function getSentNotificationEmails(): ArrayCollection
+    public function getSentNotificationEmails(): ?ArrayCollection
     {
-        return new ArrayCollection($this->get(SubscriberEndpoint::NOTIFICATIONEMAILSSENT) ?? []);
+        return $this->getArrayCollectionFromValue($this->get(SubscriberEndpoint::NOTIFICATIONEMAILSSENT));
     }
 
     /**
      * Email (Marketing Cockpit) geoeffnet
      */
-    public function getOpenedNotificationEmails(): ArrayCollection
+    public function getOpenedNotificationEmails(): ?ArrayCollection
     {
-        return new ArrayCollection($this->get(SubscriberEndpoint::NOTIFICATIONEMAILSOPENED) ?? []);
+        return $this->getArrayCollectionFromValue($this->get(SubscriberEndpoint::NOTIFICATIONEMAILSOPENED));
     }
 
     /**
      * Email (Marketing Cockpit) geklickt
      */
-    public function getClickedNotificationEmails(): ArrayCollection
+    public function getClickedNotificationEmails(): ?ArrayCollection
     {
-        return new ArrayCollection($this->get(SubscriberEndpoint::NOTIFICATIONEMAILSCLICKED) ?? []);
+        return $this->getArrayCollectionFromValue($this->get(SubscriberEndpoint::NOTIFICATIONEMAILSCLICKED));
     }
 
     /**
      * Email (Marketing Cockpit) im Webbrowser angesehen
      */
-    public function getViewedNotificationEmails(): ArrayCollection
+    public function getViewedNotificationEmails(): ?ArrayCollection
     {
-        return new ArrayCollection($this->get(SubscriberEndpoint::NOTIFICATIONEMAILSVIEWED) ?? []);
+        return $this->getArrayCollectionFromValue($this->get(SubscriberEndpoint::NOTIFICATIONEMAILSVIEWED));
     }
 
     /**
      * Outbound ausgeloest
      */
-    public function getOutbounds(): ArrayCollection
+    public function getOutbounds(): ?ArrayCollection
     {
-        return new ArrayCollection($this->get(SubscriberEndpoint::OUTBOUND) ?? []);
+        return $this->getArrayCollectionFromValue($this->get(SubscriberEndpoint::OUTBOUND));
     }
 
     /**
@@ -354,17 +353,6 @@ class Subscriber extends ArrayCollection
         }
     }
 
-    protected function getDateTimeFromValue($value): ?DateTime
-    {
-        try {
-            return $value ?
-                new DateTime((string)$value) :
-                null;
-        } catch (Exception) {
-            return null;
-        }
-    }
-
     // missing getters (return is timestamp list)
 
     // smart_links  SmartLinks
diff --git a/tests/unit/Entities/SubscriberTest.php b/tests/unit/Entities/SubscriberTest.php
index d719d7a..864ad9c 100644
--- a/tests/unit/Entities/SubscriberTest.php
+++ b/tests/unit/Entities/SubscriberTest.php
@@ -18,6 +18,7 @@ declare(strict_types=1);
 namespace D3\KlicktippPhpClient\tests\unit\Entities;
 
 use D3\KlicktippPhpClient\Entities\Subscriber;
+use D3\KlicktippPhpClient\Exceptions\InvalidCredentialTypeException;
 use D3\KlicktippPhpClient\Resources\Subscriber as SubscriberEndpoint;
 use D3\KlicktippPhpClient\tests\TestCase;
 use DateTime;
@@ -27,7 +28,7 @@ use PHPUnit\Framework\MockObject\Rule\InvokedCount;
 use ReflectionException;
 
 /**
- * @coversNothing
+ * @covers \D3\KlicktippPhpClient\Entities\Subscriber
  */
 class SubscriberTest extends TestCase
 {
@@ -52,10 +53,11 @@ class SubscriberTest extends TestCase
                 SubscriberEndpoint::SMS_STATUS                        => "sms status fixture",
                 SubscriberEndpoint::SMS_BOUNCE                        => "sms bounce fixture",
                 SubscriberEndpoint::SMS_DATE                          => "2024-12-23",
-                SubscriberEndpoint::SMS_UNSUBSCRIPTION                => "sms unsubscription fixture",
+// ToDo: is this date real
+                SubscriberEndpoint::SMS_UNSUBSCRIPTION                => "2024-12-24 18:00:00",
                 SubscriberEndpoint::SMS_REFERRER                      => "sms referrer fixture",
-                SubscriberEndpoint::FIELD_FIRSTNAME =>  "",
-                SubscriberEndpoint::FIELD_LASTNAME           => "",
+                SubscriberEndpoint::FIELD_FIRSTNAME =>  "firstName",
+                SubscriberEndpoint::FIELD_LASTNAME           => "lastName",
                 SubscriberEndpoint::FIELD_COMPANYNAME        => "",
                 SubscriberEndpoint::FIELD_STREET1            => "",
                 SubscriberEndpoint::FIELD_STREET2            =>  "",
@@ -169,9 +171,9 @@ class SubscriberTest extends TestCase
      * @covers \D3\KlicktippPhpClient\Entities\Subscriber::getSmsStatus
      * @covers \D3\KlicktippPhpClient\Entities\Subscriber::getSmsBounce
      * @covers \D3\KlicktippPhpClient\Entities\Subscriber::getSmsReferrer
-     * @dataProvider getSomethingDataProvider
+     * @dataProvider getDataProvider
      */
-    public function testGetSomething(string $methodName, string $expectedValue): void
+    public function testGet(string $methodName, string $expectedValue): void
     {
         $this->assertSame(
             $expectedValue,
@@ -179,7 +181,90 @@ class SubscriberTest extends TestCase
         );
     }
 
-    public static function getSomethingDataProvider(): Generator
+    /**
+     * @test
+     * @throws ReflectionException
+     * @covers \D3\KlicktippPhpClient\Entities\Subscriber::getId
+     * @covers \D3\KlicktippPhpClient\Entities\Subscriber::getListId
+     * @covers \D3\KlicktippPhpClient\Entities\Subscriber::getOptinIp
+     * @covers \D3\KlicktippPhpClient\Entities\Subscriber::getEmailAddress
+     * @covers \D3\KlicktippPhpClient\Entities\Subscriber::getStatus
+     * @covers \D3\KlicktippPhpClient\Entities\Subscriber::getBounce
+     * @covers \D3\KlicktippPhpClient\Entities\Subscriber::getIp
+     * @covers \D3\KlicktippPhpClient\Entities\Subscriber::getUnsubscriptionIp
+     * @covers \D3\KlicktippPhpClient\Entities\Subscriber::getReferrer
+     * @covers \D3\KlicktippPhpClient\Entities\Subscriber::getSmsPhone
+     * @covers \D3\KlicktippPhpClient\Entities\Subscriber::getSmsStatus
+     * @covers \D3\KlicktippPhpClient\Entities\Subscriber::getSmsBounce
+     * @covers \D3\KlicktippPhpClient\Entities\Subscriber::getSmsReferrer
+     * @dataProvider getDataProvider
+     */
+    public function testGetNull(string $testMethod): void
+    {
+        $nullProperties = [];
+        foreach (array_keys($this->entity->toArray()) as $key) {
+            $nullProperties[$key] = null;
+        }
+
+        $sut = new Subscriber($nullProperties);
+
+        $this->assertNull(
+            $this->callMethod(
+                $sut,
+                $testMethod,
+            )
+        );
+    }
+
+    /**
+     * @test
+     * @throws ReflectionException
+     * @covers \D3\KlicktippPhpClient\Entities\Subscriber::getId
+     * @covers \D3\KlicktippPhpClient\Entities\Subscriber::getListId
+     * @covers \D3\KlicktippPhpClient\Entities\Subscriber::getOptinIp
+     * @covers \D3\KlicktippPhpClient\Entities\Subscriber::getEmailAddress
+     * @covers \D3\KlicktippPhpClient\Entities\Subscriber::getStatus
+     * @covers \D3\KlicktippPhpClient\Entities\Subscriber::getBounce
+     * @covers \D3\KlicktippPhpClient\Entities\Subscriber::getIp
+     * @covers \D3\KlicktippPhpClient\Entities\Subscriber::getUnsubscriptionIp
+     * @covers \D3\KlicktippPhpClient\Entities\Subscriber::getReferrer
+     * @covers \D3\KlicktippPhpClient\Entities\Subscriber::getSmsPhone
+     * @covers \D3\KlicktippPhpClient\Entities\Subscriber::getSmsStatus
+     * @covers \D3\KlicktippPhpClient\Entities\Subscriber::getSmsBounce
+     * @covers \D3\KlicktippPhpClient\Entities\Subscriber::getSmsReferrer
+     * @dataProvider getDataProvider
+     */
+    public function testGetInvalid(string $testMethod): void
+    {
+        $invalidProperties = [
+            SubscriberEndpoint::ID                  => [],
+            SubscriberEndpoint::LISTID              => [],
+            SubscriberEndpoint::OPTIN_IP            => [],
+            SubscriberEndpoint::EMAIL               => [],
+            SubscriberEndpoint::STATUS              => [],
+            SubscriberEndpoint::BOUNCE              => [],
+            SubscriberEndpoint::IP                  => [],
+            SubscriberEndpoint::UNSUBSCRIPTION_IP   => [],
+            SubscriberEndpoint::REFERRER            => [],
+            SubscriberEndpoint::SMS_PHONE           => [],
+            SubscriberEndpoint::SMS_STATUS          => [],
+            SubscriberEndpoint::SMS_BOUNCE          => [],
+            SubscriberEndpoint::SMS_REFERRER        => [],
+        ];
+
+        $sut = new Subscriber($invalidProperties);
+
+        $this->expectException(InvalidCredentialTypeException::class);
+
+        $this->assertNull(
+            $this->callMethod(
+                $sut,
+                $testMethod,
+            )
+        );
+    }
+
+    public static function getDataProvider(): Generator
     {
         yield ['getId', '155988456'];
         yield ['getListId', '368370'];
@@ -216,6 +301,57 @@ class SubscriberTest extends TestCase
         $this->callMethod($sut, $methodName);
     }
 
+    /**
+     * @test
+     * @throws ReflectionException
+     * @covers \D3\KlicktippPhpClient\Entities\Subscriber::getOptinTime
+     * @covers \D3\KlicktippPhpClient\Entities\Subscriber::getDate
+     * @covers \D3\KlicktippPhpClient\Entities\Subscriber::getUnsubscription
+     * @covers \D3\KlicktippPhpClient\Entities\Subscriber::getSmsDate
+     * @covers \D3\KlicktippPhpClient\Entities\Subscriber::getSmsUnsubscription
+     * @dataProvider getTimesDataProvider
+     */
+    public function testGetInvalidTimes($methodName): void
+    {
+        $invalidProperties = [
+            SubscriberEndpoint::DATE                => [],
+            SubscriberEndpoint::SMS_DATE            => [],
+            SubscriberEndpoint::OPTIN               => [],
+            SubscriberEndpoint::UNSUBSCRIPTION      => [],
+            SubscriberEndpoint::SMS_UNSUBSCRIPTION  => [],
+        ];
+
+        $sut = new Subscriber($invalidProperties);
+
+        $this->expectException(InvalidCredentialTypeException::class);
+
+        $this->callMethod($sut, $methodName);
+    }
+
+    /**
+     * @test
+     * @throws ReflectionException
+     * @covers \D3\KlicktippPhpClient\Entities\Subscriber::getOptinTime
+     * @covers \D3\KlicktippPhpClient\Entities\Subscriber::getDate
+     * @covers \D3\KlicktippPhpClient\Entities\Subscriber::getUnsubscription
+     * @covers \D3\KlicktippPhpClient\Entities\Subscriber::getSmsDate
+     * @covers \D3\KlicktippPhpClient\Entities\Subscriber::getSmsUnsubscription
+     * @dataProvider getTimesDataProvider
+     */
+    public function testGetNullTimes($methodName): void
+    {
+        $nullProperties = [];
+        foreach (array_keys($this->entity->toArray()) as $key) {
+            $nullProperties[$key] = null;
+        }
+
+        $sut = new Subscriber($nullProperties);
+
+        $this->assertNull(
+            $this->callMethod($sut, $methodName)
+        );
+    }
+
     public static function getTimesDataProvider(): Generator
     {
         yield ['getOptinTime'];
@@ -454,18 +590,17 @@ class SubscriberTest extends TestCase
 
     /**
      * @test
-     * @return void
      * @throws ReflectionException
-     * @covers \D3\KlicktippPhpClient\Entities\Subscriber::getTags
-     * @covers \D3\KlicktippPhpClient\Entities\Subscriber::getManualTags
-     * @covers \D3\KlicktippPhpClient\Entities\Subscriber::getSmartTags
-     * @covers \D3\KlicktippPhpClient\Entities\Subscriber::getStartedCampaigns
-     * @covers \D3\KlicktippPhpClient\Entities\Subscriber::getFinishedCampaigns
-     * @covers \D3\KlicktippPhpClient\Entities\Subscriber::getSentNotificationEmails
-     * @covers \D3\KlicktippPhpClient\Entities\Subscriber::getOpenedNotificationEmails
-     * @covers \D3\KlicktippPhpClient\Entities\Subscriber::getClickedNotificationEmails
-     * @covers \D3\KlicktippPhpClient\Entities\Subscriber::getViewedNotificationEmails
-     * @covers \D3\KlicktippPhpClient\Entities\Subscriber::getOutbounds
+     * @covers       \D3\KlicktippPhpClient\Entities\Subscriber::getTags
+     * @covers       \D3\KlicktippPhpClient\Entities\Subscriber::getManualTags
+     * @covers       \D3\KlicktippPhpClient\Entities\Subscriber::getSmartTags
+     * @covers       \D3\KlicktippPhpClient\Entities\Subscriber::getStartedCampaigns
+     * @covers       \D3\KlicktippPhpClient\Entities\Subscriber::getFinishedCampaigns
+     * @covers       \D3\KlicktippPhpClient\Entities\Subscriber::getSentNotificationEmails
+     * @covers       \D3\KlicktippPhpClient\Entities\Subscriber::getOpenedNotificationEmails
+     * @covers       \D3\KlicktippPhpClient\Entities\Subscriber::getClickedNotificationEmails
+     * @covers       \D3\KlicktippPhpClient\Entities\Subscriber::getViewedNotificationEmails
+     * @covers       \D3\KlicktippPhpClient\Entities\Subscriber::getOutbounds
      * @dataProvider getTagsDataProvider
      */
     public function testGetTags(string $methodName, int $expectedCount): void
@@ -479,6 +614,78 @@ class SubscriberTest extends TestCase
         $this->assertCount($expectedCount, $tags);
     }
 
+    /**
+     * @test
+     * @throws ReflectionException
+     * @covers       \D3\KlicktippPhpClient\Entities\Subscriber::getTags
+     * @covers       \D3\KlicktippPhpClient\Entities\Subscriber::getManualTags
+     * @covers       \D3\KlicktippPhpClient\Entities\Subscriber::getSmartTags
+     * @covers       \D3\KlicktippPhpClient\Entities\Subscriber::getStartedCampaigns
+     * @covers       \D3\KlicktippPhpClient\Entities\Subscriber::getFinishedCampaigns
+     * @covers       \D3\KlicktippPhpClient\Entities\Subscriber::getSentNotificationEmails
+     * @covers       \D3\KlicktippPhpClient\Entities\Subscriber::getOpenedNotificationEmails
+     * @covers       \D3\KlicktippPhpClient\Entities\Subscriber::getClickedNotificationEmails
+     * @covers       \D3\KlicktippPhpClient\Entities\Subscriber::getViewedNotificationEmails
+     * @covers       \D3\KlicktippPhpClient\Entities\Subscriber::getOutbounds
+     * @dataProvider getTagsDataProvider
+     */
+    public function testGetNullTags(string $methodName): void
+    {
+        $nullProperties = [];
+        foreach (array_keys($this->entity->toArray()) as $key) {
+            $nullProperties[$key] = null;
+        }
+
+        $sut = new Subscriber($nullProperties);
+
+        $this->assertNull(
+            $this->callMethod(
+                $sut,
+                $methodName,
+            )
+        );
+    }
+
+    /**
+     * @test
+     * @throws ReflectionException
+     * @covers       \D3\KlicktippPhpClient\Entities\Subscriber::getTags
+     * @covers       \D3\KlicktippPhpClient\Entities\Subscriber::getManualTags
+     * @covers       \D3\KlicktippPhpClient\Entities\Subscriber::getSmartTags
+     * @covers       \D3\KlicktippPhpClient\Entities\Subscriber::getStartedCampaigns
+     * @covers       \D3\KlicktippPhpClient\Entities\Subscriber::getFinishedCampaigns
+     * @covers       \D3\KlicktippPhpClient\Entities\Subscriber::getSentNotificationEmails
+     * @covers       \D3\KlicktippPhpClient\Entities\Subscriber::getOpenedNotificationEmails
+     * @covers       \D3\KlicktippPhpClient\Entities\Subscriber::getClickedNotificationEmails
+     * @covers       \D3\KlicktippPhpClient\Entities\Subscriber::getViewedNotificationEmails
+     * @covers       \D3\KlicktippPhpClient\Entities\Subscriber::getOutbounds
+     * @dataProvider getTagsDataProvider
+     */
+    public function testGetInvalidTags(string $methodName): void
+    {
+        $invalidProperties = [
+            SubscriberEndpoint::TAGS    => "",
+            SubscriberEndpoint::MANUALTAGS    => "",
+            SubscriberEndpoint::SMARTTAGS    => "",
+            SubscriberEndpoint::CAMPAIGNSSTARTED    => "",
+            SubscriberEndpoint::CAMPAIGNSFINISHED    => "",
+            SubscriberEndpoint::NOTIFICATIONEMAILSSENT    => "",
+            SubscriberEndpoint::NOTIFICATIONEMAILSOPENED    => "",
+            SubscriberEndpoint::NOTIFICATIONEMAILSCLICKED    => "",
+            SubscriberEndpoint::NOTIFICATIONEMAILSVIEWED    => "",
+            SubscriberEndpoint::OUTBOUND    => "",
+        ];
+
+        $sut = new Subscriber($invalidProperties);
+
+        $this->expectException(InvalidCredentialTypeException::class);
+
+        $this->callMethod(
+            $sut,
+            $methodName,
+        );
+    }
+
     public static function getTagsDataProvider(): Generator
     {
         yield ['getTags', 2];
@@ -693,12 +900,12 @@ class SubscriberTest extends TestCase
 
     /**
      * @test
-     * @throws ReflectionException
      * @covers \D3\KlicktippPhpClient\Entities\Subscriber::getManualTagTime
      * @covers \D3\KlicktippPhpClient\Entities\Subscriber::getSmartTagTime
      * @covers \D3\KlicktippPhpClient\Entities\Subscriber::getStartedCampaignTime
      * @covers \D3\KlicktippPhpClient\Entities\Subscriber::getFinishedCampaignTime
      * @dataProvider getTagDataProvider
+     * @throws ReflectionException
      */
     public function testGetTag(string $testMethodName, string $invokedMethodName): void
     {