Disabled sonos should return false for all mutations

This commit is contained in:
simojenki
2021-09-21 11:15:51 +10:00
parent a0043668d2
commit 0bc2d39a37
7 changed files with 60 additions and 41 deletions

View File

@@ -37,7 +37,7 @@ export default function () {
sonos: { sonos: {
serviceName: process.env["BONOB_SONOS_SERVICE_NAME"] || "bonob", serviceName: process.env["BONOB_SONOS_SERVICE_NAME"] || "bonob",
discovery: { discovery: {
auto: enabled:
(process.env["BONOB_SONOS_DEVICE_DISCOVERY"] || "true") == "true", (process.env["BONOB_SONOS_DEVICE_DISCOVERY"] || "true") == "true",
seedHost: process.env["BONOB_SONOS_SEED_HOST"], seedHost: process.env["BONOB_SONOS_SEED_HOST"],
}, },

View File

@@ -13,7 +13,7 @@ const bonobUrl = new URLBuilder(params[0]!);
const config = readConfig(); const config = readConfig();
registrar(bonobUrl, config.sonos.discovery)() registrar(bonobUrl, config.sonos.discovery.seedHost)()
.then((success) => { .then((success) => {
if (success) { if (success) {
console.log(`Successfully registered bonob @ ${bonobUrl} with sonos`); console.log(`Successfully registered bonob @ ${bonobUrl} with sonos`);

View File

@@ -1,15 +1,12 @@
import axios from "axios"; import axios from "axios";
import _ from "underscore"; import _ from "underscore";
import logger from "./logger"; import logger from "./logger";
import sonos, { bonobService, Discovery } from "./sonos"; import sonos, { bonobService } from "./sonos";
import { URLBuilder } from "./url_builder"; import { URLBuilder } from "./url_builder";
export default ( export default (
bonobUrl: URLBuilder, bonobUrl: URLBuilder,
sonosDiscovery: Discovery = { seedHost?: string
auto: true,
seedHost: undefined,
}
) => ) =>
async () => { async () => {
const about = bonobUrl.append({ pathname: "/about" }); const about = bonobUrl.append({ pathname: "/about" });
@@ -34,5 +31,5 @@ export default (
.then(({ name, sid }: { name: string; sid: number }) => .then(({ name, sid }: { name: string; sid: number }) =>
bonobService(name, sid, bonobUrl) bonobService(name, sid, bonobUrl)
) )
.then((service) => sonos(sonosDiscovery).register(service)); .then((service) => sonos({ enabled: true, seedHost }).register(service));
}; };

View File

@@ -101,8 +101,8 @@ export interface Sonos {
export const SONOS_DISABLED: Sonos = { export const SONOS_DISABLED: Sonos = {
devices: () => Promise.resolve([]), devices: () => Promise.resolve([]),
services: () => Promise.resolve([]), services: () => Promise.resolve([]),
remove: (_: number) => Promise.resolve(true), remove: (_: number) => Promise.resolve(false),
register: (_: Service) => Promise.resolve(true), register: (_: Service) => Promise.resolve(false),
}; };
export const asService = (musicService: MusicService): Service => ({ export const asService = (musicService: MusicService): Service => ({
@@ -243,13 +243,13 @@ export function autoDiscoverySonos(sonosSeedHost?: string): Sonos {
} }
export type Discovery = { export type Discovery = {
auto: boolean; enabled: boolean;
seedHost?: string; seedHost?: string;
}; };
export default ( export default (
sonosDiscovery: Discovery = { auto: true } sonosDiscovery: Discovery = { enabled: true }
): Sonos => ): Sonos =>
sonosDiscovery.auto sonosDiscovery.enabled
? autoDiscoverySonos(sonosDiscovery.seedHost) ? autoDiscoverySonos(sonosDiscovery.seedHost)
: SONOS_DISABLED; : SONOS_DISABLED;

View File

@@ -198,7 +198,7 @@ describe("config", () => {
"deviceDiscovery", "deviceDiscovery",
"BONOB_SONOS_DEVICE_DISCOVERY", "BONOB_SONOS_DEVICE_DISCOVERY",
true, true,
(config) => config.sonos.discovery.auto (config) => config.sonos.discovery.enabled
); );
describe("seedHost", () => { describe("seedHost", () => {

View File

@@ -75,41 +75,62 @@ describe("registrar", () => {
(sonos as jest.Mock).mockReturnValue(fakeSonos); (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", () => { describe("when registration succeeds", () => {
it("should fetch the service details and register", async () => { it("should fetch the service details and register", async () => {
fakeSonos.register.mockResolvedValue(true); fakeSonos.register.mockResolvedValue(true);
const sonosDiscovery = { auto: true };
expect(await registrar(bonobUrl, sonosDiscovery)()).toEqual( expect(await registrar(bonobUrl)()).toEqual(
true true
); );
expect(bonobService).toHaveBeenCalledWith(
serviceDetails.name,
serviceDetails.sid,
bonobUrl
);
expect(sonos).toHaveBeenCalledWith(sonosDiscovery);
expect(fakeSonos.register).toHaveBeenCalledWith(service);
}); });
}); });
describe("when registration fails", () => { describe("when registration fails", () => {
it("should fetch the service details and register", async () => { it("should fetch the service details and register", async () => {
fakeSonos.register.mockResolvedValue(false); 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 false
); );
expect(bonobService).toHaveBeenCalledWith(
serviceDetails.name,
serviceDetails.sid,
bonobUrl
);
expect(sonos).toHaveBeenCalledWith(sonosDiscovery);
expect(fakeSonos.register).toHaveBeenCalledWith(service);
}); });
}); });
}); });

View File

@@ -274,12 +274,13 @@ describe("sonos", () => {
describe("when is disabled", () => { describe("when is disabled", () => {
it("should return a disabled client", async () => { it("should return a disabled client", async () => {
const disabled = sonos({ auto: false }); const disabled = sonos({ enabled: false });
expect(disabled).toEqual(SONOS_DISABLED); expect(disabled).toEqual(SONOS_DISABLED);
expect(await disabled.devices()).toEqual([]); expect(await disabled.devices()).toEqual([]);
expect(await disabled.services()).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); sonosManager.InitializeWithDiscovery.mockResolvedValue(true);
const actualDevices = await sonos({ auto: true }).devices(); const actualDevices = await sonos({ enabled: true }).devices();
expect(SonosManager).toHaveBeenCalledTimes(1); expect(SonosManager).toHaveBeenCalledTimes(1);
expect(sonosManager.InitializeWithDiscovery).toHaveBeenCalledWith(10); expect(sonosManager.InitializeWithDiscovery).toHaveBeenCalledWith(10);
@@ -331,7 +332,7 @@ describe("sonos", () => {
); );
sonosManager.InitializeWithDiscovery.mockResolvedValue(true); 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).toHaveBeenCalledTimes(1);
expect(sonosManager.InitializeWithDiscovery).toHaveBeenCalledWith(10); expect(sonosManager.InitializeWithDiscovery).toHaveBeenCalledWith(10);
@@ -354,7 +355,7 @@ describe("sonos", () => {
); );
sonosManager.InitializeFromDevice.mockResolvedValue(true); 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).toHaveBeenCalledTimes(1);
expect(sonosManager.InitializeFromDevice).toHaveBeenCalledWith( expect(sonosManager.InitializeFromDevice).toHaveBeenCalledWith(
@@ -377,7 +378,7 @@ describe("sonos", () => {
); );
sonosManager.InitializeWithDiscovery.mockResolvedValue(true); 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([ expect(actualDevices).toEqual([
{ {
@@ -408,7 +409,7 @@ describe("sonos", () => {
); );
sonosManager.InitializeWithDiscovery.mockResolvedValue(false); sonosManager.InitializeWithDiscovery.mockResolvedValue(false);
expect(await sonos({ auto: true, seedHost: "" }).devices()).toEqual([]); expect(await sonos({ enabled: true, seedHost: "" }).devices()).toEqual([]);
}); });
}); });
}); });