summaryrefslogtreecommitdiff
path: root/tests/rateLimiter.test.ts
diff options
context:
space:
mode:
authorgrothedev <grothedev@gmail.com>2025-12-28 21:41:07 -0500
committergrothedev <grothedev@gmail.com>2025-12-28 21:41:07 -0500
commitbd6c3a07a82ba11cf7b0423307229891675e7ed3 (patch)
treefce602bc4038f0f79e12f9fb296e3d220915da23 /tests/rateLimiter.test.ts
parentf978ad7db04ced4cbcf04a82bf6f0cc3f4ce66a3 (diff)
phase 1 complete i guessHEADmain
Diffstat (limited to 'tests/rateLimiter.test.ts')
-rw-r--r--tests/rateLimiter.test.ts106
1 files changed, 106 insertions, 0 deletions
diff --git a/tests/rateLimiter.test.ts b/tests/rateLimiter.test.ts
new file mode 100644
index 0000000..2645deb
--- /dev/null
+++ b/tests/rateLimiter.test.ts
@@ -0,0 +1,106 @@
+import { assertEquals } from "@std/assert";
+import { config } from "../config.ts";
+
+Deno.test("RateLimiter - allows first request", () => {
+ // Create a new rate limiter instance for testing
+ class TestRateLimiter {
+ private storage = new Map<string, { count: number; resetTime: number }>();
+
+ isRateLimited(ip: string): boolean {
+ const now = Date.now();
+ const entry = this.storage.get(ip);
+
+ if (!entry || now > entry.resetTime) {
+ this.storage.set(ip, {
+ count: 1,
+ resetTime: now + config.rateLimit.windowMs,
+ });
+ return false;
+ }
+
+ if (entry.count >= config.rateLimit.maxUploads) {
+ return true;
+ }
+
+ entry.count++;
+ return false;
+ }
+ }
+
+ const limiter = new TestRateLimiter();
+ assertEquals(limiter.isRateLimited("127.0.0.1"), false);
+});
+
+Deno.test("RateLimiter - allows requests within limit", () => {
+ class TestRateLimiter {
+ private storage = new Map<string, { count: number; resetTime: number }>();
+
+ isRateLimited(ip: string): boolean {
+ const now = Date.now();
+ const entry = this.storage.get(ip);
+
+ if (!entry || now > entry.resetTime) {
+ this.storage.set(ip, {
+ count: 1,
+ resetTime: now + config.rateLimit.windowMs,
+ });
+ return false;
+ }
+
+ if (entry.count >= config.rateLimit.maxUploads) {
+ return true;
+ }
+
+ entry.count++;
+ return false;
+ }
+ }
+
+ const limiter = new TestRateLimiter();
+ const ip = "192.168.1.1";
+
+ // Make requests up to the limit
+ for (let i = 0; i < config.rateLimit.maxUploads; i++) {
+ assertEquals(limiter.isRateLimited(ip), false, `Request ${i + 1} should be allowed`);
+ }
+
+ // Next request should be blocked
+ assertEquals(limiter.isRateLimited(ip), true, "Request beyond limit should be blocked");
+});
+
+Deno.test("RateLimiter - different IPs have separate limits", () => {
+ class TestRateLimiter {
+ private storage = new Map<string, { count: number; resetTime: number }>();
+
+ isRateLimited(ip: string): boolean {
+ const now = Date.now();
+ const entry = this.storage.get(ip);
+
+ if (!entry || now > entry.resetTime) {
+ this.storage.set(ip, {
+ count: 1,
+ resetTime: now + config.rateLimit.windowMs,
+ });
+ return false;
+ }
+
+ if (entry.count >= config.rateLimit.maxUploads) {
+ return true;
+ }
+
+ entry.count++;
+ return false;
+ }
+ }
+
+ const limiter = new TestRateLimiter();
+
+ // Max out first IP
+ for (let i = 0; i < config.rateLimit.maxUploads; i++) {
+ limiter.isRateLimited("10.0.0.1");
+ }
+ assertEquals(limiter.isRateLimited("10.0.0.1"), true);
+
+ // Second IP should still be allowed
+ assertEquals(limiter.isRateLimited("10.0.0.2"), false);
+});