|
1 | | -import { describe, it, expect, beforeEach } from 'vitest'; |
| 1 | +import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest'; |
2 | 2 | import request from 'supertest'; |
3 | 3 | import express, { type Request, type Response, type NextFunction } from 'express'; |
4 | 4 | import { createStreamRateLimiter } from '../src/middleware/stream-rate-limiter.middleware.js'; |
@@ -242,32 +242,85 @@ describe('Stream Creation Rate Limiter Middleware', () => { |
242 | 242 | }); |
243 | 243 |
|
244 | 244 | describe('Environment Variable Configuration', () => { |
245 | | - it('should use STREAM_CREATE_RATE_LIMIT environment variable', () => { |
246 | | - const originalEnv = process.env.STREAM_CREATE_RATE_LIMIT; |
247 | | - process.env.STREAM_CREATE_RATE_LIMIT = '5'; |
| 245 | + const originalEnv = process.env.STREAM_CREATE_RATE_LIMIT; |
248 | 246 |
|
249 | | - createStreamRateLimiter({ windowMs: 10000 }); |
250 | | - // The limiter should be created with max: 5 from env |
251 | | - |
252 | | - // Clean up |
253 | | - if (originalEnv) { |
| 247 | + afterEach(() => { |
| 248 | + if (originalEnv !== undefined) { |
254 | 249 | process.env.STREAM_CREATE_RATE_LIMIT = originalEnv; |
255 | 250 | } else { |
256 | 251 | delete process.env.STREAM_CREATE_RATE_LIMIT; |
257 | 252 | } |
| 253 | + vi.resetModules(); |
258 | 254 | }); |
259 | 255 |
|
260 | | - it('should default to 10 requests when STREAM_CREATE_RATE_LIMIT is not set', () => { |
261 | | - const originalEnv = process.env.STREAM_CREATE_RATE_LIMIT; |
| 256 | + it('should use STREAM_CREATE_RATE_LIMIT when max is omitted', async () => { |
| 257 | + process.env.STREAM_CREATE_RATE_LIMIT = '2'; |
| 258 | + vi.resetModules(); |
| 259 | + const { createStreamRateLimiter: createLimiter } = await import( |
| 260 | + '../src/middleware/stream-rate-limiter.middleware.js' |
| 261 | + ); |
| 262 | + const limiter = createLimiter({ windowMs: 10000 }); |
| 263 | + |
| 264 | + app.post( |
| 265 | + '/streams', |
| 266 | + mockAuthMiddleware('GENV123'), |
| 267 | + limiter, |
| 268 | + (req: Request, res: Response) => res.status(201).json({ success: true }) |
| 269 | + ); |
| 270 | + |
| 271 | + await request(app).post('/streams').set('Content-Type', 'application/json'); |
| 272 | + await request(app).post('/streams').set('Content-Type', 'application/json'); |
| 273 | + |
| 274 | + const res = await request(app) |
| 275 | + .post('/streams') |
| 276 | + .set('Content-Type', 'application/json'); |
| 277 | + expect(res.status).toBe(429); |
| 278 | + expect(res.headers['ratelimit-limit']).toBe('2'); |
| 279 | + }); |
| 280 | + |
| 281 | + it('should default to 10 requests when STREAM_CREATE_RATE_LIMIT is not set', async () => { |
262 | 282 | delete process.env.STREAM_CREATE_RATE_LIMIT; |
| 283 | + vi.resetModules(); |
| 284 | + const { createStreamRateLimiter: createLimiter } = await import( |
| 285 | + '../src/middleware/stream-rate-limiter.middleware.js' |
| 286 | + ); |
| 287 | + const limiter = createLimiter({ windowMs: 10000 }); |
263 | 288 |
|
264 | | - // The limiter should be created with max: 10 by default |
265 | | - createStreamRateLimiter({ windowMs: 10000 }); |
| 289 | + app.post( |
| 290 | + '/streams', |
| 291 | + mockAuthMiddleware('GENV456'), |
| 292 | + limiter, |
| 293 | + (req: Request, res: Response) => res.status(201).json({ success: true }) |
| 294 | + ); |
266 | 295 |
|
267 | | - // Clean up |
268 | | - if (originalEnv) { |
269 | | - process.env.STREAM_CREATE_RATE_LIMIT = originalEnv; |
270 | | - } |
| 296 | + const res = await request(app) |
| 297 | + .post('/streams') |
| 298 | + .set('Content-Type', 'application/json'); |
| 299 | + expect(res.headers['ratelimit-limit']).toBe('10'); |
| 300 | + }); |
| 301 | + |
| 302 | + it('should apply STREAM_CREATE_RATE_LIMIT to streamCreationRateLimiter export', async () => { |
| 303 | + process.env.STREAM_CREATE_RATE_LIMIT = '2'; |
| 304 | + vi.resetModules(); |
| 305 | + const { streamCreationRateLimiter } = await import( |
| 306 | + '../src/middleware/stream-rate-limiter.middleware.js' |
| 307 | + ); |
| 308 | + |
| 309 | + app.post( |
| 310 | + '/streams', |
| 311 | + mockAuthMiddleware('GEXPORT123'), |
| 312 | + streamCreationRateLimiter, |
| 313 | + (req: Request, res: Response) => res.status(201).json({ success: true }) |
| 314 | + ); |
| 315 | + |
| 316 | + await request(app).post('/streams').set('Content-Type', 'application/json'); |
| 317 | + await request(app).post('/streams').set('Content-Type', 'application/json'); |
| 318 | + |
| 319 | + const res = await request(app) |
| 320 | + .post('/streams') |
| 321 | + .set('Content-Type', 'application/json'); |
| 322 | + expect(res.status).toBe(429); |
| 323 | + expect(res.headers['ratelimit-limit']).toBe('2'); |
271 | 324 | }); |
272 | 325 | }); |
273 | 326 |
|
|
0 commit comments