summaryrefslogtreecommitdiff
path: root/tests/app
diff options
context:
space:
mode:
authorGreg Roach <greg@subaqua.co.uk>2021-10-04 11:02:56 +0100
committerGreg Roach <greg@subaqua.co.uk>2021-10-04 11:06:24 +0100
commit9ed332c7e150b010efb7bb4244cb1f8ef3e2f5dc (patch)
treebe7f49ef7964581c3bcdc3f677894bdc3e56ae8b /tests/app
parent81b729d3a9a6e0a0e8b96285d1ad7955d2d0c659 (diff)
downloadwebtrees-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.php113
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');
+ }
+}