Comparer les révisions

..

Pas de révisions en commun. "1.0.2" et "1.0.1" ont des historiques entièrement différents.
1.0.2 ... 1.0.1

14 fichiers modifiés avec 75 ajouts et 383 suppressions

Voir le fichier

@ -4,21 +4,7 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
## [Unreleased](https://git.d3data.de/D3Public/klicktipp-php-client/compare/1.0.2...rel_1.x) ## [Unreleased](https://git.d3data.de/D3Public/klicktipp-php-client/compare/1.0.0...rel_1.x)
## [1.0.2](https://git.d3data.de/D3Public/klicktipp-php-client/compare/1.0.1...1.0.2) - 2025-02-05
### Added
- reset subscription method
### Changed
- endpoint related task with missing endpoint instance throws an exception instead skipping it
### Fixed
- test for index null values in entities
## [1.0.1](https://git.d3data.de/D3Public/klicktipp-php-client/compare/1.0.0...1.0.1) - 2025-01-13
### Changed
- badges in README
## [1.0.0](https://git.d3data.de/D3Public/klicktipp-php-client/releases/tag/1.0.0) - 2025-01-09 ## [1.0.0](https://git.d3data.de/D3Public/klicktipp-php-client/releases/tag/1.0.0) - 2025-01-09
### Added ### Added

Voir le fichier

@ -19,14 +19,11 @@ namespace D3\KlicktippPhpClient\Entities;
use D3\KlicktippPhpClient\Exceptions\CommunicationException; use D3\KlicktippPhpClient\Exceptions\CommunicationException;
use D3\KlicktippPhpClient\Exceptions\InvalidCredentialTypeException; use D3\KlicktippPhpClient\Exceptions\InvalidCredentialTypeException;
use D3\KlicktippPhpClient\Exceptions\MissingEndpointException;
use D3\KlicktippPhpClient\Resources\Account as AccountEndpoint; use D3\KlicktippPhpClient\Resources\Account as AccountEndpoint;
use Doctrine\Common\Collections\ArrayCollection; use Doctrine\Common\Collections\ArrayCollection;
class Account extends Entity class Account extends Entity
{ {
use EndpointTrait;
private ?AccountEndpoint $endpoint; private ?AccountEndpoint $endpoint;
public function __construct(array $elements = [], ?AccountEndpoint $endpoint = null) public function __construct(array $elements = [], ?AccountEndpoint $endpoint = null)
@ -196,10 +193,9 @@ class Account extends Entity
/** /**
* @return null|bool * @return null|bool
* @throws CommunicationException * @throws CommunicationException
* @throws MissingEndpointException
*/ */
public function persist(): ?bool public function persist(): ?bool
{ {
return $this->getEndpoint()->update(); return $this->endpoint?->update();
} }
} }

Voir le fichier

@ -1,36 +0,0 @@
<?php
/**
* Copyright (c) D3 Data Development (Inh. Thomas Dartsch)
*
* For the full copyright and license information, please view
* the LICENSE file that was distributed with this source code.
*
* https://www.d3data.de
*
* @copyright (C) D3 Data Development (Inh. Thomas Dartsch)
* @author D3 Data Development - Daniel Seifert <info@shopmodule.com>
* @link https://www.oxidmodule.com
*/
declare(strict_types=1);
namespace D3\KlicktippPhpClient\Entities;
use Assert\Assert;
use D3\KlicktippPhpClient\Exceptions\MissingEndpointException;
use D3\KlicktippPhpClient\Resources\Model;
trait EndpointTrait
{
private function getEndpoint(): Model
{
Assert::lazy()
->setExceptionClass(MissingEndpointException::class)
->that($this->endpoint)
->isInstanceOf(Model::class)
->verifyNow();
return $this->endpoint;
}
}

Voir le fichier

@ -18,13 +18,10 @@ declare(strict_types=1);
namespace D3\KlicktippPhpClient\Entities; namespace D3\KlicktippPhpClient\Entities;
use D3\KlicktippPhpClient\Exceptions\CommunicationException; use D3\KlicktippPhpClient\Exceptions\CommunicationException;
use D3\KlicktippPhpClient\Exceptions\MissingEndpointException;
use D3\KlicktippPhpClient\Resources\Field as FieldEndpoint; use D3\KlicktippPhpClient\Resources\Field as FieldEndpoint;
class Field extends Entity class Field extends Entity
{ {
use EndpointTrait;
private ?FieldEndpoint $endpoint; private ?FieldEndpoint $endpoint;
public function __construct(array $elements = [], ?FieldEndpoint $endpoint = null) public function __construct(array $elements = [], ?FieldEndpoint $endpoint = null)
@ -53,15 +50,12 @@ class Field extends Entity
/** /**
* @return null|bool * @return null|bool
* @throws CommunicationException * @throws CommunicationException
* @throws MissingEndpointException
*/ */
public function persist(): ?bool public function persist(): ?bool
{ {
return !is_null($this->getId()) ? return $this->endpoint?->update(
$this->getEndpoint()->update( $this->getId(),
$this->getId(), $this->getName()
$this->getName() ?? '' );
) :
null;
} }
} }

