diff --git a/app/Domain/Online/ViewerUser.php b/app/Domain/Online/ViewerUser.php new file mode 100644 index 000000000..369020468 --- /dev/null +++ b/app/Domain/Online/ViewerUser.php @@ -0,0 +1,13 @@ +mapToViewerUsers($sessions), + $sessions->guestsCount, + ); + } + + private function mapToViewerUsers(SessionsSnapshot $sessions): array + { + return User::query()->findMany($sessions->users) + ->map($this->viewerUser(...)) + ->toArray(); + } + + private function viewerUser(User $user): ViewerUser + { + return new ViewerUser( + $user->name, + $user->group_name, + $user->photo->getFilename(), + ); + } +} diff --git a/tests/Unit/BaseFixture/Forum/ModelsDsl.php b/tests/Unit/BaseFixture/Forum/ModelsDsl.php index accdab45c..483fba54a 100644 --- a/tests/Unit/BaseFixture/Forum/ModelsDsl.php +++ b/tests/Unit/BaseFixture/Forum/ModelsDsl.php @@ -25,12 +25,21 @@ public function newUserDeleted(string $name): void $this->newUser(name:$name, deleted:true); } - public function newUserReturnId(string $name = null, string $permissionName = null): int - { - $user = $this->models->newUserReturn(name:$name); + public function newUserReturnId( + string $name = null, + string $permissionName = null, + string $groupName = null, + string $photoUrl = null, + bool $deleted = false, + ): int + { + $user = $this->models->newUserReturn(name:$name, photoUrl:$photoUrl, deleted:$deleted); if ($permissionName) { $this->models->assignToGroupWithPermission($user, $permissionName); } + if ($groupName) { + $this->models->assignToGroupWithNameReturnId($user, $groupName); + } return $user->id; } diff --git a/tests/Unit/BaseFixture/Forum/ModelsDslTest.php b/tests/Unit/BaseFixture/Forum/ModelsDslTest.php index 1ba46f577..9b38ef00a 100644 --- a/tests/Unit/BaseFixture/Forum/ModelsDslTest.php +++ b/tests/Unit/BaseFixture/Forum/ModelsDslTest.php @@ -283,6 +283,23 @@ public function newUserWithPermissionNoOther(): void $this->assertUserCan(false, $userId, 'forum-delete'); } + #[Test] + public function newUserWithGroupName(): void + { + $userId = $this->models->newUserReturnId(groupName:'Writer'); + $this->assertDatabaseHas('users', [ + 'id' => $userId, + 'group_name' => 'Writer', + ]); + } + + #[Test] + public function newUserWithAvatar(): void + { + $userId = $this->models->newUserReturnId(photoUrl:'image.png'); + $this->assertStringEndsWith('/image.png', (string)User::query()->findOrFail($userId)->photo->url()); + } + private function assertUserCan(bool $expected, int $userId, string $permission): void { /** @var User $user */ diff --git a/tests/Unit/BaseFixture/Forum/ModelsFactory.php b/tests/Unit/BaseFixture/Forum/ModelsFactory.php index 1ec30406f..b4262f895 100644 --- a/tests/Unit/BaseFixture/Forum/ModelsFactory.php +++ b/tests/Unit/BaseFixture/Forum/ModelsFactory.php @@ -52,6 +52,19 @@ private function groupWithPermission(string $permissionName): Group return $group; } + public function assignToGroupWithNameReturnId(User $user, string $groupName): void + { + $groupId = $this->groupWithName($groupName)->id; + $user->groups()->sync([$groupId]); + $user->group_id = $groupId; + $user->save(); + } + + private function groupWithName(string $groupName): Group + { + return Group::query()->create(['name' => $groupName]); + } + public function newPostReturn( string $content = null, Carbon $createdAt = null, diff --git a/tests/Unit/OnlineUsers/ViewersStoreTest.php b/tests/Unit/OnlineUsers/ViewersStoreTest.php new file mode 100644 index 000000000..921ffda3a --- /dev/null +++ b/tests/Unit/OnlineUsers/ViewersStoreTest.php @@ -0,0 +1,86 @@ +store = new ViewersStore(); + } + + #[Test] + public function remainsGuestsCount(): void + { + $viewer = $this->store->viewers($this->guests(99)); + $this->assertSame(99, $viewer->guestsCount); + } + + #[Test] + public function viewerHasUserName(): void + { + $id = $this->models->newUserReturnId('Mark'); + $this->assertSame('Mark', $this->viewer($id)->name); + } + + #[Test] + public function viewerHasUserGroupName(): void + { + $id = $this->models->newUserReturnId(groupName:'Admin'); + $this->assertSame('Admin', $this->viewer($id)->groupName); + } + + #[Test] + public function viewerHasUserAvatar(): void + { + $id = $this->models->newUserReturnId(photoUrl:'image.png'); + $this->assertSame('image.png', $this->viewer($id)->avatarUrl); + } + + #[Test] + public function forUserWithoutGroup_viewerHasGroupNameNull(): void + { + $id = $this->models->newUserReturnId(); + $this->assertNull($this->viewer($id)->groupName); + } + + #[Test] + public function deletedUsers_areNotIncluded(): void + { + $id = $this->models->newUserReturnId(deleted:true); + $this->assertEmpty($this->viewers($id)); + } + + private function guests(int $guestsCount): SessionsSnapshot + { + return new SessionsSnapshot([], $guestsCount); + } + + private function users(array $users): SessionsSnapshot + { + return new SessionsSnapshot($users, 0); + } + + private function viewer(int $id): ViewerUser + { + return $this->viewers($id)[0]; + } + + private function viewers(int $id): array + { + $viewer = $this->store->viewers($this->users([$id])); + return $viewer->users; + } +}