diff --git a/src/subsonic.ts b/src/subsonic.ts index 548f67a..ea43344 100644 --- a/src/subsonic.ts +++ b/src/subsonic.ts @@ -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 ( { username, password }: Credentials, path: string, @@ -739,7 +741,13 @@ export class Subsonic { this.getJSON(credentials, `/rest/setRating`, { id, rating, - }).then(it => - it.status == "ok" - ); + }) + .then(it => it.status == "ok"); + + scrobble = (credentials: Credentials, id: string, submission: boolean) => + this.getJSON(credentials, `/rest/scrobble`, { + id, + submission, + }) + .then(it => it.status == "ok") } diff --git a/src/subsonic_music_library.ts b/src/subsonic_music_library.ts index 228d71d..060d3b8 100644 --- a/src/subsonic_music_library.ts +++ b/src/subsonic_music_library.ts @@ -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 diff --git a/tests/subsonic.test.ts b/tests/subsonic.test.ts index 704e2a1..e09b9b8 100644 --- a/tests/subsonic.test.ts +++ b/tests/subsonic.test.ts @@ -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); + }); + }); + }); }); diff --git a/tests/subsonic_music_library.test.ts b/tests/subsonic_music_library.test.ts index 01a921e..af4ebba 100644 --- a/tests/subsonic_music_library.test.ts +++ b/tests/subsonic_music_library.test.ts @@ -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 () => {