From 960dfe44169e3478cef698c773da8c29016ae0db Mon Sep 17 00:00:00 2001 From: Johan Date: Sun, 1 Mar 2026 20:22:41 +0100 Subject: [PATCH] Add unit tests for TimeoutFilter Co-authored-by: Emma Travljanin --- .../org/juv25d/filter/TimeoutFilterTest.java | 73 +++++++++++++++++++ 1 file changed, 73 insertions(+) create mode 100644 src/test/java/org/juv25d/filter/TimeoutFilterTest.java diff --git a/src/test/java/org/juv25d/filter/TimeoutFilterTest.java b/src/test/java/org/juv25d/filter/TimeoutFilterTest.java new file mode 100644 index 00000000..a05e7cb6 --- /dev/null +++ b/src/test/java/org/juv25d/filter/TimeoutFilterTest.java @@ -0,0 +1,73 @@ +package org.juv25d.filter; + +import org.juv25d.http.HttpRequest; +import org.juv25d.http.HttpResponse; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.Timeout; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; + +import java.io.IOException; +import java.nio.charset.StandardCharsets; +import java.util.concurrent.TimeUnit; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; +import static org.mockito.Mockito.*; + +@ExtendWith(MockitoExtension.class) +class TimeoutFilterTest { + + @Mock HttpRequest req; + @Mock FilterChain chain; + + @Test + void fastRequest_keepsDefault200() throws IOException { + when(req.path()).thenReturn("/fast"); + HttpResponse res = new HttpResponse(); + TimeoutFilter filter = new TimeoutFilter(); + + doNothing().when(chain).doFilter(req, res); + + filter.doFilter(req, res, chain); + + verify(chain).doFilter(req, res); + assertThat(res.statusCode()).isEqualTo(200); + } + + @Test + @Timeout(value = 4, unit = TimeUnit.SECONDS) + void slowRequest_sets504() throws IOException { + when(req.path()).thenReturn("/slow"); + HttpResponse res = new HttpResponse(); + TimeoutFilter filter = new TimeoutFilter(); + + doAnswer(inv -> { + Thread.sleep(3_000); // > 2000ms => timeout + return null; + }).when(chain).doFilter(req, res); + + filter.doFilter(req, res, chain); + + verify(chain).doFilter(req, res); + assertThat(res.statusCode()).isEqualTo(504); + assertThat(res.statusText()).isEqualTo("Gateway Timeout"); + assertThat(new String(res.body(), StandardCharsets.UTF_8)) + .isEqualTo("504 - Gateway Timeout"); + } + + @Test + void downstreamIOException_throwsRuntimeException() throws IOException { + when(req.path()).thenReturn("/boom"); + HttpResponse res = new HttpResponse(); + TimeoutFilter filter = new TimeoutFilter(); + + doThrow(new IOException("fail")).when(chain).doFilter(req, res); + + assertThatThrownBy(() -> filter.doFilter(req, res, chain)) + .isInstanceOf(RuntimeException.class); + + verify(chain).doFilter(req, res); + } +}