'user-a', 'identity' => 'person@example.test', 'label' => 'Person', 'enabled' => true, 'roles' => ['member'], ], 'tenant-a', 'actor-a', ); self::assertSame(UserCreatedEvent::class, $event->label()); 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->tenantIdentifier()); self::assertSame('actor-a', $event->actorIdentifier()); self::assertSame('actor-a', $event->actorIdentity()); self::assertSame('string', (string) (new \ReflectionMethod(UserEvent::class, 'tenantIdentifier'))->getReturnType()); } #[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')->label()); self::assertSame(UserUpdatedEvent::class, UserUpdatedEvent::fromUser($user, 'tenant-a')->label()); self::assertSame(UserDeletingEvent::class, UserDeletingEvent::fromUser($user, 'tenant-a')->label()); } #[Test] #[TestDox('User lifecycle events reject incomplete snapshots')] public function rejectsIncompleteSnapshot(): void { $this->expectException(\InvalidArgumentException::class); UserCreatedEvent::fromUser(['identity' => 'person@example.test'], 'tenant-a'); } }