feat: listen to user life cycle events

Signed-off-by: Sebastian Krupinski <krupinski01@gmail.com>
This commit is contained in:
2026-08-08 21:47:07 -04:00
parent 6c4b42b32b
commit 18822a4d88
5 changed files with 214 additions and 3 deletions
+118
View File
@@ -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');
}
}