diff options
| author | Greg Roach <greg@subaqua.co.uk> | 2021-10-04 11:02:56 +0100 |
|---|---|---|
| committer | Greg Roach <greg@subaqua.co.uk> | 2021-10-04 11:06:24 +0100 |
| commit | 9ed332c7e150b010efb7bb4244cb1f8ef3e2f5dc (patch) | |
| tree | be7f49ef7964581c3bcdc3f677894bdc3e56ae8b /tests/app | |
| parent | 81b729d3a9a6e0a0e8b96285d1ad7955d2d0c659 (diff) | |
| download | webtrees-9ed332c7e150b010efb7bb4244cb1f8ef3e2f5dc.tar.gz webtrees-9ed332c7e150b010efb7bb4244cb1f8ef3e2f5dc.tar.bz2 webtrees-9ed332c7e150b010efb7bb4244cb1f8ef3e2f5dc.zip | |
Add rate-limit for visitor actions that could send email
Diffstat (limited to 'tests/app')
| -rw-r--r-- | tests/app/Services/RateLimitServiceTest.php | 113 |
1 files changed, 113 insertions, 0 deletions
diff --git a/tests/app/Services/RateLimitServiceTest.php b/tests/app/Services/RateLimitServiceTest.php new file mode 100644 index 0000000000..d2af39e204 --- /dev/null +++ b/tests/app/Services/RateLimitServiceTest.php @@ -0,0 +1,113 @@ +<?php + +/** + * webtrees: online genealogy + * Copyright (C) 2021 webtrees development team + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <https://www.gnu.org/licenses/>. + */ + +declare(strict_types=1); + +namespace Fisharebest\Webtrees\Services; + +use Fisharebest\Webtrees\GuestUser; +use Fisharebest\Webtrees\Http\Exceptions\HttpTooManyRequestsException; +use Fisharebest\Webtrees\TestCase; +use LogicException; + +use function explode; +use function implode; +use function range; +use function time; + +/** + * Test harness for the class RateLimitService + */ +class RateLimitServiceTest extends TestCase +{ + /** + * @covers \Fisharebest\Webtrees\Services\RateLimitService + * + * @return void + */ + public function testTooMuchHistory(): void + { + $rate_limit_service = new RateLimitService(); + + $user = new GuestUser(); + + $this->expectException(LogicException::class); + + $rate_limit_service->limitRateForUser($user, 1000, 30, 'rate-limit'); + } + + /** + * @covers \Fisharebest\Webtrees\Services\RateLimitService + * + * @return void + */ + public function testLimitNotReached(): void + { + $rate_limit_service = new RateLimitService(); + + $user = new GuestUser(); + + $rate_limit_service->limitRateForUser($user, 3, 30, 'rate-limit'); + $history = $user->getPreference('rate-limit'); + $this->assertCount(1, explode(',', $history)); + + $rate_limit_service->limitRateForUser($user, 3, 30, 'rate-limit'); + $history = $user->getPreference('rate-limit'); + $this->assertCount(2, explode(',', $history)); + + $rate_limit_service->limitRateForUser($user, 3, 30, 'rate-limit'); + $history = $user->getPreference('rate-limit'); + $this->assertCount(3, explode(',', $history)); + } + + /** + * @covers \Fisharebest\Webtrees\Services\RateLimitService + * + * @return void + */ + public function testOldEventsIgnored(): void + { + $rate_limit_service = new RateLimitService(); + + $user = new GuestUser(); + + $history = implode(',', range(time() - 35, time() - 31)); + $user->setPreference('rate-limit', $history); + + $rate_limit_service->limitRateForUser($user, 5, 30, 'rate-limit'); + $history = $user->getPreference('rate-limit'); + $this->assertCount(6, explode(',', $history)); + } + + /** + * @covers \Fisharebest\Webtrees\Services\RateLimitService + * + * @return void + */ + public function testLimitReached(): void + { + $rate_limit_service = new RateLimitService(); + + $user = new GuestUser(); + + $history = implode(',', range(time() - 5, time() - 1)); + $user->setPreference('rate-limit', $history); + + $this->expectException(HttpTooManyRequestsException::class); + $rate_limit_service->limitRateForUser($user, 5, 30, 'rate-limit'); + } +} |
