diff --git a/src/config.ts b/src/config.ts index d302495..4d8db6f 100644 --- a/src/config.ts +++ b/src/config.ts @@ -37,7 +37,7 @@ export default function () { sonos: { serviceName: process.env["BONOB_SONOS_SERVICE_NAME"] || "bonob", discovery: { - auto: + enabled: (process.env["BONOB_SONOS_DEVICE_DISCOVERY"] || "true") == "true", seedHost: process.env["BONOB_SONOS_SEED_HOST"], }, diff --git a/src/register.ts b/src/register.ts index 615dd7c..2daef2e 100644 --- a/src/register.ts +++ b/src/register.ts @@ -13,7 +13,7 @@ const bonobUrl = new URLBuilder(params[0]!); const config = readConfig(); -registrar(bonobUrl, config.sonos.discovery)() +registrar(bonobUrl, config.sonos.discovery.seedHost)() .then((success) => { if (success) { console.log(`Successfully registered bonob @ ${bonobUrl} with sonos`); diff --git a/src/registrar.ts b/src/registrar.ts index 392b354..852227e 100644 --- a/src/registrar.ts +++ b/src/registrar.ts @@ -1,15 +1,12 @@ import axios from "axios"; import _ from "underscore"; import logger from "./logger"; -import sonos, { bonobService, Discovery } from "./sonos"; +import sonos, { bonobService } from "./sonos"; import { URLBuilder } from "./url_builder"; export default ( bonobUrl: URLBuilder, - sonosDiscovery: Discovery = { - auto: true, - seedHost: undefined, - } + seedHost?: string ) => async () => { const about = bonobUrl.append({ pathname: "/about" }); @@ -34,5 +31,5 @@ export default ( .then(({ name, sid }: { name: string; sid: number }) => bonobService(name, sid, bonobUrl) ) - .then((service) => sonos(sonosDiscovery).register(service)); + .then((service) => sonos({ enabled: true, seedHost }).register(service)); }; diff --git a/src/sonos.ts b/src/sonos.ts index f85a9b9..f01d56b 100644 --- a/src/sonos.ts +++ b/src/sonos.ts @@ -101,8 +101,8 @@ export interface Sonos { export const SONOS_DISABLED: Sonos = { devices: () => Promise.resolve([]), services: () => Promise.resolve([]), - remove: (_: number) => Promise.resolve(true), - register: (_: Service) => Promise.resolve(true), + remove: (_: number) => Promise.resolve(false), + register: (_: Service) => Promise.resolve(false), }; export const asService = (musicService: MusicService): Service => ({ @@ -243,13 +243,13 @@ export function autoDiscoverySonos(sonosSeedHost?: string): Sonos { } export type Discovery = { - auto: boolean; + enabled: boolean; seedHost?: string; }; export default ( - sonosDiscovery: Discovery = { auto: true } + sonosDiscovery: Discovery = { enabled: true } ): Sonos => - sonosDiscovery.auto + sonosDiscovery.enabled ? autoDiscoverySonos(sonosDiscovery.seedHost) : SONOS_DISABLED; diff --git a/tests/config.test.ts b/tests/config.test.ts index 29d0232..81be850 100644 --- a/tests/config.test.ts +++ b/tests/config.test.ts @@ -198,7 +198,7 @@ describe("config", () => { "deviceDiscovery", "BONOB_SONOS_DEVICE_DISCOVERY", true, - (config) => config.sonos.discovery.auto + (config) => config.sonos.discovery.enabled ); describe("seedHost", () => { diff --git a/tests/registrar.test.ts b/tests/registrar.test.ts index 69b66e5..876d0d1 100644 --- a/tests/registrar.test.ts +++ b/tests/registrar.test.ts @@ -75,41 +75,62 @@ describe("registrar", () => { (sonos as jest.Mock).mockReturnValue(fakeSonos); }); + describe("seedHost", () => { + describe("is specified", () => { + it("should register using the seed host", async () => { + fakeSonos.register.mockResolvedValue(true); + const seedHost = "127.0.0.11"; + + expect(await registrar(bonobUrl, seedHost)()).toEqual( + true + ); + + expect(bonobService).toHaveBeenCalledWith( + serviceDetails.name, + serviceDetails.sid, + bonobUrl + ); + expect(sonos).toHaveBeenCalledWith({ enabled: true, seedHost }); + expect(fakeSonos.register).toHaveBeenCalledWith(service); + }); + }); + + describe("is not specified", () => { + it("should register without using the seed host", async () => { + fakeSonos.register.mockResolvedValue(true); + + expect(await registrar(bonobUrl)()).toEqual( + true + ); + + expect(bonobService).toHaveBeenCalledWith( + serviceDetails.name, + serviceDetails.sid, + bonobUrl + ); + expect(sonos).toHaveBeenCalledWith({ enabled: true }); + expect(fakeSonos.register).toHaveBeenCalledWith(service); + }); + }); + }); + describe("when registration succeeds", () => { it("should fetch the service details and register", async () => { fakeSonos.register.mockResolvedValue(true); - const sonosDiscovery = { auto: true }; - expect(await registrar(bonobUrl, sonosDiscovery)()).toEqual( + expect(await registrar(bonobUrl)()).toEqual( true ); - - expect(bonobService).toHaveBeenCalledWith( - serviceDetails.name, - serviceDetails.sid, - bonobUrl - ); - expect(sonos).toHaveBeenCalledWith(sonosDiscovery); - expect(fakeSonos.register).toHaveBeenCalledWith(service); }); }); describe("when registration fails", () => { it("should fetch the service details and register", async () => { fakeSonos.register.mockResolvedValue(false); - const sonosDiscovery = { auto: false, seedHost: "192.168.1.163" }; - expect(await registrar(bonobUrl, sonosDiscovery)()).toEqual( + expect(await registrar(bonobUrl)()).toEqual( false ); - - expect(bonobService).toHaveBeenCalledWith( - serviceDetails.name, - serviceDetails.sid, - bonobUrl - ); - expect(sonos).toHaveBeenCalledWith(sonosDiscovery); - expect(fakeSonos.register).toHaveBeenCalledWith(service); }); }); }); diff --git a/tests/sonos.test.ts b/tests/sonos.test.ts index bad0d5a..16dbcf3 100644 --- a/tests/sonos.test.ts +++ b/tests/sonos.test.ts @@ -274,12 +274,13 @@ describe("sonos", () => { describe("when is disabled", () => { it("should return a disabled client", async () => { - const disabled = sonos({ auto: false }); + const disabled = sonos({ enabled: false }); expect(disabled).toEqual(SONOS_DISABLED); expect(await disabled.devices()).toEqual([]); expect(await disabled.services()).toEqual([]); - expect(await disabled.register(aService())).toEqual(true); + expect(await disabled.register(aService())).toEqual(false); + expect(await disabled.remove(123)).toEqual(false); }); }); @@ -310,7 +311,7 @@ describe("sonos", () => { ); sonosManager.InitializeWithDiscovery.mockResolvedValue(true); - const actualDevices = await sonos({ auto: true }).devices(); + const actualDevices = await sonos({ enabled: true }).devices(); expect(SonosManager).toHaveBeenCalledTimes(1); expect(sonosManager.InitializeWithDiscovery).toHaveBeenCalledWith(10); @@ -331,7 +332,7 @@ describe("sonos", () => { ); sonosManager.InitializeWithDiscovery.mockResolvedValue(true); - const actualDevices = await sonos({ auto: true, seedHost: "" }).devices(); + const actualDevices = await sonos({ enabled: true, seedHost: "" }).devices(); expect(SonosManager).toHaveBeenCalledTimes(1); expect(sonosManager.InitializeWithDiscovery).toHaveBeenCalledWith(10); @@ -354,7 +355,7 @@ describe("sonos", () => { ); sonosManager.InitializeFromDevice.mockResolvedValue(true); - const actualDevices = await sonos({ auto: true, seedHost }).devices(); + const actualDevices = await sonos({ enabled: true, seedHost }).devices(); expect(SonosManager).toHaveBeenCalledTimes(1); expect(sonosManager.InitializeFromDevice).toHaveBeenCalledWith( @@ -377,7 +378,7 @@ describe("sonos", () => { ); sonosManager.InitializeWithDiscovery.mockResolvedValue(true); - const actualDevices = await sonos({ auto: true, seedHost: undefined }).devices(); + const actualDevices = await sonos({ enabled: true, seedHost: undefined }).devices(); expect(actualDevices).toEqual([ { @@ -408,7 +409,7 @@ describe("sonos", () => { ); sonosManager.InitializeWithDiscovery.mockResolvedValue(false); - expect(await sonos({ auto: true, seedHost: "" }).devices()).toEqual([]); + expect(await sonos({ enabled: true, seedHost: "" }).devices()).toEqual([]); }); }); });