move scrobble into subsonic

This commit is contained in:
simon
2025-02-15 22:56:22 +00:00
parent ddde55d02b
commit 5009732da2
4 changed files with 86 additions and 127 deletions

View File

@@ -522,6 +522,8 @@ export class Subsonic {
});
// todo: make private
// todo: should I put a catch in here and force a subsonic fail status?
// or there is a catch above, that then throws, perhaps can go in there?
getJSON = async <T>(
{ username, password }: Credentials,
path: string,
@@ -739,7 +741,13 @@ export class Subsonic {
this.getJSON<SubsonicResponse>(credentials, `/rest/setRating`, {
id,
rating,
}).then(it =>
it.status == "ok"
);
})
.then(it => it.status == "ok");
scrobble = (credentials: Credentials, id: string, submission: boolean) =>
this.getJSON<SubsonicResponse>(credentials, `/rest/scrobble`, {
id,
submission,
})
.then(it => it.status == "ok")
}

View File

@@ -266,23 +266,12 @@ export class SubsonicMusicLibrary implements MusicLibrary {
return undefined;
});
// todo: unit test the difference between scrobble and nowPlaying
scrobble = async (id: string) =>
this.subsonic
.getJSON(this.credentials, `/rest/scrobble`, {
id,
submission: true,
})
.then((_) => true)
.catch(() => false);
this.subsonic.scrobble(this.credentials, id, true);
nowPlaying = async (id: string) =>
this.subsonic
.getJSON(this.credentials, `/rest/scrobble`, {
id,
submission: false,
})
.then((_) => true)
.catch(() => false);
this.subsonic.scrobble(this.credentials, id, false);
searchArtists = async (query: string) =>
this.subsonic

View File

@@ -1103,4 +1103,76 @@ describe("subsonic", () => {
});
});
});
describe("scrobble", () => {
const id = uuid();
describe("with submission", () => {
const submission = true;
beforeEach(() => {
mockGET.mockImplementationOnce(() =>
Promise.resolve(ok(subsonicResponse({ status: "ok" })))
);
});
it("should scrobble and return true", async () => {
const result = await subsonic.scrobble(credentials, id, submission);
expect(result).toEqual(true);
expect(axios.get).toHaveBeenCalledWith(
url.append({ pathname: "/rest/scrobble" }).href(),
{
params: asURLSearchParams({
...authParamsPlusJson,
id,
submission
}),
headers,
}
);
});
});
describe("without submission", () => {
const submission = false;
beforeEach(() => {
mockGET.mockImplementationOnce(() =>
Promise.resolve(ok(subsonicResponse({ status: "ok" })))
);
});
it("should scrobble and return true", async () => {
const result = await subsonic.scrobble(credentials, id, submission);
expect(result).toEqual(true);
expect(axios.get).toHaveBeenCalledWith(
url.append({ pathname: "/rest/scrobble" }).href(),
{
params: asURLSearchParams({
...authParamsPlusJson,
id,
submission
}),
headers,
}
);
});
});
describe("when fails", () => {
beforeEach(() => {
mockGET.mockImplementationOnce(() =>
Promise.resolve(ok(subsonicResponse({ status: "not-ok" })))
);
});
it("should return false", async () => {
const result = await subsonic.scrobble(credentials, id, false);
expect(result).toEqual(false);
});
});
});
});

View File

@@ -3549,116 +3549,6 @@ describe("SubsonicMusicLibrary", () => {
});
});
describe("scrobble", () => {
describe("when succeeds", () => {
it("should return true", async () => {
const id = uuid();
mockGET.mockImplementationOnce(() => Promise.resolve(ok(EMPTY)));
const result = await subsonic.scrobble(id);
expect(result).toEqual(true);
expect(mockGET).toHaveBeenCalledWith(
url.append({ pathname: "/rest/scrobble" }).href(),
{
params: asURLSearchParams({
...authParamsPlusJson,
id,
submission: true,
}),
headers,
}
);
});
});
describe("when fails", () => {
it("should return false", async () => {
const id = uuid();
mockGET.mockImplementationOnce(() =>
Promise.resolve({
status: 500,
data: {},
})
);
const result = await subsonic.scrobble(id);
expect(result).toEqual(false);
expect(mockGET).toHaveBeenCalledWith(
url.append({ pathname: "/rest/scrobble" }).href(),
{
params: asURLSearchParams({
...authParamsPlusJson,
id,
submission: true,
}),
headers,
}
);
});
});
});
describe("nowPlaying", () => {
describe("when succeeds", () => {
it("should return true", async () => {
const id = uuid();
mockGET.mockImplementationOnce(() => Promise.resolve(ok(EMPTY)));
const result = await subsonic.nowPlaying(id);
expect(result).toEqual(true);
expect(mockGET).toHaveBeenCalledWith(
url.append({ pathname: "/rest/scrobble" }).href(),
{
params: asURLSearchParams({
...authParamsPlusJson,
id,
submission: false,
}),
headers,
}
);
});
});
describe("when fails", () => {
it("should return false", async () => {
const id = uuid();
mockGET.mockImplementationOnce(() =>
Promise.resolve({
status: 500,
data: {},
})
);
const result = await subsonic.nowPlaying(id);
expect(result).toEqual(false);
expect(mockGET).toHaveBeenCalledWith(
url.append({ pathname: "/rest/scrobble" }).href(),
{
params: asURLSearchParams({
...authParamsPlusJson,
id,
submission: false,
}),
headers,
}
);
});
});
});
describe("searchArtists", () => {
describe("when there is 1 search results", () => {
it("should return true", async () => {