userSession = $this->createMock(IUserSession::class); $this->config = $this->createMock(IAppConfig::class); $this->limiter = $this->createMock(ILimiter::class); $this->rateLimiting = new RateLimiting( $this->userSession, $this->config, $this->limiter, ); } public function testNoUserObject(): void { $this->userSession->expects($this->once()) ->method('getUser') ->willReturn(null); $this->limiter->expects($this->never()) ->method('registerUserRequest'); $this->rateLimiting->check(); } public function testRegisterShareRequest(): void { $user = $this->createMock(IUser::class); $this->userSession->expects($this->once()) ->method('getUser') ->willReturn($user); $this->config->method('getValueInt') ->willReturnCallback(static function (string $app, string $key, int $default): int { return match ($key) { 'rateLimitShareAddressbookOrCalendar' => 7, 'rateLimitPeriodShareAddressbookOrCalendar' => 600, default => $default, }; }); $this->limiter->expects($this->once()) ->method('registerUserRequest') ->with( 'share-addressbook-or-calendar', 7, 600, $user, ); $this->rateLimiting->check(); } public function testShareRequestRateLimitExceeded(): void { $user = $this->createMock(IUser::class); $this->userSession->expects($this->once()) ->method('getUser') ->willReturn($user); $this->config->method('getValueInt') ->willReturnArgument(2); $this->limiter->expects($this->once()) ->method('registerUserRequest') ->with( 'share-addressbook-or-calendar', 100, 3600, $user, ) ->willThrowException($this->createMock(IRateLimitExceededException::class)); $this->expectException(TooManyRequests::class); $this->rateLimiting->check(); } }