Skip to content

Commit ed085f3

Browse files
authored
feat: update to okhttp 5 (#388)
* feat: update to okhttp 5 * chore: update CHANGELOG.md
1 parent a65db62 commit ed085f3

File tree

9 files changed

+128
-133
lines changed

9 files changed

+128
-133
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
55
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
66

77
## [Unreleased]
8+
- Update to okhttp `5.3.2`
89

910
## [4.3.2]
1011
- Remove `followers` property from `PlaylistUser` object

spotify-web-api-java/pom.xml

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
<url>https://github.com/sonallux/spotify-web-api-java</url>
2121

2222
<properties>
23-
<okhttp.version>4.12.0</okhttp.version>
23+
<okhttp.version>5.3.2</okhttp.version>
2424
<jackson.version>2.20.1</jackson.version>
2525

2626
<moditect.module.name>de.sonallux.spotify.api</moditect.module.name>
@@ -48,7 +48,7 @@
4848
<dependencies>
4949
<dependency>
5050
<groupId>com.squareup.okhttp3</groupId>
51-
<artifactId>okhttp</artifactId>
51+
<artifactId>okhttp-jvm</artifactId>
5252
</dependency>
5353
<dependency>
5454
<groupId>com.fasterxml.jackson.core</groupId>
@@ -78,14 +78,8 @@
7878
</dependency>
7979
<dependency>
8080
<groupId>com.squareup.okhttp3</groupId>
81-
<artifactId>mockwebserver</artifactId>
81+
<artifactId>mockwebserver3</artifactId>
8282
<scope>test</scope>
83-
<exclusions>
84-
<exclusion>
85-
<groupId>junit</groupId>
86-
<artifactId>junit</artifactId>
87-
</exclusion>
88-
</exclusions>
8983
</dependency>
9084
</dependencies>
9185

spotify-web-api-java/src/test/java/de/sonallux/spotify/api/ConversionTest.java

Lines changed: 28 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@
22

33
import de.sonallux.spotify.api.models.Episode;
44
import de.sonallux.spotify.api.models.Track;
5-
import okhttp3.mockwebserver.MockResponse;
6-
import okhttp3.mockwebserver.MockWebServer;
5+
import mockwebserver3.MockWebServer;
6+
import mockwebserver3.MockResponse;
77
import okio.Buffer;
88
import org.junit.jupiter.api.AfterEach;
99
import org.junit.jupiter.api.BeforeEach;
@@ -29,7 +29,7 @@ void setup() throws IOException {
2929

3030
@AfterEach
3131
void teardown() throws IOException{
32-
webServer.shutdown();
32+
webServer.close();
3333
}
3434

3535
@Test
@@ -44,13 +44,13 @@ void testResponseSnakeCaseToCamelCase() throws Exception {
4444
var firstTrack = playlist.getTracks().getItems().get(0);
4545
assertNotNull(firstTrack);
4646
assertEquals(Instant.parse("2021-03-07T23:01:00Z"), firstTrack.getAddedAt());
47-
assertTrue(firstTrack.getTrack() instanceof Track);
47+
assertInstanceOf(Track.class, firstTrack.getTrack());
4848
assertEquals(6, ((Track) firstTrack.getTrack()).getTrackNumber());
4949
}
5050

5151
@Test
5252
void testRequestWithReservedKeyWord() throws Exception {
53-
webServer.enqueue(new MockResponse().setStatus("HTTP/1.1 200 OK"));
53+
webServer.enqueue(mockResponse(200).build());
5454

5555
var response = api.getPlaylistsApi().changePlaylistDetails("foo")
5656
.name("Test")
@@ -61,35 +61,35 @@ void testRequestWithReservedKeyWord() throws Exception {
6161
assertTrue(response.isSuccessful());
6262

6363
var request = webServer.takeRequest();
64-
assertEquals("application/json; charset=UTF-8", request.getHeader("Content-Type"));
65-
var actualBody = request.getBody().readUtf8();
64+
assertEquals("application/json; charset=UTF-8", request.getHeaders().get("Content-Type"));
65+
var actualBody = request.getBody().utf8();
6666
assertEquals("{\"name\":\"Test\",\"collaborative\":false,\"description\":\"Test description\",\"public\":true}", actualBody);
6767
}
6868

6969
@Test
7070
void testRequestWithEmptyBodyObject() throws Exception {
71-
webServer.enqueue(new MockResponse().setStatus("HTTP/1.1 200 OK"));
71+
webServer.enqueue(mockResponse(200).build());
7272

7373
var response = api.getPlaylistsApi().changePlaylistDetails("foo").build().executeCall();
7474
assertTrue(response.isSuccessful());
7575

7676
var request = webServer.takeRequest();
77-
var actualBody = request.getBody().readUtf8();
77+
var actualBody = request.getBody().utf8();
7878
assertEquals("", actualBody);
7979
}
8080

8181
@Test
8282
void testRequestWithSnakeCaseToCamelCase() throws Exception {
83-
webServer.enqueue(new MockResponse().setStatus("HTTP/1.1 200 OK").setBody("{\"snapshot_id\":\"12ab34cd\"}"));
83+
webServer.enqueue(mockResponse(200).body("{\"snapshot_id\":\"12ab34cd\"}").build());
8484

8585
var newSnapshotId = api.getPlaylistsApi().removeTracksPlaylist("foo", List.of())
8686
.snapshotId("ab12cd34")
8787
.build().execute();
8888
assertEquals("12ab34cd", newSnapshotId.getSnapshotId());
8989

9090
var request = webServer.takeRequest();
91-
assertEquals("application/json; charset=UTF-8", request.getHeader("Content-Type"));
92-
var actualBody = request.getBody().readUtf8();
91+
assertEquals("application/json; charset=UTF-8", request.getHeaders().get("Content-Type"));
92+
var actualBody = request.getBody().utf8();
9393
assertEquals("{\"tracks\":[],\"snapshot_id\":\"ab12cd34\"}", actualBody);
9494
}
9595

@@ -101,16 +101,17 @@ void testUnionTypeHandlingWithAdditionalTypesParameter() throws Exception {
101101
var track = response.getItems().get(0).getTrack();
102102
assertNotNull(track);
103103
assertEquals("track", track.getType());
104-
assertTrue(track instanceof Track);
104+
assertInstanceOf(Track.class, track);
105105

106106
var episode = response.getItems().get(1).getTrack();
107107
assertNotNull(episode);
108108
assertEquals("episode", episode.getType());
109-
assertTrue(episode instanceof Episode);
109+
assertInstanceOf(Episode.class, episode);
110110
assertNotNull(((Episode) episode).getShow());
111111

112112
var request = webServer.takeRequest();
113-
assertEquals("/playlists/foo/tracks?additional_types=track%2Cepisode", request.getPath());
113+
assertEquals("/playlists/foo/tracks", request.getUrl().encodedPath());
114+
assertEquals("additional_types=track%2Cepisode", request.getUrl().encodedQuery());
114115
}
115116

116117
@Test
@@ -123,21 +124,22 @@ void testUnionTypeHandlingWithoutAdditionalTypesParameter() throws Exception {
123124
var track = response.getItems().get(0).getTrack();
124125
assertNotNull(track);
125126
assertEquals("track", track.getType());
126-
assertTrue(track instanceof Track);
127+
assertInstanceOf(Track.class, track);
127128

128129
var episode = response.getItems().get(1).getTrack();
129130
assertNotNull(episode);
130131
assertEquals("episode", episode.getType());
131-
assertTrue(episode instanceof Episode);
132+
assertInstanceOf(Episode.class, episode);
132133
assertNull(((Episode) episode).getShow());//show is not set, because episode is returned with track format
133134

134135
var request = webServer.takeRequest();
135-
assertEquals("/playlists/foo/tracks?additional_types=track", request.getPath());
136+
assertEquals("/playlists/foo/tracks", request.getUrl().encodedPath());
137+
assertEquals("additional_types=track", request.getUrl().encodedQuery());
136138
}
137139

138140
@Test
139141
void testEmptyResponseBodyWithNonVoidType() throws Exception {
140-
webServer.enqueue(new MockResponse().setStatus("HTTP/1.1 204 NO CONTENT"));
142+
webServer.enqueue(mockResponse(204).build());
141143

142144
var response = api.getPlayerApi().getRecentlyPlayed().build().executeCall();
143145
assertTrue(response.isSuccessful());
@@ -147,9 +149,13 @@ void testEmptyResponseBodyWithNonVoidType() throws Exception {
147149
private MockResponse loadMockResponse(String fileName) throws Exception {
148150
var stream = ConversionTest.class.getResourceAsStream("/responses/" + fileName);
149151
var buffer = new Buffer().readFrom(stream);
150-
return new MockResponse()
151-
.setStatus("HTTP/1.1 200 OK")
152+
return mockResponse(200)
152153
.addHeader("Content-Type", "application/json; charset=utf-8")
153-
.setBody(buffer);
154+
.body(buffer)
155+
.build();
156+
}
157+
158+
private MockResponse.Builder mockResponse(int status) {
159+
return new MockResponse.Builder().code(status);
154160
}
155161
}

spotify-web-api-java/src/test/java/de/sonallux/spotify/api/SpotifyApiTest.java

Lines changed: 23 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
package de.sonallux.spotify.api;
22

33
import de.sonallux.spotify.api.authorization.ApiAuthorizationProvider;
4-
import okhttp3.mockwebserver.MockResponse;
5-
import okhttp3.mockwebserver.MockWebServer;
4+
import mockwebserver3.MockResponse;
5+
import mockwebserver3.MockWebServer;
66
import org.junit.jupiter.api.AfterEach;
77
import org.junit.jupiter.api.BeforeEach;
88
import org.junit.jupiter.api.Test;
@@ -33,7 +33,7 @@ void setup() throws IOException {
3333

3434
@AfterEach
3535
void teardown() throws IOException{
36-
webServer.shutdown();
36+
webServer.close();
3737
}
3838

3939
@Test
@@ -46,10 +46,10 @@ void addNoAuthorizationHeaderToRequest() throws Exception {
4646
assertEquals("0OdUWJ0sBjDrqHygGUXeCF", artist.getId());
4747
assertEquals("https://open.spotify.com/artist/0OdUWJ0sBjDrqHygGUXeCF", artist.getExternalUrls().getSpotify());
4848

49-
assertEquals(webServer.getRequestCount(), 1);
49+
assertEquals(1, webServer.getRequestCount());
5050
var request = webServer.takeRequest();
51-
assertEquals(request.getRequestLine(), "GET /artists/foo HTTP/1.1");
52-
assertNull(request.getHeader("Authorization"));
51+
assertEquals("GET /artists/foo HTTP/1.1", request.getRequestLine());
52+
assertNull(request.getHeaders().get("Authorization"));
5353
}
5454

5555
@Test
@@ -62,10 +62,10 @@ void addAuthorizationHeaderToRequest() throws Exception {
6262
assertEquals("0OdUWJ0sBjDrqHygGUXeCF", artist.getId());
6363
assertEquals("https://open.spotify.com/artist/0OdUWJ0sBjDrqHygGUXeCF", artist.getExternalUrls().getSpotify());
6464

65-
assertEquals(webServer.getRequestCount(), 1);
65+
assertEquals(1, webServer.getRequestCount());
6666
var request = webServer.takeRequest();
67-
assertEquals(request.getRequestLine(), "GET /artists/foo HTTP/1.1");
68-
assertEquals(request.getHeader("Authorization"), "Bearer some-access-token");
67+
assertEquals("GET /artists/foo HTTP/1.1", request.getRequestLine());
68+
assertEquals("Bearer some-access-token", request.getHeaders().get("Authorization"));
6969
}
7070

7171
@Test
@@ -81,11 +81,11 @@ void handlesUnauthorizedResponseWithRetry() throws Exception {
8181

8282
verify(apiAuthorizationProvider, times(1)).refreshAccessToken();
8383

84-
assertEquals(webServer.getRequestCount(), 2);
84+
assertEquals(2, webServer.getRequestCount());
8585
var request1 = webServer.takeRequest();
86-
assertEquals(request1.getRequestLine(), "GET /artists/foo HTTP/1.1");
86+
assertEquals("GET /artists/foo HTTP/1.1", request1.getRequestLine());
8787
var request2 = webServer.takeRequest();
88-
assertEquals(request2.getRequestLine(), "GET /artists/foo HTTP/1.1");
88+
assertEquals("GET /artists/foo HTTP/1.1", request2.getRequestLine());
8989
}
9090

9191
@Test
@@ -98,18 +98,19 @@ void handlesUnauthorizedResponseWithFailure() throws Exception {
9898

9999
verify(apiAuthorizationProvider, times(1)).refreshAccessToken();
100100

101-
assertEquals(webServer.getRequestCount(), 1);
101+
assertEquals(1, webServer.getRequestCount());
102102
var request1 = webServer.takeRequest();
103-
assertEquals(request1.getRequestLine(), "GET /artists/foo HTTP/1.1");
103+
assertEquals("GET /artists/foo HTTP/1.1", request1.getRequestLine());
104104
}
105105

106-
private final MockResponse mockResponseUnauthorizedInvalidToken = new MockResponse()
107-
.setStatus("HTTP/1.1 401 Unauthorized")
108-
.setBody("{\"error\": {\"status\": 401,\"message\": \"Invalid access token\"}}");
106+
private final MockResponse mockResponseUnauthorizedInvalidToken = new MockResponse.Builder()
107+
.code(401)
108+
.body("{\"error\": {\"status\": 401,\"message\": \"Invalid access token\"}}")
109+
.build();
109110

110-
private final MockResponse mockResponseArtist = new MockResponse()
111-
.setStatus("HTTP/1.1 200 OK")
112-
.setBody("{\n" +
111+
private final MockResponse mockResponseArtist = new MockResponse.Builder()
112+
.code(200)
113+
.body("{\n" +
113114
" \"external_urls\" : {\n" +
114115
" \"spotify\" : \"https://open.spotify.com/artist/0OdUWJ0sBjDrqHygGUXeCF\"\n" +
115116
" },\n" +
@@ -133,5 +134,6 @@ void handlesUnauthorizedResponseWithFailure() throws Exception {
133134
" \"popularity\" : 59,\n" +
134135
" \"type\" : \"artist\",\n" +
135136
" \"uri\" : \"spotify:artist:0OdUWJ0sBjDrqHygGUXeCF\"\n" +
136-
"}");
137+
"}")
138+
.build();
137139
}

spotify-web-api-java/src/test/java/de/sonallux/spotify/api/authorization/authorization_code/AuthorizationCodeFlowTest.java

Lines changed: 17 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
package de.sonallux.spotify.api.authorization.authorization_code;
22

33
import de.sonallux.spotify.api.authorization.*;
4-
import okhttp3.mockwebserver.MockResponse;
5-
import okhttp3.mockwebserver.MockWebServer;
6-
import okhttp3.mockwebserver.RecordedRequest;
4+
import mockwebserver3.MockResponse;
5+
import mockwebserver3.MockWebServer;
6+
import mockwebserver3.RecordedRequest;
77
import org.junit.jupiter.api.AfterEach;
88
import org.junit.jupiter.api.BeforeEach;
99
import org.junit.jupiter.api.Test;
@@ -36,7 +36,7 @@ void setup() throws IOException {
3636

3737
@AfterEach
3838
void teardown() throws IOException{
39-
webServer.shutdown();
39+
webServer.close();
4040
}
4141

4242
@Test
@@ -167,10 +167,10 @@ void refreshAccessTokenWithoutTokenTest() {
167167

168168
private void assertAuthTokensRequest(RecordedRequest request, String requestBody) {
169169
assertEquals("POST", request.getMethod());
170-
assertEquals("/api/token", request.getPath());
171-
assertEquals("Basic MWEyYjNjNGQ1ZTZmNzpiYXI0NTY=", request.getHeader("Authorization"));
172-
assertEquals("application/x-www-form-urlencoded", request.getHeader("Content-Type"));
173-
assertEquals(requestBody, request.getBody().readUtf8());
170+
assertEquals("/api/token", request.getUrl().encodedPath());
171+
assertEquals("Basic MWEyYjNjNGQ1ZTZmNzpiYXI0NTY=", request.getHeaders().get("Authorization"));
172+
assertEquals("application/x-www-form-urlencoded", request.getHeaders().get("Content-Type"));
173+
assertEquals(requestBody, request.getBody().utf8());
174174
}
175175

176176
private void assertStoreAuthTokensFromResponse() {
@@ -184,16 +184,18 @@ private void assertStoreAuthTokensFromResponse() {
184184
}));
185185
}
186186

187-
private final MockResponse mockResponseAuthTokens = new MockResponse()
188-
.setStatus("HTTP/1.1 200 OK")
189-
.setBody("{\n" +
187+
private final MockResponse mockResponseAuthTokens = new MockResponse.Builder()
188+
.code(200)
189+
.body("{\n" +
190190
" \"access_token\": \"NgA6ZcYIixn8bU\",\n" +
191191
" \"token_type\": \"Bearer\",\n" +
192192
" \"scope\": \"user-read-private user-read-email\",\n" +
193193
" \"expires_in\": 3600\n" +
194-
"}");
194+
"}")
195+
.build();
195196

196-
private final MockResponse mockResponseBadRequestAuthTokens = new MockResponse()
197-
.setStatus("HTTP/1.1 400 Bad Request")
198-
.setBody("{\"error\":\"invalid_client\",\"error_description\":\"Invalid client\"}");
197+
private final MockResponse mockResponseBadRequestAuthTokens = new MockResponse.Builder()
198+
.code(4)
199+
.body("{\"error\":\"invalid_client\",\"error_description\":\"Invalid client\"}")
200+
.build();
199201
}

0 commit comments

Comments
 (0)