diff --git a/src/main/java/se/michaelthelin/spotify/requests/AbstractRequest.java b/src/main/java/se/michaelthelin/spotify/requests/AbstractRequest.java index f00d9f56d..1d86b0b78 100644 --- a/src/main/java/se/michaelthelin/spotify/requests/AbstractRequest.java +++ b/src/main/java/se/michaelthelin/spotify/requests/AbstractRequest.java @@ -19,6 +19,7 @@ import java.util.List; import java.util.concurrent.CompletableFuture; import java.util.logging.Level; +import java.util.regex.Matcher; import java.util.stream.Collectors; public abstract class AbstractRequest implements IRequest { @@ -241,7 +242,8 @@ public BT setPath(final String path) { for (NameValuePair nameValuePair : pathParameters) { // Don't remove the "\\" before the "}" to prevent a regex issue on Android. String key = "\\{" + nameValuePair.getName() + "\\}"; - builtPath = builtPath.replaceAll(key, nameValuePair.getValue()); + String value = nameValuePair.getValue(); + builtPath = builtPath.replaceAll(key, Matcher.quoteReplacement(value)); } this.path = builtPath; diff --git a/src/test/fixtures/requests/data/playlists/GetListOfUsersPlaylistsRequest_UserWith$.json b/src/test/fixtures/requests/data/playlists/GetListOfUsersPlaylistsRequest_UserWith$.json new file mode 100644 index 000000000..78be9a625 --- /dev/null +++ b/src/test/fixtures/requests/data/playlists/GetListOfUsersPlaylistsRequest_UserWith$.json @@ -0,0 +1,64 @@ +{ + "href": "https://api.spotify.com/v1/users/%24wizzler%24/playlists", + "items": [ + { + "collaborative": false, + "external_urls": { + "spotify": "http://open.spotify.com/user/%24wizzler%24/playlists/53Y8wT46QIMz5H4WQ8O22c" + }, + "href": "https://api.spotify.com/v1/users/%24wizzler%24/playlists/53Y8wT46QIMz5H4WQ8O22c", + "id": "53Y8wT46QIMz5H4WQ8O22c", + "images": [], + "name": "Wizzlers Big Playlist", + "owner": { + "external_urls": { + "spotify": "http://open.spotify.com/user/wizzler" + }, + "href": "https://api.spotify.com/v1/users/wizzler", + "id": "$wizzler$", + "type": "user", + "uri": "spotify:user:%24wizzler%24" + }, + "public": true, + "snapshot_id": "bNLWdmhh+HDsbHzhckXeDC0uyKyg4FjPI/KEsKjAE526usnz2LxwgyBoMShVL+z+", + "tracks": { + "href": "https://api.spotify.com/v1/users/wizzler/playlists/53Y8wT46QIMz5H4WQ8O22c/tracks", + "total": 30 + }, + "type": "playlist", + "uri": "spotify:user:%24wizzler%24:playlist:53Y8wT46QIMz5H4WQ8O22c" + }, + { + "collaborative": false, + "external_urls": { + "spotify": "http://open.spotify.com/user/wizzlersmate/playlists/1AVZz0mBuGbCEoNRQdYQju" + }, + "href": "https://api.spotify.com/v1/users/wizzlersmate/playlists/1AVZz0mBuGbCEoNRQdYQju", + "id": "1AVZz0mBuGbCEoNRQdYQju", + "images": [], + "name": "Another Playlist", + "owner": { + "external_urls": { + "spotify": "http://open.spotify.com/user/wizzlersmate" + }, + "href": "https://api.spotify.com/v1/users/wizzlersmate", + "id": "wizzlersmate", + "type": "user", + "uri": "spotify:user:wizzlersmate" + }, + "public": true, + "snapshot_id": "Y0qg/IT5T02DKpw4uQKc/9RUrqQJ07hbTKyEeDRPOo9LU0g0icBrIXwVkHfQZ/aD", + "tracks": { + "href": "https://api.spotify.com/v1/users/wizzlersmate/playlists/1AVZz0mBuGbCEoNRQdYQju/tracks", + "total": 58 + }, + "type": "playlist", + "uri": "spotify:user:wizzlersmate:playlist:1AVZz0mBuGbCEoNRQdYQju" + } + ], + "limit": 9, + "next": null, + "offset": 0, + "previous": null, + "total": 9 +} diff --git a/src/test/java/se/michaelthelin/spotify/ITest.java b/src/test/java/se/michaelthelin/spotify/ITest.java index ecb11bbdb..cbbc0b624 100644 --- a/src/test/java/se/michaelthelin/spotify/ITest.java +++ b/src/test/java/se/michaelthelin/spotify/ITest.java @@ -50,6 +50,7 @@ public interface ITest { String ID_SHOW = "5AvwZVawapvyhJUIx71pdJ"; String ID_TRACK = "01iyCAUm8EvOFqVWYJ3dVX"; String ID_USER = "abbaspotify"; + String ID_USER_WITH_$ = "$wizzler$"; String ID_USER_NON_ASCII = "abbaspötify"; String IMAGE_DATA = readFromFileTry(new File("examples/image_data.txt")); int INSERT_BEFORE = 0; diff --git a/src/test/java/se/michaelthelin/spotify/requests/data/playlists/GetListOfUsersPlaylistsRequestTest.java b/src/test/java/se/michaelthelin/spotify/requests/data/playlists/GetListOfUsersPlaylistsRequestTest.java index 02e8e3f77..e0fedbfb9 100644 --- a/src/test/java/se/michaelthelin/spotify/requests/data/playlists/GetListOfUsersPlaylistsRequestTest.java +++ b/src/test/java/se/michaelthelin/spotify/requests/data/playlists/GetListOfUsersPlaylistsRequestTest.java @@ -25,6 +25,15 @@ public class GetListOfUsersPlaylistsRequestTest extends AbstractDataTest playlistSimplifiedPaging = requestWithUserIdWithSymbol$.executeAsync().get(); + assertEquals( + "https://api.spotify.com/v1/users/%24wizzler%24/playlists", + playlistSimplifiedPaging.getHref()); + assertEquals( + 2, + playlistSimplifiedPaging.getItems().length); + assertEquals( + 9, + (int) playlistSimplifiedPaging.getLimit()); + assertNull( + playlistSimplifiedPaging.getNext()); + assertEquals( + 0, + (int) playlistSimplifiedPaging.getOffset()); + assertNull( + playlistSimplifiedPaging.getPrevious()); + assertEquals( + 9, + (int) playlistSimplifiedPaging.getTotal()); + } + public void shouldReturnDefault(final Paging playlistSimplifiedPaging) { assertEquals( "https://api.spotify.com/v1/users/wizzler/playlists",