package com.resumeparser.config; import com.resumeparser.service.FirestoreRateLimiterService; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.springframework.mock.web.MockHttpServletRequest; import org.springframework.mock.web.MockHttpServletResponse; import static org.junit.jupiter.api.Assertions.*; import static org.mockito.Mockito.*; class RateLimitInterceptorTest { private FirestoreRateLimiterService rateLimiterService; private RateLimitInterceptor interceptor; @BeforeEach void setUp() { rateLimiterService = mock(FirestoreRateLimiterService.class); interceptor = new RateLimitInterceptor(rateLimiterService); } @Test void shouldAllowOptionsRequestsWithoutRateLimiting() throws Exception { MockHttpServletRequest request = new MockHttpServletRequest(); request.setMethod("OPTIONS"); MockHttpServletResponse response = new MockHttpServletResponse(); boolean result = interceptor.preHandle(request, response, new Object()); assertTrue(result); verifyNoInteractions(rateLimiterService); } @Test void shouldAllowRequestWhenUnderLimit() throws Exception { MockHttpServletRequest request = new MockHttpServletRequest(); request.setMethod("POST"); request.setRemoteAddr("192.168.1.50"); MockHttpServletResponse response = new MockHttpServletResponse(); when(rateLimiterService.isAllowed("192.168.1.50")).thenReturn(true); boolean result = interceptor.preHandle(request, response, new Object()); assertTrue(result); assertEquals(200, response.getStatus()); } @Test void shouldBlockRequestWith429WhenLimitExceeded() throws Exception { MockHttpServletRequest request = new MockHttpServletRequest(); request.setMethod("POST"); request.setRemoteAddr("192.168.1.50"); MockHttpServletResponse response = new MockHttpServletResponse(); when(rateLimiterService.isAllowed("192.168.1.50")).thenReturn(false); boolean result = interceptor.preHandle(request, response, new Object()); assertFalse(result); assertEquals(429, response.getStatus()); assertTrue(response.getContentAsString().contains("Too many requests")); } @Test void shouldExtractIpFromXForwardedForHeader() throws Exception { MockHttpServletRequest request = new MockHttpServletRequest(); request.setMethod("POST"); request.addHeader("X-Forwarded-For", "203.0.113.195, 10.0.0.1"); request.setRemoteAddr("127.0.0.1"); MockHttpServletResponse response = new MockHttpServletResponse(); when(rateLimiterService.isAllowed("203.0.113.195")).thenReturn(true); boolean result = interceptor.preHandle(request, response, new Object()); assertTrue(result); verify(rateLimiterService).isAllowed("203.0.113.195"); } }