'user-a', 'identity' => 'person@example.test', 'label' => 'Person', 'enabled' => true, 'roles' => ['member'], ], 'tenant-a', 'actor-a', ); self::assertSame(UserCreatedEvent::class, $event->getName()); self::assertSame('user-a', $event->userIdentifier()); self::assertSame('person@example.test', $event->userIdentity()); self::assertSame('Person', $event->userLabel()); self::assertTrue($event->userEnabled()); self::assertSame(['member'], $event->userRoles()); self::assertSame('tenant-a', $event->getTenantId()); self::assertSame('actor-a', $event->actorIdentifier()); self::assertSame('actor-a', $event->getIdentityId()); } #[Test] #[TestDox('Created, updated, and deleting users have distinct event names')] public function distinguishesLifecycleStage(): void { $user = ['uid' => 'user-a', 'identity' => 'person@example.test']; self::assertSame(UserCreatedEvent::class, UserCreatedEvent::fromUser($user, 'tenant-a')->getName()); self::assertSame(UserUpdatedEvent::class, UserUpdatedEvent::fromUser($user, 'tenant-a')->getName()); self::assertSame(UserDeletingEvent::class, UserDeletingEvent::fromUser($user, 'tenant-a')->getName()); } #[Test] #[TestDox('User lifecycle events reject incomplete snapshots')] public function rejectsIncompleteSnapshot(): void { $this->expectException(\InvalidArgumentException::class); UserCreatedEvent::fromUser(['identity' => 'person@example.test'], 'tenant-a'); } }