diff --git a/src/main/java/ee/bitweb/core/retrofit/logging/mappers/RetrofitLoggingMapper.java b/src/main/java/ee/bitweb/core/retrofit/logging/mappers/RetrofitLoggingMapper.java index dbee240..00621ba 100644 --- a/src/main/java/ee/bitweb/core/retrofit/logging/mappers/RetrofitLoggingMapper.java +++ b/src/main/java/ee/bitweb/core/retrofit/logging/mappers/RetrofitLoggingMapper.java @@ -3,16 +3,17 @@ import ee.bitweb.core.exception.CoreException; import okhttp3.Request; import okhttp3.Response; +import org.jetbrains.annotations.Nullable; import java.util.Map; public interface RetrofitLoggingMapper { - String getValue(Request request, Response response); + String getValue(Request request, @Nullable Response response); String getKey(); - default void map(Request request, Response response, Map container) { + default void map(Request request, @Nullable Response response, Map container) { if (container.containsKey(getKey())) { throw new CoreException(String.format("Retrofit log container already contains value for key %s", getKey())); } diff --git a/src/main/java/ee/bitweb/core/retrofit/logging/mappers/RetrofitResponseBodyMapper.java b/src/main/java/ee/bitweb/core/retrofit/logging/mappers/RetrofitResponseBodyMapper.java index 2fd9274..774daa4 100644 --- a/src/main/java/ee/bitweb/core/retrofit/logging/mappers/RetrofitResponseBodyMapper.java +++ b/src/main/java/ee/bitweb/core/retrofit/logging/mappers/RetrofitResponseBodyMapper.java @@ -38,7 +38,9 @@ public String getKey() { } protected String getResponseBody(Response response) throws IOException { - if (RetrofitBodyMapperHelper.isRedactBodyUrl(redactBodyUrls, response.request().url().toString())) { + if (response == null) { + return "(response missing)"; + } else if (RetrofitBodyMapperHelper.isRedactBodyUrl(redactBodyUrls, response.request().url().toString())) { return "(body redacted)"; } else if (!promisesBody(response)) { return ""; diff --git a/src/main/java/ee/bitweb/core/retrofit/logging/mappers/RetrofitResponseBodySizeMapper.java b/src/main/java/ee/bitweb/core/retrofit/logging/mappers/RetrofitResponseBodySizeMapper.java index f2d3503..2c99db8 100644 --- a/src/main/java/ee/bitweb/core/retrofit/logging/mappers/RetrofitResponseBodySizeMapper.java +++ b/src/main/java/ee/bitweb/core/retrofit/logging/mappers/RetrofitResponseBodySizeMapper.java @@ -12,6 +12,10 @@ public class RetrofitResponseBodySizeMapper implements RetrofitLoggingMapper { @Override public String getValue(Request request, Response response) { + if (response == null) { + return "-"; + } + ResponseBody body = response.body(); return body != null ? String.valueOf(body.contentLength()) : "-"; diff --git a/src/main/java/ee/bitweb/core/retrofit/logging/mappers/RetrofitResponseHeadersMapper.java b/src/main/java/ee/bitweb/core/retrofit/logging/mappers/RetrofitResponseHeadersMapper.java index 2dc3b63..86caecb 100644 --- a/src/main/java/ee/bitweb/core/retrofit/logging/mappers/RetrofitResponseHeadersMapper.java +++ b/src/main/java/ee/bitweb/core/retrofit/logging/mappers/RetrofitResponseHeadersMapper.java @@ -28,6 +28,10 @@ public String getKey() { } protected String getResponseHeadersString(Response response) { + if (response == null) { + return "(response missing)"; + } + Map result = new HashMap<>(); var responseHeaders = response.headers(); diff --git a/src/main/java/ee/bitweb/core/retrofit/logging/mappers/RetrofitResponseStatusCodeMapper.java b/src/main/java/ee/bitweb/core/retrofit/logging/mappers/RetrofitResponseStatusCodeMapper.java index 36528f6..59ee7e6 100644 --- a/src/main/java/ee/bitweb/core/retrofit/logging/mappers/RetrofitResponseStatusCodeMapper.java +++ b/src/main/java/ee/bitweb/core/retrofit/logging/mappers/RetrofitResponseStatusCodeMapper.java @@ -11,6 +11,10 @@ public class RetrofitResponseStatusCodeMapper implements RetrofitLoggingMapper { @Override public String getValue(Request request, Response response) { + if (response == null) { + return "-"; + } + return String.valueOf(response.code()); } diff --git a/src/test/java/ee/bitweb/core/retrofit/logging/mappers/RetrofitResponseBodyMapperTest.java b/src/test/java/ee/bitweb/core/retrofit/logging/mappers/RetrofitResponseBodyMapperTest.java index 8dc80a6..dbccc71 100644 --- a/src/test/java/ee/bitweb/core/retrofit/logging/mappers/RetrofitResponseBodyMapperTest.java +++ b/src/test/java/ee/bitweb/core/retrofit/logging/mappers/RetrofitResponseBodyMapperTest.java @@ -213,6 +213,12 @@ void bodyIsGzipped() throws IOException { assertEquals("some amount of data", mapper.getValue(null, response)); } + @Test + @DisplayName("Response is missing") + void responseIsNull() { + assertEquals("(response missing)", new RetrofitResponseBodyMapper(new HashSet<>(), 4096).getValue(null, null)); + } + private Request request(String method) { return new Request( new HttpUrl.Builder() diff --git a/src/test/java/ee/bitweb/core/retrofit/logging/mappers/RetrofitResponseBodySizeMapperTest.java b/src/test/java/ee/bitweb/core/retrofit/logging/mappers/RetrofitResponseBodySizeMapperTest.java index 4262a57..4c18170 100644 --- a/src/test/java/ee/bitweb/core/retrofit/logging/mappers/RetrofitResponseBodySizeMapperTest.java +++ b/src/test/java/ee/bitweb/core/retrofit/logging/mappers/RetrofitResponseBodySizeMapperTest.java @@ -48,4 +48,14 @@ void testResponseBodyIsNotAvailable() { Mockito.verifyNoMoreInteractions(response); Mockito.verifyNoInteractions(responseBody); } + + @Test + @DisplayName("When response is not available, should return '-'") + void testResponseIsNotAvailable() { + RetrofitResponseBodySizeMapper mapper = new RetrofitResponseBodySizeMapper(); + + assertEquals("-", mapper.getValue(null, null)); + + Mockito.verifyNoInteractions(response, responseBody); + } } diff --git a/src/test/java/ee/bitweb/core/retrofit/logging/mappers/RetrofitResponseStatusCodeMapperTest.java b/src/test/java/ee/bitweb/core/retrofit/logging/mappers/RetrofitResponseStatusCodeMapperTest.java new file mode 100644 index 0000000..8e50874 --- /dev/null +++ b/src/test/java/ee/bitweb/core/retrofit/logging/mappers/RetrofitResponseStatusCodeMapperTest.java @@ -0,0 +1,42 @@ +package ee.bitweb.core.retrofit.logging.mappers; + +import okhttp3.Response; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Tag; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.mockito.junit.jupiter.MockitoExtension; + +import static org.junit.jupiter.api.Assertions.*; + +@Tag("unit") +@ExtendWith(MockitoExtension.class) +class RetrofitResponseStatusCodeMapperTest { + + @Mock + Response response; + + @Test + @DisplayName("When response is not available, should return '-'") + void testResponseIsNotAvailable() { + RetrofitResponseStatusCodeMapper mapper = new RetrofitResponseStatusCodeMapper(); + + assertEquals("-", mapper.getValue(null, null)); + + Mockito.verifyNoInteractions(response); + } + + @Test + @DisplayName("Returns correct response code") + void testResponseBodyLengthIsSuccessfullyRetrieved() { + Mockito.when(response.code()).thenReturn(200); + RetrofitResponseStatusCodeMapper mapper = new RetrofitResponseStatusCodeMapper(); + + assertEquals("200", mapper.getValue(null, response)); + + Mockito.verify(response, Mockito.times(1)).code(); + Mockito.verifyNoMoreInteractions(response); + } +}