From 3320a360242a9003be1fed305328eb38b8091ee1 Mon Sep 17 00:00:00 2001 From: Louis Chmn Date: Thu, 23 Jul 2026 15:58:44 +0200 Subject: [PATCH 1/2] fix: Use global members limit as default for circle Signed-off-by: Louis Chmn --- lib/Command/CirclesList.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/Command/CirclesList.php b/lib/Command/CirclesList.php index e35e85db3..6cc02be7a 100644 --- a/lib/Command/CirclesList.php +++ b/lib/Command/CirclesList.php @@ -225,6 +225,7 @@ private function displayCircles(array $circles): void { ); $displayName = $this->input->getOption('display-name'); + $defaultMembersLimit = $this->configService->getAppValueInt(ConfigService::MEMBERS_LIMIT); $display = ($this->input->getOption('def') ? Circle::FLAGS_LONG : Circle::FLAGS_SHORT); $rows = []; foreach ($circles as $circle) { @@ -237,7 +238,7 @@ private function displayCircles(array $circles): void { $this->cut($displayName ? $owner->getDisplayName() : $owner->getUserId(), 40), $this->configService->displayInstance($owner->getInstance()), ((string)$circle->getPopulation()) . '/' - . ((string)$this->getInt('members_limit', $circle->getSettings(), -1)) + . ((string)$this->getInt('members_limit', $circle->getSettings(), $defaultMembersLimit)) . ' (' . ((string)$circle->getPopulationInherited()) . ')' ]; } From 2966c28af75ddc47d412c14a0f9b3139094980b0 Mon Sep 17 00:00:00 2001 From: Louis Chmn Date: Thu, 23 Jul 2026 17:30:45 +0200 Subject: [PATCH 2/2] test(CircleService): Add coverage for isCircleFull method Signed-off-by: Louis Chmn --- lib/Service/CircleService.php | 24 ++++-- tests/unit/lib/Service/CircleServiceTest.php | 87 ++++++++++++++++++++ 2 files changed, 103 insertions(+), 8 deletions(-) create mode 100644 tests/unit/lib/Service/CircleServiceTest.php diff --git a/lib/Service/CircleService.php b/lib/Service/CircleService.php index 35fcf9311..5ec685b48 100644 --- a/lib/Service/CircleService.php +++ b/lib/Service/CircleService.php @@ -682,15 +682,23 @@ public function isCircleFull(Circle $circle): bool { $members = $this->memberRequest->getMembers($circle->getSingleId(), null, $probe); - $limit = $this->getInt('members_limit', $circle->getSettings()); - if ($limit === 0) { - $limit = $this->configService->getAppValueInt(ConfigService::MEMBERS_LIMIT); - } - if ($limit === -1) { - return false; + $instanceLimit = $this->configService->getAppValueInt(ConfigService::MEMBERS_LIMIT); + $circleLimit = $this->getInt('members_limit', $circle->getSettings(), $instanceLimit); + $memberCount = sizeof($members); + + if ($instanceLimit === -1) { + if ($circleLimit === -1) { + return false; + } else { + return $memberCount >= $circleLimit; + } + } else { + if ($circleLimit === -1) { + return $memberCount >= $instanceLimit; + } else { + return $memberCount >= $instanceLimit || $memberCount >= $circleLimit; + } } - - return (sizeof($members) >= $limit); } diff --git a/tests/unit/lib/Service/CircleServiceTest.php b/tests/unit/lib/Service/CircleServiceTest.php new file mode 100644 index 000000000..3f7233dda --- /dev/null +++ b/tests/unit/lib/Service/CircleServiceTest.php @@ -0,0 +1,87 @@ +configService = $this->createMock(ConfigService::class); + $this->memberRequest = $this->createMock(MemberRequest::class); + + $this->circleService = new CircleService( + $this->createMock(IL10N::class), + $this->createMock(IHasher::class), + $this->createMock(ICacheFactory::class), + $this->createMock(CircleRequest::class), + $this->memberRequest, + $this->createMock(RemoteStreamService::class), + $this->createMock(FederatedUserService::class), + $this->createMock(FederatedEventService::class), + $this->createMock(MemberService::class), + $this->createMock(PermissionService::class), + $this->configService, + $this->createMock(IEventDispatcher::class), + ); + } + + private function circleFullDataProvider(): array { + return [ + [-1, -1, [$this->createMock(Member::class)], false], + [0, -1, [$this->createMock(Member::class)], true], + [1, -1, [$this->createMock(Member::class)], true], + [2, -1, [$this->createMock(Member::class)], false], + [-1, 0, [$this->createMock(Member::class)], true], + [-1, 1, [$this->createMock(Member::class)], true], + [-1, 2, [$this->createMock(Member::class)], false], + [0, 2, [$this->createMock(Member::class)], true], + [1, 2, [$this->createMock(Member::class)], true], + [2, 0, [$this->createMock(Member::class)], true], + [2, 1, [$this->createMock(Member::class)], true], + [2, 2, [$this->createMock(Member::class)], false], + ]; + } + + /** + * @dataProvider circleFullDataProvider + */ + public function testIsCircleFull(int $instanceLimit, int $circleLimit, array $members, bool $expectResult) { + $circle = $this->createMock(Circle::class); + $circle->method('getSettings')->willReturn(['members_limit' => $circleLimit]); + + $this->memberRequest->method('getMembers')->willReturn($members); + + $this->configService->method('getAppValueInt')->willReturn($instanceLimit); + + $this->assertSame($this->circleService->isCircleFull($circle), $expectResult); + } +}