Voir le fichier

@ -18,15 +18,12 @@ declare(strict_types=1);
namespace D3\KlicktippPhpClient\Entities; namespace D3\KlicktippPhpClient\Entities;
use D3\KlicktippPhpClient\Exceptions\CommunicationException; use D3\KlicktippPhpClient\Exceptions\CommunicationException;
use D3\KlicktippPhpClient\Exceptions\MissingEndpointException;
use D3\KlicktippPhpClient\Resources\Subscriber as SubscriberEndpoint; use D3\KlicktippPhpClient\Resources\Subscriber as SubscriberEndpoint;
use DateTime; use DateTime;
use Doctrine\Common\Collections\ArrayCollection; use Doctrine\Common\Collections\ArrayCollection;
class Subscriber extends Entity class Subscriber extends Entity
{ {
use EndpointTrait;
public const STATUS_SUBSCRIBED = 'subscribed'; public const STATUS_SUBSCRIBED = 'subscribed';
public const BOUNCE_NOTBOUNCED = 'Not Bounced'; public const BOUNCE_NOTBOUNCED = 'Not Bounced';
@ -178,7 +175,7 @@ class Subscriber extends Entity
// use persist method to send to Klicktipp // use persist method to send to Klicktipp
} }
protected function getFieldLongName(string $fieldId): string protected function getFieldLongName(string $fieldId): ?string
{ {
return str_starts_with($fieldId, 'field') ? trim($fieldId) : 'field'.trim($fieldId); return str_starts_with($fieldId, 'field') ? trim($fieldId) : 'field'.trim($fieldId);
} }
@ -196,15 +193,15 @@ class Subscriber extends Entity
public function clearTags(): void public function clearTags(): void
{ {
$tags = $this->getTags(); $tags = $this->getTags();
$tags?->clear(); $tags->clear();
$this->set(SubscriberEndpoint::TAGS, $tags?->toArray()); $this->set(SubscriberEndpoint::TAGS, $tags->toArray());
// use persist method to send to Klicktipp // use persist method to send to Klicktipp
} }
public function addTag(string $tagId): void public function addTag(string $tagId): void
{ {
$tags = $this->getTags() ?: new ArrayCollection(); $tags = $this->getTags();
$tags->add($tagId); $tags->add($tagId);
$this->set(SubscriberEndpoint::TAGS, $tags->toArray()); $this->set(SubscriberEndpoint::TAGS, $tags->toArray());
@ -214,8 +211,8 @@ class Subscriber extends Entity
public function removeTag(string $tagId): void public function removeTag(string $tagId): void
{ {
$tags = $this->getTags(); $tags = $this->getTags();
$tags?->removeElement($tagId); $tags->removeElement($tagId);
$this->set(SubscriberEndpoint::TAGS, $tags?->toArray()); $this->set(SubscriberEndpoint::TAGS, $tags->toArray());
// use persist method to send to Klicktipp // use persist method to send to Klicktipp
} }
@ -235,7 +232,7 @@ class Subscriber extends Entity
public function getManualTagTime(string $tagId): ?DateTime public function getManualTagTime(string $tagId): ?DateTime
{ {
return $this->getDateTimeFromValue($this->getManualTags()?->get($tagId)); return $this->getDateTimeFromValue($this->getManualTags()->get($tagId));
} }
public function getSmartTags(): ?ArrayCollection public function getSmartTags(): ?ArrayCollection
@ -317,81 +314,42 @@ class Subscriber extends Entity
/** /**
* @return null|bool * @return null|bool
* @throws CommunicationException * @throws CommunicationException
* @throws MissingEndpointException
*/ */
public function persist(): ?bool public function persist(): ?bool
{ {
if (!is_null($this->getId())) { $return = $this->endpoint?->update(
$return = $this->getEndpoint()->update( $this->getId(),
$this->getId(), $this->getFields()->toArray(),
$this->getFields()->toArray(), $this->getEmailAddress(),
$this->getEmailAddress() ?? '', $this->getSmsPhone()
$this->getSmsPhone() ?? '' );
);
$this->persistTags(); $this->persistTags();
return $return; return $return;
}
return null;
} }
/** /**
* @throws CommunicationException * @throws CommunicationException
* @throws MissingEndpointException
*/ */
protected function persistTags(): void protected function persistTags(): void
{ {
$currentTags = $this->getEndpoint()->getEntity($this->getId() ?? '')->getTags(); if (!$this->endpoint instanceof SubscriberEndpoint) {
return;
}
$removeTags = array_diff( $currentTags = $this->endpoint->getEntity($this->getId())->getTags();
$currentTags?->toArray() ?? [],
$this->getTags()?->toArray() ?? []
);
$removeTags = array_diff($currentTags->toArray(), $this->getTags()->toArray());
if (count($removeTags)) { if (count($removeTags)) {
foreach ($removeTags as $removeTag) { foreach ($removeTags as $removeTag) {
if (!is_null($this->getEmailAddress())) { $this->endpoint->untag($this->getEmailAddress(), $removeTag);
$this->getEndpoint()->untag($this->getEmailAddress(), $removeTag);
}
} }
} }
$addTags = array_diff( $addTags = array_diff($this->getTags()->toArray(), $currentTags->toArray());
$this->getTags()?->toArray() ?? [],
$currentTags?->toArray() ?? []
);
if (count($addTags)) { if (count($addTags)) {
if (!is_null($this->getEmailAddress())) { $this->endpoint->tag($this->getEmailAddress(), $addTags);
$this->getEndpoint()->tag($this->getEmailAddress(), $addTags);
}
}
}
/**
* @param string $listId
* @param string|null $tagId
* @param array|null $fields
* @param string|null $smsNumber
*
* @return void
* @throws CommunicationException
*/
public function resubscribe(
string $listId,
?string $tagId = null,
?array $fields = null,
?string $smsNumber = null
): void {
if (!$this->isSubscribed()) {
$this->getEndpoint()->subscribe(
$this->getEmailAddress(),
$listId,
$tagId,
$fields,
$smsNumber
);
} }
} }

Voir le fichier

@ -18,13 +18,10 @@ declare(strict_types=1);
namespace D3\KlicktippPhpClient\Entities; namespace D3\KlicktippPhpClient\Entities;
use D3\KlicktippPhpClient\Exceptions\CommunicationException; use D3\KlicktippPhpClient\Exceptions\CommunicationException;
use D3\KlicktippPhpClient\Exceptions\MissingEndpointException;
use D3\KlicktippPhpClient\Resources\SubscriptionProcess; use D3\KlicktippPhpClient\Resources\SubscriptionProcess;
class Subscription extends Entity class Subscription extends Entity
{ {
use EndpointTrait;
private ?SubscriptionProcess $endpoint; private ?SubscriptionProcess $endpoint;
public function __construct(array $elements = [], ?SubscriptionProcess $endpoint = null) public function __construct(array $elements = [], ?SubscriptionProcess $endpoint = null)
@ -81,15 +78,12 @@ class Subscription extends Entity
/** /**
* @return null|bool * @return null|bool
* @throws CommunicationException * @throws CommunicationException
* @throws MissingEndpointException
*/ */
public function persist(): ?bool public function persist(): ?bool
{ {
return !is_null($this->getListId()) ? return $this->endpoint?->update(
$this->getEndpoint()->update( $this->getListId(),
$this->getListId(), $this->getName()
$this->getName() ?? '' );
) :
null;
} }
} }

Voir le fichier

@ -18,13 +18,10 @@ declare(strict_types=1);
namespace D3\KlicktippPhpClient\Entities; namespace D3\KlicktippPhpClient\Entities;
use D3\KlicktippPhpClient\Exceptions\CommunicationException; use D3\KlicktippPhpClient\Exceptions\CommunicationException;
use D3\KlicktippPhpClient\Exceptions\MissingEndpointException;
use D3\KlicktippPhpClient\Resources\Tag as TagEndpoint; use D3\KlicktippPhpClient\Resources\Tag as TagEndpoint;
class Tag extends Entity class Tag extends Entity
{ {
use EndpointTrait;
private ?TagEndpoint $endpoint; private ?TagEndpoint $endpoint;
public function __construct(array $elements = [], ?TagEndpoint $endpoint = null) public function __construct(array $elements = [], ?TagEndpoint $endpoint = null)
@ -65,16 +62,13 @@ class Tag extends Entity
/** /**
* @return null|bool * @return null|bool
* @throws CommunicationException * @throws CommunicationException
* @throws MissingEndpointException
*/ */
public function persist(): ?bool public function persist(): ?bool
{ {
return !is_null($this->getId()) ? return $this->endpoint?->update(
$this->getEndpoint()->update( $this->getId(),
$this->getId(), $this->getName(),
$this->getName() ?? '', $this->getText()
$this->getText() ?? '' );
) :
null;
} }
} }

Voir le fichier

@ -1,29 +0,0 @@
<?php
/**
* Copyright (c) D3 Data Development (Inh. Thomas Dartsch)
*
* For the full copyright and license information, please view
* the LICENSE file that was distributed with this source code.
*
* https://www.d3data.de
*
* @copyright (C) D3 Data Development (Inh. Thomas Dartsch)
* @author D3 Data Development - Daniel Seifert <info@shopmodule.com>
* @link https://www.oxidmodule.com
*/
declare(strict_types=1);
namespace D3\KlicktippPhpClient\Exceptions;
use Assert\LazyAssertionException;
class MissingEndpointException extends LazyAssertionException implements KlicktippExceptionInterface
{
public function __construct($message, array $errors)
{
unset($message);
parent::__construct('required endpoint for this action missing', $errors);
}
}

Voir le fichier

@ -19,7 +19,6 @@ namespace D3\KlicktippPhpClient\tests\unit\Entities;
use D3\KlicktippPhpClient\Entities\Account; use D3\KlicktippPhpClient\Entities\Account;
use D3\KlicktippPhpClient\Exceptions\InvalidCredentialTypeException; use D3\KlicktippPhpClient\Exceptions\InvalidCredentialTypeException;
use D3\KlicktippPhpClient\Exceptions\MissingEndpointException;
use D3\KlicktippPhpClient\Resources\Account as AccountEndpoint; use D3\KlicktippPhpClient\Resources\Account as AccountEndpoint;
use D3\KlicktippPhpClient\tests\TestCase; use D3\KlicktippPhpClient\tests\TestCase;
use Doctrine\Common\Collections\ArrayCollection; use Doctrine\Common\Collections\ArrayCollection;
@ -527,10 +526,6 @@ class AccountTest extends TestCase
$sut = new Account([AccountEndpoint::UID => 'foo'], $endpointSet ? $endpointMock : null); $sut = new Account([AccountEndpoint::UID => 'foo'], $endpointSet ? $endpointMock : null);
if (!$endpointSet) {
$this->expectException(MissingEndpointException::class);
}
$this->assertSame( $this->assertSame(
$expectedReturn, $expectedReturn,
$this->callMethod( $this->callMethod(

Voir le fichier

@ -19,7 +19,6 @@ namespace D3\KlicktippPhpClient\tests\unit\Entities;
use D3\KlicktippPhpClient\Entities\Field; use D3\KlicktippPhpClient\Entities\Field;
use D3\KlicktippPhpClient\Exceptions\InvalidCredentialTypeException; use D3\KlicktippPhpClient\Exceptions\InvalidCredentialTypeException;
use D3\KlicktippPhpClient\Exceptions\MissingEndpointException;
use D3\KlicktippPhpClient\Resources\Field as FieldEndpoint; use D3\KlicktippPhpClient\Resources\Field as FieldEndpoint;
use D3\KlicktippPhpClient\tests\TestCase; use D3\KlicktippPhpClient\tests\TestCase;
use Generator; use Generator;
@ -185,10 +184,6 @@ class FieldTest extends TestCase
$endpointSet ? $endpointMock : null $endpointSet ? $endpointMock : null
); );
if (!$endpointSet) {
$this->expectException(MissingEndpointException::class);
}
$this->assertSame( $this->assertSame(
$expectedReturn, $expectedReturn,
$this->callMethod( $this->callMethod(

Voir le fichier

@ -19,7 +19,6 @@ namespace D3\KlicktippPhpClient\tests\unit\Entities;
use D3\KlicktippPhpClient\Entities\Subscriber; use D3\KlicktippPhpClient\Entities\Subscriber;
use D3\KlicktippPhpClient\Exceptions\InvalidCredentialTypeException; use D3\KlicktippPhpClient\Exceptions\InvalidCredentialTypeException;
use D3\KlicktippPhpClient\Exceptions\MissingEndpointException;
use D3\KlicktippPhpClient\Resources\Subscriber as SubscriberEndpoint; use D3\KlicktippPhpClient\Resources\Subscriber as SubscriberEndpoint;
use D3\KlicktippPhpClient\tests\TestCase; use D3\KlicktippPhpClient\tests\TestCase;
use DateTime; use DateTime;
@ -707,11 +706,12 @@ class SubscriberTest extends TestCase
* @covers \D3\KlicktippPhpClient\Entities\Subscriber::isTagSet * @covers \D3\KlicktippPhpClient\Entities\Subscriber::isTagSet
* @dataProvider isTagSetDataProvider * @dataProvider isTagSetDataProvider
*/ */
public function testIsTagSet(?array $currentTags, string $searchTagId, bool $expected): void public function testIsTagSet(string $searchTagId, bool $expected): void
{ {
$tagList = is_null($currentTags) ? $tagList = new ArrayCollection([
null : "12494453",
new ArrayCollection($currentTags); "12494463",
]);
$sut = $this->getMockBuilder(Subscriber::class) $sut = $this->getMockBuilder(Subscriber::class)
->onlyMethods(['getTags']) ->onlyMethods(['getTags'])
@ -730,9 +730,8 @@ class SubscriberTest extends TestCase
public static function isTagSetDataProvider(): Generator public static function isTagSetDataProvider(): Generator
{ {
yield 'existing tag' => [["12494453", "12494463"], '12494463', true]; yield 'existing tag' => ['12494463', true];
yield 'missing tag' => [["12494453", "12494463"], '12495463', false]; yield 'missing tag' => ['12495463', false];
yield 'null tag' => [null, '12495463', false];
} }
/** /**
@ -740,27 +739,15 @@ class SubscriberTest extends TestCase
* @return void * @return void
* @covers \D3\KlicktippPhpClient\Entities\Subscriber::clearTags * @covers \D3\KlicktippPhpClient\Entities\Subscriber::clearTags
* @throws ReflectionException * @throws ReflectionException
* @dataProvider clearTagsDataProvider
*/ */
public function testClearTags(?array $currentTagList, ?array $expectedTags): void public function testClearTags(): void
{ {
$entityMock = new Subscriber([SubscriberEndpoint::TAGS => $currentTagList]);
$this->callMethod( $this->callMethod(
$entityMock, $this->entity,
'clearTags' 'clearTags'
); );
is_null($expectedTags) ? $this->assertCount(0, $this->callMethod($this->entity, 'getTags'));
$this->assertNull($this->callMethod($entityMock, 'getTags')) :
$this->assertEquals(new ArrayCollection($expectedTags), $this->callMethod($entityMock, 'getTags'));
}
public static function clearTagsDataProvider(): Generator
{
yield 'tag list exists' => [["12494453","12494463"], []];
yield 'tag list empty' => [[], []];
yield 'tag list null' => [null, null];
} }
/** /**
@ -768,56 +755,36 @@ class SubscriberTest extends TestCase
* @return void * @return void
* @covers \D3\KlicktippPhpClient\Entities\Subscriber::addTag * @covers \D3\KlicktippPhpClient\Entities\Subscriber::addTag
* @throws ReflectionException * @throws ReflectionException
* @dataProvider addTagDataProvider
*/ */
public function testAddTag(?array $currentTagList, ?array $expectedTagList): void public function testAddTag(): void
{ {
$entityMock = new Subscriber([SubscriberEndpoint::TAGS => $currentTagList]);
$this->callMethod( $this->callMethod(
$entityMock, $this->entity,
'addTag', 'addTag',
['78546214'] ['78546214']
); );
is_null($expectedTagList) ? $this->assertCount(3, $this->callMethod($this->entity, 'getTags'));
$this->assertNull($this->callMethod($entityMock, 'getTags')) : $this->assertContains('78546214', $this->callMethod($this->entity, 'getTags'));
$this->assertEquals(new ArrayCollection($expectedTagList), $this->callMethod($entityMock, 'getTags'));
}
public static function addTagDataProvider(): Generator
{
yield 'tag list exists' => [["12494453","12494463"], ["12494453","12494463", "78546214"]];
yield 'tag list empty' => [[], ["78546214"]];
yield 'tag list null' => [null, ["78546214"]];
} }
/** /**
* @test * @test
* @return void
* @covers \D3\KlicktippPhpClient\Entities\Subscriber::removeTag
* @throws ReflectionException * @throws ReflectionException
* @covers \D3\KlicktippPhpClient\Entities\Subscriber::removeTag
* @dataProvider removeTagDataProvider
*/ */
public function testRemoveTag(?array $currentTagList, ?array $expectedTags): void public function testRemoveTag(): void
{ {
$entityMock = new Subscriber([SubscriberEndpoint::TAGS => $currentTagList]);
$this->callMethod( $this->callMethod(
$entityMock, $this->entity,
'removeTag', 'removeTag',
['12494453'] ['12494453']
); );
is_null($expectedTags) ? $this->assertCount(1, $this->callMethod($this->entity, 'getTags'));
$this->assertNull($this->callMethod($entityMock, 'getTags')) : $this->assertContains('12494463', $this->callMethod($this->entity, 'getTags'));
$this->assertEquals(new ArrayCollection($expectedTags), $this->callMethod($entityMock, 'getTags')); $this->assertNotContains('12494453', $this->callMethod($this->entity, 'getTags'));
}
public static function removeTagDataProvider(): Generator
{
yield 'tag list exists' => [["12494453","12494463"], [1 => "12494463"]];
yield 'tag list empty' => [[], []];
yield 'tag list null' => [null, null];
} }
/** /**
@ -828,9 +795,7 @@ class SubscriberTest extends TestCase
*/ */
public function testPersist( public function testPersist(
bool $endpointSet, bool $endpointSet,
?string $currentId,
InvokedCount $endpointInvocation, InvokedCount $endpointInvocation,
InvokedCount $persistTagsInvocation,
?bool $expectedReturn ?bool $expectedReturn
): void { ): void {
$endpointMock = $this->getMockBuilder(SubscriberEndpoint::class) $endpointMock = $this->getMockBuilder(SubscriberEndpoint::class)
@ -840,14 +805,10 @@ class SubscriberTest extends TestCase
$endpointMock->expects($endpointInvocation)->method('update')->willReturn(true); $endpointMock->expects($endpointInvocation)->method('update')->willReturn(true);
$sut = $this->getMockBuilder(Subscriber::class) $sut = $this->getMockBuilder(Subscriber::class)
->setConstructorArgs([[SubscriberEndpoint::ID => $currentId], $endpointSet ? $endpointMock : null]) ->setConstructorArgs([[SubscriberEndpoint::ID => 'foo'], $endpointSet ? $endpointMock : null])
->onlyMethods(['persistTags']) ->onlyMethods(['persistTags'])
->getMock(); ->getMock();
$sut->expects($persistTagsInvocation)->method('persistTags'); $sut->expects($this->once())->method('persistTags');
if (!$endpointSet) {
$this->expectException(MissingEndpointException::class);
}
$this->assertSame( $this->assertSame(
$expectedReturn, $expectedReturn,
@ -860,9 +821,8 @@ class SubscriberTest extends TestCase
public static function persistDataProvider(): Generator public static function persistDataProvider(): Generator
{ {
yield 'has endpoint' => [true, 'fixture', self::once(), self::once(), true]; yield 'has endpoint' => [true, self::once(), true];
yield 'has no endpoint' => [false, 'fixture', self::never(), self::never(), null]; yield 'has no endpoint' => [false, self::never(), null];
yield 'has endpoint, no id' => [true, null, self::never(), self::never(), null];
} }
/** /**
@ -874,7 +834,6 @@ class SubscriberTest extends TestCase
public function testPersistTags( public function testPersistTags(
bool $endpointSet, bool $endpointSet,
InvokedCount $endpointInvocation, InvokedCount $endpointInvocation,
?array $currentTagList,
?array $newTagList, ?array $newTagList,
InvokedCount $removeTagInvocation, InvokedCount $removeTagInvocation,
InvokedCount $setTagInvocation InvokedCount $setTagInvocation
@ -883,9 +842,10 @@ class SubscriberTest extends TestCase
->disableOriginalConstructor() ->disableOriginalConstructor()
->onlyMethods(['getTags']) ->onlyMethods(['getTags'])
->getMock(); ->getMock();
$entityMock->method('getTags')->willReturn( $entityMock->method('getTags')->willReturn(new ArrayCollection([
is_null($currentTagList) ? null : new ArrayCollection($currentTagList) "12494453",
); "12494463",
]));
$endpointMock = $this->getMockBuilder(SubscriberEndpoint::class) $endpointMock = $this->getMockBuilder(SubscriberEndpoint::class)
->disableOriginalConstructor() ->disableOriginalConstructor()
@ -900,10 +860,6 @@ class SubscriberTest extends TestCase
$sut->set('tags', $newTagList); $sut->set('tags', $newTagList);
} }
if (!$endpointSet) {
$this->expectException(MissingEndpointException::class);
}
$this->callMethod( $this->callMethod(
$sut, $sut,
'persistTags' 'persistTags'
@ -912,11 +868,10 @@ class SubscriberTest extends TestCase
public static function persistTagsDataProvider(): Generator public static function persistTagsDataProvider(): Generator
{ {
yield 'has endpoint, tag removed' => [true, self::once(), ["12494453", "12494463"], ["12494453"], self::once(), self::never()]; yield 'has endpoint, tag removed' => [true, self::once(), ["12494453"], self::once(), self::never()];
yield 'has endpoint, tag added' => [true, self::once(), ["12494453", "12494463"], ["12494453","12494463","12494464"], self::never(), self::once()]; yield 'has endpoint, tag added' => [true, self::once(), ["12494453","12494463","12494464"], self::never(), self::once()];
yield 'has endpoint, taglist equals' => [true, self::once(), ["12494453", "12494463"], ["12494453","12494463"], self::never(), self::never()]; yield 'has endpoint, taglist equals' => [true, self::once(), ["12494453","12494463"], self::never(), self::never()];
yield 'has no endpoint' => [false, self::never(), ["12494453", "12494463"], null, self::never(), self::never()]; yield 'has no endpoint' => [false, self::never(), null, self::never(), self::never()];
yield 'has endpoint, taglist null' => [true, self::once(), null, null, self::never(), self::never()];
} }
/** /**
@ -987,48 +942,4 @@ class SubscriberTest extends TestCase
yield ['getStartedCampaignTime', 'getStartedCampaigns']; yield ['getStartedCampaignTime', 'getStartedCampaigns'];
yield ['getFinishedCampaignTime', 'getFinishedCampaigns']; yield ['getFinishedCampaignTime', 'getFinishedCampaigns'];
} }
/**
* @test
* @throws ReflectionException
* @covers \D3\KlicktippPhpClient\Entities\Subscriber::resubscribe
* @covers \D3\KlicktippPhpClient\Entities\Subscriber::getEndpoint
* @dataProvider resubscribeDataProvider
*/
public function testReSubscribe(
bool $endpointSet,
InvokedCount $subscribeExpections,
bool $isSubscribed
): void {
$endpointMock = $this->getMockBuilder(SubscriberEndpoint::class)
->disableOriginalConstructor()
->onlyMethods(['subscribe'])
->getMock();
$endpointMock->expects($subscribeExpections)->method('subscribe');
$sut = $this->getMockBuilder(Subscriber::class)
->setConstructorArgs([[], $endpointSet ? $endpointMock : null])
->onlyMethods(['isSubscribed', 'getEmailAddress'])
->getMock();
$sut->method('isSubscribed')->willReturn($isSubscribed);
$sut->method('getEmailAddress')->willReturn('mail@mydomain.tld');
if (!$endpointSet && !$isSubscribed) {
$this->expectException(MissingEndpointException::class);
}
$this->callMethod(
$sut,
'resubscribe',
['listId', 'tagid']
);
}
public static function resubscribeDataProvider(): Generator
{
yield 'already subscribed, has endpoint' => [true, self::never(), true];
yield 'unsubscribed, has endpoint' => [true, self::once(), false];
yield 'already subscribed, no endpoint' => [false, self::never(), true];
yield 'unsubscribed, no endpoint' => [false, self::never(), false];
}
} }

Voir le fichier

@ -19,7 +19,6 @@ namespace D3\KlicktippPhpClient\tests\unit\Entities;
use D3\KlicktippPhpClient\Entities\Subscription; use D3\KlicktippPhpClient\Entities\Subscription;
use D3\KlicktippPhpClient\Exceptions\InvalidCredentialTypeException; use D3\KlicktippPhpClient\Exceptions\InvalidCredentialTypeException;
use D3\KlicktippPhpClient\Exceptions\MissingEndpointException;
use D3\KlicktippPhpClient\Resources\SubscriptionProcess as SubscriptionEndpoint; use D3\KlicktippPhpClient\Resources\SubscriptionProcess as SubscriptionEndpoint;
use D3\KlicktippPhpClient\tests\TestCase; use D3\KlicktippPhpClient\tests\TestCase;
use Generator; use Generator;
@ -206,7 +205,6 @@ class SubscriptionTest extends TestCase
*/ */
public function testPersist( public function testPersist(
bool $endpointSet, bool $endpointSet,
?string $id,
InvokedCount $endpointInvocation, InvokedCount $endpointInvocation,
?bool $expectedReturn ?bool $expectedReturn
): void { ): void {
@ -215,19 +213,15 @@ class SubscriptionTest extends TestCase
->onlyMethods(['update']) ->onlyMethods(['update'])
->getMock(); ->getMock();
$endpointMock->expects($endpointInvocation)->method('update')->with( $endpointMock->expects($endpointInvocation)->method('update')->with(
$this->identicalTo($id), $this->identicalTo('foo'),
$this->identicalTo('bar'), $this->identicalTo('bar'),
)->willReturn(true); )->willReturn(true);
$sut = new Subscription( $sut = new Subscription(
[SubscriptionEndpoint::LISTID => $id, SubscriptionEndpoint::NAME => 'bar'], [SubscriptionEndpoint::LISTID => 'foo', SubscriptionEndpoint::NAME => 'bar'],
$endpointSet ? $endpointMock : null $endpointSet ? $endpointMock : null
); );
if (!$endpointSet) {
$this->expectException(MissingEndpointException::class);
}
$this->assertSame( $this->assertSame(
$expectedReturn, $expectedReturn,
$this->callMethod( $this->callMethod(
@ -239,8 +233,7 @@ class SubscriptionTest extends TestCase
public static function persistDataProvider(): Generator public static function persistDataProvider(): Generator
{ {
yield 'has endpoint' => [true, 'fixture', self::once(), true]; yield 'has endpoint' => [true, self::once(), true];
yield 'has no endpoint' => [false, 'fixture', self::never(), null]; yield 'has no endpoint' => [false, self::never(), null];
yield 'has endpoint, no id' => [true, null, self::never(), null];
} }
} }

Voir le fichier

@ -19,7 +19,6 @@ namespace D3\KlicktippPhpClient\tests\unit\Entities;
use D3\KlicktippPhpClient\Entities\Tag; use D3\KlicktippPhpClient\Entities\Tag;
use D3\KlicktippPhpClient\Exceptions\InvalidCredentialTypeException; use D3\KlicktippPhpClient\Exceptions\InvalidCredentialTypeException;
use D3\KlicktippPhpClient\Exceptions\MissingEndpointException;
use D3\KlicktippPhpClient\Resources\Tag as TagEndpoint; use D3\KlicktippPhpClient\Resources\Tag as TagEndpoint;
use D3\KlicktippPhpClient\tests\TestCase; use D3\KlicktippPhpClient\tests\TestCase;
use Generator; use Generator;
@ -199,10 +198,6 @@ class TagTest extends TestCase
$endpointSet ? $endpointMock : null $endpointSet ? $endpointMock : null
); );
if (!$endpointSet) {
$this->expectException(MissingEndpointException::class);
}
$this->assertSame( $this->assertSame(
$expectedReturn, $expectedReturn,
$this->callMethod( $this->callMethod(

Voir le fichier

@ -1,54 +0,0 @@
<?php
/**
* Copyright (c) D3 Data Development (Inh. Thomas Dartsch)
*
* For the full copyright and license information, please view
* the LICENSE file that was distributed with this source code.
*
* https://www.d3data.de
*
* @copyright (C) D3 Data Development (Inh. Thomas Dartsch)
* @author D3 Data Development - Daniel Seifert <info@shopmodule.com>
* @link https://www.oxidmodule.com
*/
declare(strict_types=1);
namespace D3\KlicktippPhpClient\tests\unit\Exceptions;
use D3\KlicktippPhpClient\Exceptions\CommunicationException;
use D3\KlicktippPhpClient\Exceptions\MissingEndpointException;
use D3\KlicktippPhpClient\tests\TestCase;
use ReflectionException;
/**
* @covers \D3\KlicktippPhpClient\Exceptions\MissingEndpointException
*/
class MissingEndpointExceptionTest extends TestCase
{
/**
* @test
* @return void
* @throws ReflectionException
* @covers \D3\KlicktippPhpClient\Exceptions\MissingEndpointException::__construct
*/
public function testConstructor(): void
{
/** @var MissingEndpointException $sutMock */
$sutMock = $this->getMockBuilder(MissingEndpointException::class)
->disableOriginalConstructor()
->getMock();
$this->callMethod(
$sutMock,
'__construct',
['myMessage', []]
);
$this->assertMatchesRegularExpression(
'/.*?endpoint.*?missing.*/i',
$sutMock->getMessage()
);
}
}