From f538594689f3b18c7de137df70bd9ad144f68289 Mon Sep 17 00:00:00 2001 From: sonallux Date: Tue, 2 Dec 2025 20:08:42 +0100 Subject: [PATCH 1/2] feat: update to okhttp 5 --- spotify-web-api-java/pom.xml | 12 ++--- .../sonallux/spotify/api/ConversionTest.java | 50 +++++++++++-------- .../sonallux/spotify/api/SpotifyApiTest.java | 44 ++++++++-------- .../AuthorizationCodeFlowTest.java | 32 ++++++------ .../AuthorizationCodePKCEFlowTest.java | 30 +++++------ .../ClientCredentialsFlowTest.java | 32 ++++++------ .../spotify/api/http/ApiClientTest.java | 46 ++++++++--------- .../org/junit/rules/ExternalResource.java | 14 ------ 8 files changed, 127 insertions(+), 133 deletions(-) delete mode 100644 spotify-web-api-java/src/test/java/org/junit/rules/ExternalResource.java diff --git a/spotify-web-api-java/pom.xml b/spotify-web-api-java/pom.xml index de064c6..1a1664f 100644 --- a/spotify-web-api-java/pom.xml +++ b/spotify-web-api-java/pom.xml @@ -20,7 +20,7 @@ https://github.com/sonallux/spotify-web-api-java - 4.12.0 + 5.3.2 2.20.1 de.sonallux.spotify.api @@ -48,7 +48,7 @@ com.squareup.okhttp3 - okhttp + okhttp-jvm com.fasterxml.jackson.core @@ -78,14 +78,8 @@ com.squareup.okhttp3 - mockwebserver + mockwebserver3 test - - - junit - junit - - diff --git a/spotify-web-api-java/src/test/java/de/sonallux/spotify/api/ConversionTest.java b/spotify-web-api-java/src/test/java/de/sonallux/spotify/api/ConversionTest.java index 8170ba3..96fcc3a 100644 --- a/spotify-web-api-java/src/test/java/de/sonallux/spotify/api/ConversionTest.java +++ b/spotify-web-api-java/src/test/java/de/sonallux/spotify/api/ConversionTest.java @@ -2,8 +2,8 @@ import de.sonallux.spotify.api.models.Episode; import de.sonallux.spotify.api.models.Track; -import okhttp3.mockwebserver.MockResponse; -import okhttp3.mockwebserver.MockWebServer; +import mockwebserver3.MockWebServer; +import mockwebserver3.MockResponse; import okio.Buffer; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; @@ -29,7 +29,7 @@ void setup() throws IOException { @AfterEach void teardown() throws IOException{ - webServer.shutdown(); + webServer.close(); } @Test @@ -44,13 +44,13 @@ void testResponseSnakeCaseToCamelCase() throws Exception { var firstTrack = playlist.getTracks().getItems().get(0); assertNotNull(firstTrack); assertEquals(Instant.parse("2021-03-07T23:01:00Z"), firstTrack.getAddedAt()); - assertTrue(firstTrack.getTrack() instanceof Track); + assertInstanceOf(Track.class, firstTrack.getTrack()); assertEquals(6, ((Track) firstTrack.getTrack()).getTrackNumber()); } @Test void testRequestWithReservedKeyWord() throws Exception { - webServer.enqueue(new MockResponse().setStatus("HTTP/1.1 200 OK")); + webServer.enqueue(mockResponse(200).build()); var response = api.getPlaylistsApi().changePlaylistDetails("foo") .name("Test") @@ -61,26 +61,26 @@ void testRequestWithReservedKeyWord() throws Exception { assertTrue(response.isSuccessful()); var request = webServer.takeRequest(); - assertEquals("application/json; charset=UTF-8", request.getHeader("Content-Type")); - var actualBody = request.getBody().readUtf8(); + assertEquals("application/json; charset=UTF-8", request.getHeaders().get("Content-Type")); + var actualBody = request.getBody().utf8(); assertEquals("{\"name\":\"Test\",\"collaborative\":false,\"description\":\"Test description\",\"public\":true}", actualBody); } @Test void testRequestWithEmptyBodyObject() throws Exception { - webServer.enqueue(new MockResponse().setStatus("HTTP/1.1 200 OK")); + webServer.enqueue(mockResponse(200).build()); var response = api.getPlaylistsApi().changePlaylistDetails("foo").build().executeCall(); assertTrue(response.isSuccessful()); var request = webServer.takeRequest(); - var actualBody = request.getBody().readUtf8(); + var actualBody = request.getBody().utf8(); assertEquals("", actualBody); } @Test void testRequestWithSnakeCaseToCamelCase() throws Exception { - webServer.enqueue(new MockResponse().setStatus("HTTP/1.1 200 OK").setBody("{\"snapshot_id\":\"12ab34cd\"}")); + webServer.enqueue(mockResponse(200).body("{\"snapshot_id\":\"12ab34cd\"}").build()); var newSnapshotId = api.getPlaylistsApi().removeTracksPlaylist("foo", List.of()) .snapshotId("ab12cd34") @@ -88,8 +88,8 @@ void testRequestWithSnakeCaseToCamelCase() throws Exception { assertEquals("12ab34cd", newSnapshotId.getSnapshotId()); var request = webServer.takeRequest(); - assertEquals("application/json; charset=UTF-8", request.getHeader("Content-Type")); - var actualBody = request.getBody().readUtf8(); + assertEquals("application/json; charset=UTF-8", request.getHeaders().get("Content-Type")); + var actualBody = request.getBody().utf8(); assertEquals("{\"tracks\":[],\"snapshot_id\":\"ab12cd34\"}", actualBody); } @@ -101,16 +101,17 @@ void testUnionTypeHandlingWithAdditionalTypesParameter() throws Exception { var track = response.getItems().get(0).getTrack(); assertNotNull(track); assertEquals("track", track.getType()); - assertTrue(track instanceof Track); + assertInstanceOf(Track.class, track); var episode = response.getItems().get(1).getTrack(); assertNotNull(episode); assertEquals("episode", episode.getType()); - assertTrue(episode instanceof Episode); + assertInstanceOf(Episode.class, episode); assertNotNull(((Episode) episode).getShow()); var request = webServer.takeRequest(); - assertEquals("/playlists/foo/tracks?additional_types=track%2Cepisode", request.getPath()); + assertEquals("/playlists/foo/tracks", request.getUrl().encodedPath()); + assertEquals("additional_types=track%2Cepisode", request.getUrl().encodedQuery()); } @Test @@ -123,21 +124,22 @@ void testUnionTypeHandlingWithoutAdditionalTypesParameter() throws Exception { var track = response.getItems().get(0).getTrack(); assertNotNull(track); assertEquals("track", track.getType()); - assertTrue(track instanceof Track); + assertInstanceOf(Track.class, track); var episode = response.getItems().get(1).getTrack(); assertNotNull(episode); assertEquals("episode", episode.getType()); - assertTrue(episode instanceof Episode); + assertInstanceOf(Episode.class, episode); assertNull(((Episode) episode).getShow());//show is not set, because episode is returned with track format var request = webServer.takeRequest(); - assertEquals("/playlists/foo/tracks?additional_types=track", request.getPath()); + assertEquals("/playlists/foo/tracks", request.getUrl().encodedPath()); + assertEquals("additional_types=track", request.getUrl().encodedQuery()); } @Test void testEmptyResponseBodyWithNonVoidType() throws Exception { - webServer.enqueue(new MockResponse().setStatus("HTTP/1.1 204 NO CONTENT")); + webServer.enqueue(mockResponse(204).build()); var response = api.getPlayerApi().getRecentlyPlayed().build().executeCall(); assertTrue(response.isSuccessful()); @@ -147,9 +149,13 @@ void testEmptyResponseBodyWithNonVoidType() throws Exception { private MockResponse loadMockResponse(String fileName) throws Exception { var stream = ConversionTest.class.getResourceAsStream("/responses/" + fileName); var buffer = new Buffer().readFrom(stream); - return new MockResponse() - .setStatus("HTTP/1.1 200 OK") + return mockResponse(200) .addHeader("Content-Type", "application/json; charset=utf-8") - .setBody(buffer); + .body(buffer) + .build(); + } + + private MockResponse.Builder mockResponse(int status) { + return new MockResponse.Builder().code(status); } } diff --git a/spotify-web-api-java/src/test/java/de/sonallux/spotify/api/SpotifyApiTest.java b/spotify-web-api-java/src/test/java/de/sonallux/spotify/api/SpotifyApiTest.java index 302fea3..b191f79 100644 --- a/spotify-web-api-java/src/test/java/de/sonallux/spotify/api/SpotifyApiTest.java +++ b/spotify-web-api-java/src/test/java/de/sonallux/spotify/api/SpotifyApiTest.java @@ -1,8 +1,8 @@ package de.sonallux.spotify.api; import de.sonallux.spotify.api.authorization.ApiAuthorizationProvider; -import okhttp3.mockwebserver.MockResponse; -import okhttp3.mockwebserver.MockWebServer; +import mockwebserver3.MockResponse; +import mockwebserver3.MockWebServer; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -33,7 +33,7 @@ void setup() throws IOException { @AfterEach void teardown() throws IOException{ - webServer.shutdown(); + webServer.close(); } @Test @@ -46,10 +46,10 @@ void addNoAuthorizationHeaderToRequest() throws Exception { assertEquals("0OdUWJ0sBjDrqHygGUXeCF", artist.getId()); assertEquals("https://open.spotify.com/artist/0OdUWJ0sBjDrqHygGUXeCF", artist.getExternalUrls().getSpotify()); - assertEquals(webServer.getRequestCount(), 1); + assertEquals(1, webServer.getRequestCount()); var request = webServer.takeRequest(); - assertEquals(request.getRequestLine(), "GET /artists/foo HTTP/1.1"); - assertNull(request.getHeader("Authorization")); + assertEquals("GET /artists/foo HTTP/1.1", request.getRequestLine()); + assertNull(request.getHeaders().get("Authorization")); } @Test @@ -62,10 +62,10 @@ void addAuthorizationHeaderToRequest() throws Exception { assertEquals("0OdUWJ0sBjDrqHygGUXeCF", artist.getId()); assertEquals("https://open.spotify.com/artist/0OdUWJ0sBjDrqHygGUXeCF", artist.getExternalUrls().getSpotify()); - assertEquals(webServer.getRequestCount(), 1); + assertEquals(1, webServer.getRequestCount()); var request = webServer.takeRequest(); - assertEquals(request.getRequestLine(), "GET /artists/foo HTTP/1.1"); - assertEquals(request.getHeader("Authorization"), "Bearer some-access-token"); + assertEquals("GET /artists/foo HTTP/1.1", request.getRequestLine()); + assertEquals("Bearer some-access-token", request.getHeaders().get("Authorization")); } @Test @@ -81,11 +81,11 @@ void handlesUnauthorizedResponseWithRetry() throws Exception { verify(apiAuthorizationProvider, times(1)).refreshAccessToken(); - assertEquals(webServer.getRequestCount(), 2); + assertEquals(2, webServer.getRequestCount()); var request1 = webServer.takeRequest(); - assertEquals(request1.getRequestLine(), "GET /artists/foo HTTP/1.1"); + assertEquals("GET /artists/foo HTTP/1.1", request1.getRequestLine()); var request2 = webServer.takeRequest(); - assertEquals(request2.getRequestLine(), "GET /artists/foo HTTP/1.1"); + assertEquals("GET /artists/foo HTTP/1.1", request2.getRequestLine()); } @Test @@ -98,18 +98,19 @@ void handlesUnauthorizedResponseWithFailure() throws Exception { verify(apiAuthorizationProvider, times(1)).refreshAccessToken(); - assertEquals(webServer.getRequestCount(), 1); + assertEquals(1, webServer.getRequestCount()); var request1 = webServer.takeRequest(); - assertEquals(request1.getRequestLine(), "GET /artists/foo HTTP/1.1"); + assertEquals("GET /artists/foo HTTP/1.1", request1.getRequestLine()); } - private final MockResponse mockResponseUnauthorizedInvalidToken = new MockResponse() - .setStatus("HTTP/1.1 401 Unauthorized") - .setBody("{\"error\": {\"status\": 401,\"message\": \"Invalid access token\"}}"); + private final MockResponse mockResponseUnauthorizedInvalidToken = new MockResponse.Builder() + .code(401) + .body("{\"error\": {\"status\": 401,\"message\": \"Invalid access token\"}}") + .build(); - private final MockResponse mockResponseArtist = new MockResponse() - .setStatus("HTTP/1.1 200 OK") - .setBody("{\n" + + private final MockResponse mockResponseArtist = new MockResponse.Builder() + .code(200) + .body("{\n" + " \"external_urls\" : {\n" + " \"spotify\" : \"https://open.spotify.com/artist/0OdUWJ0sBjDrqHygGUXeCF\"\n" + " },\n" + @@ -133,5 +134,6 @@ void handlesUnauthorizedResponseWithFailure() throws Exception { " \"popularity\" : 59,\n" + " \"type\" : \"artist\",\n" + " \"uri\" : \"spotify:artist:0OdUWJ0sBjDrqHygGUXeCF\"\n" + - "}"); + "}") + .build(); } diff --git a/spotify-web-api-java/src/test/java/de/sonallux/spotify/api/authorization/authorization_code/AuthorizationCodeFlowTest.java b/spotify-web-api-java/src/test/java/de/sonallux/spotify/api/authorization/authorization_code/AuthorizationCodeFlowTest.java index 88aad23..018a186 100644 --- a/spotify-web-api-java/src/test/java/de/sonallux/spotify/api/authorization/authorization_code/AuthorizationCodeFlowTest.java +++ b/spotify-web-api-java/src/test/java/de/sonallux/spotify/api/authorization/authorization_code/AuthorizationCodeFlowTest.java @@ -1,9 +1,9 @@ package de.sonallux.spotify.api.authorization.authorization_code; import de.sonallux.spotify.api.authorization.*; -import okhttp3.mockwebserver.MockResponse; -import okhttp3.mockwebserver.MockWebServer; -import okhttp3.mockwebserver.RecordedRequest; +import mockwebserver3.MockResponse; +import mockwebserver3.MockWebServer; +import mockwebserver3.RecordedRequest; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -36,7 +36,7 @@ void setup() throws IOException { @AfterEach void teardown() throws IOException{ - webServer.shutdown(); + webServer.close(); } @Test @@ -167,10 +167,10 @@ void refreshAccessTokenWithoutTokenTest() { private void assertAuthTokensRequest(RecordedRequest request, String requestBody) { assertEquals("POST", request.getMethod()); - assertEquals("/api/token", request.getPath()); - assertEquals("Basic MWEyYjNjNGQ1ZTZmNzpiYXI0NTY=", request.getHeader("Authorization")); - assertEquals("application/x-www-form-urlencoded", request.getHeader("Content-Type")); - assertEquals(requestBody, request.getBody().readUtf8()); + assertEquals("/api/token", request.getUrl().encodedPath()); + assertEquals("Basic MWEyYjNjNGQ1ZTZmNzpiYXI0NTY=", request.getHeaders().get("Authorization")); + assertEquals("application/x-www-form-urlencoded", request.getHeaders().get("Content-Type")); + assertEquals(requestBody, request.getBody().utf8()); } private void assertStoreAuthTokensFromResponse() { @@ -184,16 +184,18 @@ private void assertStoreAuthTokensFromResponse() { })); } - private final MockResponse mockResponseAuthTokens = new MockResponse() - .setStatus("HTTP/1.1 200 OK") - .setBody("{\n" + + private final MockResponse mockResponseAuthTokens = new MockResponse.Builder() + .code(200) + .body("{\n" + " \"access_token\": \"NgA6ZcYIixn8bU\",\n" + " \"token_type\": \"Bearer\",\n" + " \"scope\": \"user-read-private user-read-email\",\n" + " \"expires_in\": 3600\n" + - "}"); + "}") + .build(); - private final MockResponse mockResponseBadRequestAuthTokens = new MockResponse() - .setStatus("HTTP/1.1 400 Bad Request") - .setBody("{\"error\":\"invalid_client\",\"error_description\":\"Invalid client\"}"); + private final MockResponse mockResponseBadRequestAuthTokens = new MockResponse.Builder() + .code(4) + .body("{\"error\":\"invalid_client\",\"error_description\":\"Invalid client\"}") + .build(); } diff --git a/spotify-web-api-java/src/test/java/de/sonallux/spotify/api/authorization/authorization_code/AuthorizationCodePKCEFlowTest.java b/spotify-web-api-java/src/test/java/de/sonallux/spotify/api/authorization/authorization_code/AuthorizationCodePKCEFlowTest.java index e3a4e8f..1639fcf 100644 --- a/spotify-web-api-java/src/test/java/de/sonallux/spotify/api/authorization/authorization_code/AuthorizationCodePKCEFlowTest.java +++ b/spotify-web-api-java/src/test/java/de/sonallux/spotify/api/authorization/authorization_code/AuthorizationCodePKCEFlowTest.java @@ -1,9 +1,9 @@ package de.sonallux.spotify.api.authorization.authorization_code; import de.sonallux.spotify.api.authorization.*; -import okhttp3.mockwebserver.MockResponse; -import okhttp3.mockwebserver.MockWebServer; -import okhttp3.mockwebserver.RecordedRequest; +import mockwebserver3.MockResponse; +import mockwebserver3.MockWebServer; +import mockwebserver3.RecordedRequest; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -36,7 +36,7 @@ void setup() throws IOException { @AfterEach void teardown() throws IOException{ - webServer.shutdown(); + webServer.close(); } @Test @@ -162,9 +162,9 @@ void refreshAccessTokenWithoutTokenTest() { private void assertAuthTokensRequest(RecordedRequest request, String body) { assertEquals("POST", request.getMethod()); - assertEquals("/api/token", request.getPath()); - assertEquals("application/x-www-form-urlencoded", request.getHeader("Content-Type")); - assertEquals(body, request.getBody().readUtf8()); + assertEquals("/api/token", request.getUrl().encodedPath()); + assertEquals("application/x-www-form-urlencoded", request.getHeaders().get("Content-Type")); + assertEquals(body, request.getBody().utf8()); } private void assertStoreAuthTokensFromResponse() { @@ -178,16 +178,18 @@ private void assertStoreAuthTokensFromResponse() { })); } - private final MockResponse mockResponseAuthTokens = new MockResponse() - .setStatus("HTTP/1.1 200 OK") - .setBody("{\n" + + private final MockResponse mockResponseAuthTokens = new MockResponse.Builder() + .code(200) + .body("{\n" + " \"access_token\": \"NgA6ZcYIixn8bU\",\n" + " \"token_type\": \"Bearer\",\n" + " \"scope\": \"user-read-private user-read-email\",\n" + " \"expires_in\": 3600\n" + - "}"); + "}") + .build(); - private final MockResponse mockResponseBadRequestAuthTokens = new MockResponse() - .setStatus("HTTP/1.1 400 Bad Request") - .setBody("{\"error\":\"invalid_client\",\"error_description\":\"Invalid client\"}"); + private final MockResponse mockResponseBadRequestAuthTokens = new MockResponse.Builder() + .code(400) + .body("{\"error\":\"invalid_client\",\"error_description\":\"Invalid client\"}") + .build(); } diff --git a/spotify-web-api-java/src/test/java/de/sonallux/spotify/api/authorization/client_credentials/ClientCredentialsFlowTest.java b/spotify-web-api-java/src/test/java/de/sonallux/spotify/api/authorization/client_credentials/ClientCredentialsFlowTest.java index ee7e391..1ddd93e 100644 --- a/spotify-web-api-java/src/test/java/de/sonallux/spotify/api/authorization/client_credentials/ClientCredentialsFlowTest.java +++ b/spotify-web-api-java/src/test/java/de/sonallux/spotify/api/authorization/client_credentials/ClientCredentialsFlowTest.java @@ -2,9 +2,9 @@ import de.sonallux.spotify.api.authorization.SpotifyAuthorizationException; import de.sonallux.spotify.api.authorization.TokenStore; -import okhttp3.mockwebserver.MockResponse; -import okhttp3.mockwebserver.MockWebServer; -import okhttp3.mockwebserver.RecordedRequest; +import mockwebserver3.MockResponse; +import mockwebserver3.MockWebServer; +import mockwebserver3.RecordedRequest; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -38,7 +38,7 @@ void setup() throws IOException { @AfterEach void teardown() throws IOException{ - webServer.shutdown(); + webServer.close(); } @Test @@ -74,21 +74,23 @@ void authorizeFailureTest() throws Exception { private void assertAuthTokensRequest(RecordedRequest request) { assertEquals("POST", request.getMethod()); - assertEquals("/api/token", request.getPath()); - assertEquals("Basic MWEyYjNjNGQ1ZTZmNzpiYXI0NTY=", request.getHeader("Authorization")); - assertEquals("application/x-www-form-urlencoded", request.getHeader("Content-Type")); - assertEquals("grant_type=client_credentials", request.getBody().readUtf8()); + assertEquals("/api/token", request.getUrl().encodedPath()); + assertEquals("Basic MWEyYjNjNGQ1ZTZmNzpiYXI0NTY=", request.getHeaders().get("Authorization")); + assertEquals("application/x-www-form-urlencoded", request.getHeaders().get("Content-Type")); + assertEquals("grant_type=client_credentials", request.getBody().utf8()); } - private final MockResponse mockResponseAuthTokens = new MockResponse() - .setStatus("HTTP/1.1 200 OK") - .setBody("{\n" + + private final MockResponse mockResponseAuthTokens = new MockResponse.Builder() + .code(200) + .body("{\n" + " \"access_token\": \"NgA6ZcYIixn8bU\",\n" + " \"token_type\": \"Bearer\",\n" + " \"expires_in\": 3600\n" + - "}"); + "}") + .build(); - private final MockResponse mockResponseBadRequestAuthTokens = new MockResponse() - .setStatus("HTTP/1.1 400 Bad Request") - .setBody("{\"error\":\"invalid_client\",\"error_description\":\"Invalid client\"}"); + private final MockResponse mockResponseBadRequestAuthTokens = new MockResponse.Builder() + .code(400) + .body("{\"error\":\"invalid_client\",\"error_description\":\"Invalid client\"}") + .build(); } diff --git a/spotify-web-api-java/src/test/java/de/sonallux/spotify/api/http/ApiClientTest.java b/spotify-web-api-java/src/test/java/de/sonallux/spotify/api/http/ApiClientTest.java index 09740e4..7373e79 100644 --- a/spotify-web-api-java/src/test/java/de/sonallux/spotify/api/http/ApiClientTest.java +++ b/spotify-web-api-java/src/test/java/de/sonallux/spotify/api/http/ApiClientTest.java @@ -1,8 +1,8 @@ package de.sonallux.spotify.api.http; import com.fasterxml.jackson.core.type.TypeReference; -import okhttp3.mockwebserver.MockResponse; -import okhttp3.mockwebserver.MockWebServer; +import mockwebserver3.MockResponse; +import mockwebserver3.MockWebServer; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -28,9 +28,10 @@ void setup() throws IOException { @Test void getRequest() throws Exception { - webServer.enqueue(new MockResponse() - .setStatus("HTTP/1.1 200 OK") - .setBody("{\"id\":123, \"foo\":\"bar\"}") + webServer.enqueue(new MockResponse.Builder() + .code(200) + .body("{\"id\":123, \"foo\":\"bar\"}") + .build() ); var request = new Request("GET", "/get/{id}") @@ -52,14 +53,15 @@ void getRequest() throws Exception { var recordedRequest = webServer.takeRequest(); assertEquals("GET /get/123?test=asdf&sort=asc HTTP/1.1", recordedRequest.getRequestLine()); assertEquals(0, recordedRequest.getBodySize()); - assertEquals("value", recordedRequest.getHeader("test-header")); + assertEquals("value", recordedRequest.getHeaders().get("test-header")); } @Test void postRequest() throws Exception { - webServer.enqueue(new MockResponse() - .setStatus("HTTP/1.1 200 OK") - .setBody("[\"id\", \"foo\", \"bar\"]") + webServer.enqueue(new MockResponse.Builder() + .code(200) + .body("[\"id\", \"foo\", \"bar\"]") + .build() ); var request = new Request("POST", "/post/{id}") @@ -79,15 +81,16 @@ void postRequest() throws Exception { assertEquals("POST /post/123 HTTP/1.1", recordedRequest.getRequestLine()); assertTrue(recordedRequest.getBodySize() > 0); - var requestBody = recordedRequest.getBody().readUtf8(); + var requestBody = recordedRequest.getBody().utf8(); assertEquals("{\"id\":123,\"test\":\"foo\"}", requestBody); } @Test void getRequestWith401Response() throws Exception { - webServer.enqueue(new MockResponse() - .setStatus("HTTP/1.1 401 Unauthorized") - .setBody("{\"error\": {\"status\": 401,\"message\": \"Invalid access token\"}}") + webServer.enqueue(new MockResponse.Builder() + .code(401) + .body("{\"error\": {\"status\": 401,\"message\": \"Invalid access token\"}}") + .build() ); var request = new Request("GET", "/get/{id}") @@ -95,7 +98,6 @@ void getRequestWith401Response() throws Exception { var response = apiClient.createApiCall(request, new TypeReference>() {}).executeCall(); assertFalse(response.isSuccessful()); assertEquals(401, response.code()); - assertEquals("Unauthorized", response.message()); assertNull(response.body()); var body = response.errorBody(); assertNotNull(body); @@ -109,8 +111,9 @@ void getRequestWith401Response() throws Exception { @Test void getRequestWith502Response() throws Exception { - webServer.enqueue(new MockResponse() - .setStatus("HTTP/1.1 502 Bad Gateway") + webServer.enqueue(new MockResponse.Builder() + .code(502) + .build() ); var request = new Request("GET", "/get/{id}") @@ -118,12 +121,10 @@ void getRequestWith502Response() throws Exception { var response = apiClient.createApiCall(request, new TypeReference>() {}).executeCall(); assertFalse(response.isSuccessful()); assertEquals(502, response.code()); - assertEquals("Bad Gateway", response.message()); assertNull(response.body()); var body = response.errorBody(); assertNotNull(body); assertEquals(502, body.getStatus()); - assertEquals("Bad Gateway", body.getMessage()); var recordedRequest = webServer.takeRequest(); assertEquals("GET /get/123 HTTP/1.1", recordedRequest.getRequestLine()); @@ -132,9 +133,10 @@ void getRequestWith502Response() throws Exception { @Test void getRequestWith500Response() throws Exception { - webServer.enqueue(new MockResponse() - .setStatus("HTTP/1.1 500 Internal Server Error") - .setBody("Internal Server Error") + webServer.enqueue(new MockResponse.Builder() + .code(500) + .body("Internal Server Error") + .build() ); var request = new Request("GET", "/get/{id}") @@ -142,12 +144,10 @@ void getRequestWith500Response() throws Exception { var response = apiClient.createApiCall(request, new TypeReference>() {}).executeCall(); assertFalse(response.isSuccessful()); assertEquals(500, response.code()); - assertEquals("Internal Server Error", response.message()); assertNull(response.body()); var body = response.errorBody(); assertNotNull(body); assertEquals(500, body.getStatus()); - assertEquals("Internal Server Error", body.getMessage()); var recordedRequest = webServer.takeRequest(); assertEquals("GET /get/123 HTTP/1.1", recordedRequest.getRequestLine()); diff --git a/spotify-web-api-java/src/test/java/org/junit/rules/ExternalResource.java b/spotify-web-api-java/src/test/java/org/junit/rules/ExternalResource.java deleted file mode 100644 index 13055d4..0000000 --- a/spotify-web-api-java/src/test/java/org/junit/rules/ExternalResource.java +++ /dev/null @@ -1,14 +0,0 @@ -package org.junit.rules; - -/** - * Fake ExternalResource class from junit4 to get rid of the direct - * junit4 dependency of MockWebServer. - *

- * This class can be removed if MockWebServer has removed its dependency to junit4. Also see the two issues: - *

- */ -public class ExternalResource { -} From daa7feeaec82088a8e4a4661c12c11c660cbac49 Mon Sep 17 00:00:00 2001 From: sonallux Date: Tue, 2 Dec 2025 20:14:08 +0100 Subject: [PATCH 2/2] chore: update CHANGELOG.md --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1f386bd..f4ecf2a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). ## [Unreleased] +- Update to okhttp `5.3.2` ## [4.3.2] - Remove `followers` property from `PlaylistUser` object