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
|
||||
with(response.body().shares[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" +
|
||||
"hJ692UxorHdHWFU2RB-fMCmCA4IJ_dTw"
|
||||
username `should equal to` "admin"
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
"shares" : {
|
||||
"share" : [ {
|
||||
"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",
|
||||
"created" : "2017-11-07T21:33:51.748Z",
|
||||
"expires" : "2018-11-07T21:33:51.748Z",
|
||||
|
|
|
@ -192,4 +192,9 @@ interface SubsonicAPIDefinition {
|
|||
|
||||
@GET("getShares.view")
|
||||
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.MusicDirectoryParser;
|
||||
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.UserInfoParser;
|
||||
import org.moire.ultrasonic.service.ssl.SSLSocketFactory;
|
||||
|
@ -137,7 +136,6 @@ import java.net.URLEncoder;
|
|||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.Collections;
|
||||
import java.util.LinkedList;
|
||||
import java.util.List;
|
||||
import java.util.Locale;
|
||||
import java.util.concurrent.atomic.AtomicReference;
|
||||
|
@ -1410,40 +1408,19 @@ public class RESTMusicService implements MusicService
|
|||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<Share> createShare(List<String> ids, String description, Long expires, Context context, ProgressListener progressListener) throws Exception
|
||||
{
|
||||
List<String> parameterNames = new LinkedList<String>();
|
||||
List<Object> parameterValues = new LinkedList<Object>();
|
||||
@Override
|
||||
public List<Share> createShare(List<String> ids,
|
||||
String description,
|
||||
Long expires,
|
||||
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)
|
||||
{
|
||||
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);
|
||||
}
|
||||
}
|
||||
return APIShareConverter.toDomainEntitiesList(response.body().getShares());
|
||||
}
|
||||
|
||||
@Override
|
||||
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