Merge pull request #60 from ultrasonic/add-create-share
Add create share
This commit is contained in:
commit
1907668c64
|
@ -0,0 +1,78 @@
|
||||||
|
package org.moire.ultrasonic.api.subsonic
|
||||||
|
|
||||||
|
import org.amshove.kluent.`should equal to`
|
||||||
|
import org.amshove.kluent.`should equal`
|
||||||
|
import org.junit.Test
|
||||||
|
import org.moire.ultrasonic.api.subsonic.models.MusicDirectoryChild
|
||||||
|
import java.util.Calendar
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Instrumentation test for [SubsonicAPIDefinition.createShare] call.
|
||||||
|
*/
|
||||||
|
class SubsonicApiCreateShareTest : SubsonicAPIClientTest() {
|
||||||
|
@Test
|
||||||
|
fun `Should handle error responce`() {
|
||||||
|
val response = checkErrorCallParsed(mockWebServerRule) {
|
||||||
|
client.api.createShare(listOf("some-id")).execute()
|
||||||
|
}
|
||||||
|
|
||||||
|
response.shares `should equal` emptyList()
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun `Should handle ok response`() {
|
||||||
|
mockWebServerRule.enqueueResponse("get_shares_ok.json")
|
||||||
|
|
||||||
|
val response = client.api.createShare(listOf("some-id")).execute()
|
||||||
|
|
||||||
|
assertResponseSuccessful(response)
|
||||||
|
response.body().shares.size `should equal to` 1
|
||||||
|
with(response.body().shares[0]) {
|
||||||
|
id `should equal to` 0
|
||||||
|
url `should equal to` "https://subsonic.com/ext/share/awdwo?jwt=eyJhbGciOiJIUzI1NiJ9." +
|
||||||
|
"eyJwYXRoIjoiL2V4dC9zaGFyZS9hd2R3byIsImV4cCI6MTU0MTYyNjQzMX0.iy8dkt_ZZc8hJ692" +
|
||||||
|
"UxorHdHWFU2RB-fMCmCA4IJ_dTw"
|
||||||
|
username `should equal to` "admin"
|
||||||
|
created `should equal` parseDate("2017-11-07T21:33:51.748Z")
|
||||||
|
expires `should equal` parseDate("2018-11-07T21:33:51.748Z")
|
||||||
|
lastVisited `should equal` parseDate("2018-11-07T21:33:51.748Z")
|
||||||
|
description `should equal to` "Awesome link!"
|
||||||
|
visitCount `should equal to` 0
|
||||||
|
items.size `should equal to` 1
|
||||||
|
items[0] `should equal` MusicDirectoryChild(id = 4212, parent = 4186, isDir = false,
|
||||||
|
title = "Heaven Knows", album = "Going to Hell", artist = "The Pretty Reckless",
|
||||||
|
track = 3, year = 2014, genre = "Hard Rock", coverArt = "4186", size = 9025090,
|
||||||
|
contentType = "audio/mpeg", suffix = "mp3", duration = 225, bitRate = 320,
|
||||||
|
path = "The Pretty Reckless/Going to Hell/03 Heaven Knows.mp3", isVideo = false,
|
||||||
|
playCount = 2, discNumber = 1, created = parseDate("2016-10-23T21:30:40.000Z"),
|
||||||
|
albumId = 388, artistId = 238, type = "music")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun `Should pass ids in request param`() {
|
||||||
|
val idsList = listOf("some-id1", "some-id2")
|
||||||
|
mockWebServerRule.assertRequestParam(expectedParam = "id=${idsList[0]}&id=${idsList[1]}") {
|
||||||
|
client.api.createShare(idsList).execute()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun `Should pass description in request param`() {
|
||||||
|
val description = "description-banana"
|
||||||
|
|
||||||
|
mockWebServerRule.assertRequestParam(expectedParam = "description=$description") {
|
||||||
|
client.api.createShare(idsToShare = listOf("id1", "id2"), description = description)
|
||||||
|
.execute()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun `Should pass expires in request param`() {
|
||||||
|
val expires = Calendar.getInstance().timeInMillis
|
||||||
|
|
||||||
|
mockWebServerRule.assertRequestParam(expectedParam = "expires=$expires") {
|
||||||
|
client.api.createShare(idsToShare = listOf("id1"), expires = expires).execute()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -28,7 +28,7 @@ class SubsonicApiGetSharesTest : SubsonicAPIClientTest() {
|
||||||
response.body().shares.size `should equal to` 1
|
response.body().shares.size `should equal to` 1
|
||||||
with(response.body().shares[0]) {
|
with(response.body().shares[0]) {
|
||||||
id `should equal to` 0
|
id `should equal to` 0
|
||||||
url `should equal to` "https://airsonic.egorr.by/ext/share/awdwo?jwt=eyJhbGciOiJIUzI1" +
|
url `should equal to` "https://subsonic.com/ext/share/awdwo?jwt=eyJhbGciOiJIUzI1" +
|
||||||
"NiJ9.eyJwYXRoIjoiL2V4dC9zaGFyZS9hd2R3byIsImV4cCI6MTU0MTYyNjQzMX0.iy8dkt_ZZc8" +
|
"NiJ9.eyJwYXRoIjoiL2V4dC9zaGFyZS9hd2R3byIsImV4cCI6MTU0MTYyNjQzMX0.iy8dkt_ZZc8" +
|
||||||
"hJ692UxorHdHWFU2RB-fMCmCA4IJ_dTw"
|
"hJ692UxorHdHWFU2RB-fMCmCA4IJ_dTw"
|
||||||
username `should equal to` "admin"
|
username `should equal to` "admin"
|
||||||
|
|
|
@ -5,7 +5,7 @@
|
||||||
"shares" : {
|
"shares" : {
|
||||||
"share" : [ {
|
"share" : [ {
|
||||||
"id" : "0",
|
"id" : "0",
|
||||||
"url" : "https://airsonic.egorr.by/ext/share/awdwo?jwt=eyJhbGciOiJIUzI1NiJ9.eyJwYXRoIjoiL2V4dC9zaGFyZS9hd2R3byIsImV4cCI6MTU0MTYyNjQzMX0.iy8dkt_ZZc8hJ692UxorHdHWFU2RB-fMCmCA4IJ_dTw",
|
"url" : "https://subsonic.com/ext/share/awdwo?jwt=eyJhbGciOiJIUzI1NiJ9.eyJwYXRoIjoiL2V4dC9zaGFyZS9hd2R3byIsImV4cCI6MTU0MTYyNjQzMX0.iy8dkt_ZZc8hJ692UxorHdHWFU2RB-fMCmCA4IJ_dTw",
|
||||||
"username" : "admin",
|
"username" : "admin",
|
||||||
"created" : "2017-11-07T21:33:51.748Z",
|
"created" : "2017-11-07T21:33:51.748Z",
|
||||||
"expires" : "2018-11-07T21:33:51.748Z",
|
"expires" : "2018-11-07T21:33:51.748Z",
|
||||||
|
|
|
@ -192,4 +192,9 @@ interface SubsonicAPIDefinition {
|
||||||
|
|
||||||
@GET("getShares.view")
|
@GET("getShares.view")
|
||||||
fun getShares(): Call<SharesResponse>
|
fun getShares(): Call<SharesResponse>
|
||||||
|
|
||||||
|
@GET("createShare.view")
|
||||||
|
fun createShare(@Query("id") idsToShare: List<String>,
|
||||||
|
@Query("description") description: String? = null,
|
||||||
|
@Query("expires") expires: Long? = null): Call<SharesResponse>
|
||||||
}
|
}
|
||||||
|
|
|
@ -113,7 +113,6 @@ import org.moire.ultrasonic.service.parser.ErrorParser;
|
||||||
import org.moire.ultrasonic.service.parser.GenreParser;
|
import org.moire.ultrasonic.service.parser.GenreParser;
|
||||||
import org.moire.ultrasonic.service.parser.MusicDirectoryParser;
|
import org.moire.ultrasonic.service.parser.MusicDirectoryParser;
|
||||||
import org.moire.ultrasonic.service.parser.RandomSongsParser;
|
import org.moire.ultrasonic.service.parser.RandomSongsParser;
|
||||||
import org.moire.ultrasonic.service.parser.ShareParser;
|
|
||||||
import org.moire.ultrasonic.service.parser.SubsonicRESTException;
|
import org.moire.ultrasonic.service.parser.SubsonicRESTException;
|
||||||
import org.moire.ultrasonic.service.parser.UserInfoParser;
|
import org.moire.ultrasonic.service.parser.UserInfoParser;
|
||||||
import org.moire.ultrasonic.service.ssl.SSLSocketFactory;
|
import org.moire.ultrasonic.service.ssl.SSLSocketFactory;
|
||||||
|
@ -137,7 +136,6 @@ import java.net.URLEncoder;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.LinkedList;
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Locale;
|
import java.util.Locale;
|
||||||
import java.util.concurrent.atomic.AtomicReference;
|
import java.util.concurrent.atomic.AtomicReference;
|
||||||
|
@ -1410,40 +1408,19 @@ public class RESTMusicService implements MusicService
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public List<Share> createShare(List<String> ids, String description, Long expires, Context context, ProgressListener progressListener) throws Exception
|
public List<Share> createShare(List<String> ids,
|
||||||
{
|
String description,
|
||||||
List<String> parameterNames = new LinkedList<String>();
|
Long expires,
|
||||||
List<Object> parameterValues = new LinkedList<Object>();
|
Context context,
|
||||||
|
ProgressListener progressListener) throws Exception {
|
||||||
|
updateProgressListener(progressListener, R.string.parser_reading);
|
||||||
|
Response<SharesResponse> response = subsonicAPIClient.getApi()
|
||||||
|
.createShare(ids, description, expires).execute();
|
||||||
|
checkResponseSuccessful(response);
|
||||||
|
|
||||||
for (String id : ids)
|
return APIShareConverter.toDomainEntitiesList(response.body().getShares());
|
||||||
{
|
}
|
||||||
parameterNames.add("id");
|
|
||||||
parameterValues.add(id);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (description != null)
|
|
||||||
{
|
|
||||||
parameterNames.add("description");
|
|
||||||
parameterValues.add(description);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (expires > 0)
|
|
||||||
{
|
|
||||||
parameterNames.add("expires");
|
|
||||||
parameterValues.add(expires);
|
|
||||||
}
|
|
||||||
|
|
||||||
Reader reader = getReader(context, progressListener, "createShare", null, parameterNames, parameterValues);
|
|
||||||
try
|
|
||||||
{
|
|
||||||
return new ShareParser(context).parse(reader, progressListener);
|
|
||||||
}
|
|
||||||
finally
|
|
||||||
{
|
|
||||||
Util.close(reader);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void deleteShare(String id, Context context, ProgressListener progressListener) throws Exception
|
public void deleteShare(String id, Context context, ProgressListener progressListener) throws Exception
|
||||||
|
|
|
@ -1,76 +0,0 @@
|
||||||
package org.moire.ultrasonic.service.parser;
|
|
||||||
|
|
||||||
import android.content.Context;
|
|
||||||
|
|
||||||
import org.moire.ultrasonic.R;
|
|
||||||
import org.moire.ultrasonic.domain.Share;
|
|
||||||
import org.moire.ultrasonic.util.ProgressListener;
|
|
||||||
|
|
||||||
import org.xmlpull.v1.XmlPullParser;
|
|
||||||
|
|
||||||
import java.io.Reader;
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @author Joshua Bahnsen
|
|
||||||
*/
|
|
||||||
public class ShareParser extends MusicDirectoryEntryParser
|
|
||||||
{
|
|
||||||
|
|
||||||
public ShareParser(Context context)
|
|
||||||
{
|
|
||||||
super(context);
|
|
||||||
}
|
|
||||||
|
|
||||||
public List<Share> parse(Reader reader, ProgressListener progressListener) throws Exception
|
|
||||||
{
|
|
||||||
|
|
||||||
updateProgress(progressListener, R.string.parser_reading);
|
|
||||||
init(reader);
|
|
||||||
|
|
||||||
List<Share> shares = new ArrayList<Share>();
|
|
||||||
Share share = null;
|
|
||||||
int eventType;
|
|
||||||
|
|
||||||
do
|
|
||||||
{
|
|
||||||
eventType = nextParseEvent();
|
|
||||||
|
|
||||||
if (eventType == XmlPullParser.START_TAG)
|
|
||||||
{
|
|
||||||
String name = getElementName();
|
|
||||||
|
|
||||||
if ("share".equals(name))
|
|
||||||
{
|
|
||||||
share = new Share();
|
|
||||||
share.setCreated(get("created"));
|
|
||||||
share.setDescription(get("description"));
|
|
||||||
share.setExpires(get("expires"));
|
|
||||||
share.setId(get("id"));
|
|
||||||
share.setLastVisited(get("lastVisited"));
|
|
||||||
share.setUrl(get("url"));
|
|
||||||
share.setUsername(get("username"));
|
|
||||||
share.setVisitCount(getLong("visitCount"));
|
|
||||||
shares.add(share);
|
|
||||||
}
|
|
||||||
else if ("entry".equals(name))
|
|
||||||
{
|
|
||||||
if (share != null)
|
|
||||||
{
|
|
||||||
share.addEntry(parseEntry(null, false, 0));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if ("error".equals(name))
|
|
||||||
{
|
|
||||||
handleError();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} while (eventType != XmlPullParser.END_DOCUMENT);
|
|
||||||
|
|
||||||
validate();
|
|
||||||
updateProgress(progressListener, R.string.parser_reading_done);
|
|
||||||
|
|
||||||
return shares;
|
|
||||||
}
|
|
||||||
}
|
|
Loading…
Reference in New Issue