feat: listen to user life cycle events
Signed-off-by: Sebastian Krupinski <krupinski01@gmail.com>
This commit is contained in:
@@ -0,0 +1,118 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace KTXT\ProviderLocalChrono\Tests\Unit;
|
||||
|
||||
use KTXC\Event\EventListenerRegistry;
|
||||
use KTXC\Resource\ProviderManager;
|
||||
use KTXC\User\Event\UserCreatedEvent;
|
||||
use KTXC\User\Event\UserDeletingEvent;
|
||||
use KTXF\Event\DeliveryMode;
|
||||
use KTXF\Resource\Identifier\CollectionIdentifier;
|
||||
use KTXF\Resource\Provider\ProviderInterface;
|
||||
use KTXM\ProviderLocalChrono\Listeners\UserEventListener;
|
||||
use KTXM\ProviderLocalChrono\Module;
|
||||
use KTXM\ProviderLocalChrono\Providers\Personal\CollectionResource;
|
||||
use KTXM\ProviderLocalChrono\Providers\Personal\PersonalService;
|
||||
use KTXM\ProviderLocalChrono\Providers\Provider;
|
||||
use KTXM\ProviderLocalChrono\Store\Personal\Store;
|
||||
use PHPUnit\Framework\Attributes\Test;
|
||||
use PHPUnit\Framework\TestCase;
|
||||
|
||||
final class UserEventListenerTest extends TestCase
|
||||
{
|
||||
#[Test]
|
||||
public function moduleRegistersDeferredUserLifecycleListeners(): void
|
||||
{
|
||||
$providers = $this->createMock(ProviderManager::class);
|
||||
$providers->expects(self::once())
|
||||
->method('register')
|
||||
->with(ProviderInterface::TYPE_CHRONO, 'default', Provider::class);
|
||||
$events = new EventListenerRegistry();
|
||||
|
||||
(new Module($providers, $events))->boot();
|
||||
|
||||
$definitions = $events->definitions();
|
||||
self::assertCount(2, $definitions);
|
||||
self::assertSame(UserCreatedEvent::class, $definitions[0]->event);
|
||||
self::assertSame(UserEventListener::class, $definitions[0]->service);
|
||||
self::assertSame('onUserCreated', $definitions[0]->method);
|
||||
self::assertSame(DeliveryMode::Deferred, $definitions[0]->delivery);
|
||||
self::assertSame(UserDeletingEvent::class, $definitions[1]->event);
|
||||
self::assertSame(UserEventListener::class, $definitions[1]->service);
|
||||
self::assertSame('onUserDeleting', $definitions[1]->method);
|
||||
self::assertSame(DeliveryMode::Deferred, $definitions[1]->delivery);
|
||||
}
|
||||
|
||||
#[Test]
|
||||
public function createsExactlyOnePersonalCalendar(): void
|
||||
{
|
||||
$freshCollection = new CollectionResource();
|
||||
$store = $this->createMock(Store::class);
|
||||
$store->expects(self::exactly(2))
|
||||
->method('collectionList')
|
||||
->with('tenant-a', 'user-a')
|
||||
->willReturnOnConsecutiveCalls([], [new CollectionResource()]);
|
||||
$store->expects(self::once())
|
||||
->method('collectionFresh')
|
||||
->willReturn($freshCollection);
|
||||
$store->expects(self::once())
|
||||
->method('collectionCreate')
|
||||
->with(
|
||||
'tenant-a',
|
||||
'user-a',
|
||||
self::callback(static fn(CollectionResource $collection): bool =>
|
||||
$collection->getProperties()->getLabel() === 'Personal'
|
||||
&& $collection->getProperties()->getVisibility() === true
|
||||
&& $collection->getEnabled()),
|
||||
)
|
||||
->willReturn(new CollectionResource());
|
||||
$listener = new UserEventListener($store, $this->createStub(PersonalService::class));
|
||||
$event = $this->userCreatedEvent();
|
||||
|
||||
$listener->onUserCreated($event);
|
||||
$listener->onUserCreated($event);
|
||||
|
||||
self::assertTrue($freshCollection->getEnabled());
|
||||
}
|
||||
|
||||
#[Test]
|
||||
public function deletesPersonalCalendars(): void
|
||||
{
|
||||
$collection = (new CollectionResource())->fromStore(['cid' => 'calendar-a']);
|
||||
$service = $this->createMock(PersonalService::class);
|
||||
$service->expects(self::once())
|
||||
->method('initialize')
|
||||
->with('tenant-a', 'user-a')
|
||||
->willReturnSelf();
|
||||
$service->expects(self::once())
|
||||
->method('collectionList')
|
||||
->with(null)
|
||||
->willReturn([$collection]);
|
||||
$service->expects(self::once())
|
||||
->method('collectionDelete')
|
||||
->with(
|
||||
self::callback(static fn(CollectionIdentifier $target): bool =>
|
||||
$target->collection() === 'calendar-a'),
|
||||
true,
|
||||
)
|
||||
->willReturn(true);
|
||||
|
||||
(new UserEventListener(
|
||||
$this->createStub(Store::class),
|
||||
$service,
|
||||
))->onUserDeleting(UserDeletingEvent::fromUser([
|
||||
'uid' => 'user-a',
|
||||
'identity' => 'person@example.test',
|
||||
], 'tenant-a'));
|
||||
}
|
||||
|
||||
private function userCreatedEvent(): UserCreatedEvent
|
||||
{
|
||||
return UserCreatedEvent::fromUser([
|
||||
'uid' => 'user-a',
|
||||
'identity' => 'person@example.test',
|
||||
], 'tenant-a');
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user