mirror of
https://github.com/wkulhanek/bonob.git
synced 2025-12-21 17:33:29 +01:00
Icon resizing of viewPort dynamically, ability to specify custom fore and background colors via env vars (#32)
This commit is contained in:
58
tests/clock.test.ts
Normal file
58
tests/clock.test.ts
Normal file
@@ -0,0 +1,58 @@
|
||||
import dayjs from "dayjs";
|
||||
import { isChristmas, isCNY, isHalloween, isHoli } from "../src/clock";
|
||||
|
||||
describe("isChristmas", () => {
|
||||
["2000/12/25", "2022/12/25", "2030/12/25"].forEach((date) => {
|
||||
it(`should return true for ${date} regardless of year`, () => {
|
||||
expect(isChristmas({ now: () => dayjs(date) })).toEqual(true);
|
||||
});
|
||||
});
|
||||
|
||||
["2000/12/24", "2000/12/26", "2021/01/01"].forEach((date) => {
|
||||
it(`should return false for ${date} regardless of year`, () => {
|
||||
expect(isChristmas({ now: () => dayjs(date) })).toEqual(false);
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
describe("isHalloween", () => {
|
||||
["2000/10/31", "2022/10/31", "2030/10/31"].forEach((date) => {
|
||||
it(`should return true for ${date} regardless of year`, () => {
|
||||
expect(isHalloween({ now: () => dayjs(date) })).toEqual(true);
|
||||
});
|
||||
});
|
||||
|
||||
["2000/09/31", "2000/10/30", "2021/01/01"].forEach((date) => {
|
||||
it(`should return false for ${date} regardless of year`, () => {
|
||||
expect(isHalloween({ now: () => dayjs(date) })).toEqual(false);
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
describe("isHoli", () => {
|
||||
["2022/03/18", "2023/03/07", "2024/03/25", "2025/03/14"].forEach((date) => {
|
||||
it(`should return true for ${date} regardless of year`, () => {
|
||||
expect(isHoli({ now: () => dayjs(date) })).toEqual(true);
|
||||
});
|
||||
});
|
||||
|
||||
["2000/09/31", "2000/10/30", "2021/01/01"].forEach((date) => {
|
||||
it(`should return false for ${date} regardless of year`, () => {
|
||||
expect(isHoli({ now: () => dayjs(date) })).toEqual(false);
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
describe("isCNY", () => {
|
||||
["2022/02/01", "2023/01/22", "2024/02/10", "2025/02/29"].forEach((date) => {
|
||||
it(`should return true for ${date} regardless of year`, () => {
|
||||
expect(isCNY({ now: () => dayjs(date) })).toEqual(true);
|
||||
});
|
||||
});
|
||||
|
||||
["2000/09/31", "2000/10/30", "2021/01/01"].forEach((date) => {
|
||||
it(`should return false for ${date} regardless of year`, () => {
|
||||
expect(isCNY({ now: () => dayjs(date) })).toEqual(false);
|
||||
});
|
||||
});
|
||||
});
|
||||
@@ -107,6 +107,66 @@ describe("config", () => {
|
||||
});
|
||||
});
|
||||
|
||||
describe("icons", () => {
|
||||
describe("foregroundColor", () => {
|
||||
describe("when BONOB_ICON_FOREGROUND_COLOR is not specified", () => {
|
||||
it(`should default to undefined`, () => {
|
||||
expect(config().icons.foregroundColor).toEqual(undefined);
|
||||
});
|
||||
});
|
||||
|
||||
describe("when BONOB_ICON_FOREGROUND_COLOR is ''", () => {
|
||||
it(`should default to undefined`, () => {
|
||||
process.env["BONOB_ICON_FOREGROUND_COLOR"] = "";
|
||||
expect(config().icons.foregroundColor).toEqual(undefined);
|
||||
});
|
||||
});
|
||||
|
||||
describe("when BONOB_ICON_FOREGROUND_COLOR is specified", () => {
|
||||
it(`should use it`, () => {
|
||||
process.env["BONOB_ICON_FOREGROUND_COLOR"] = "pink";
|
||||
expect(config().icons.foregroundColor).toEqual("pink");
|
||||
});
|
||||
});
|
||||
|
||||
describe("when BONOB_ICON_FOREGROUND_COLOR is an invalid string", () => {
|
||||
it(`should blow up`, () => {
|
||||
process.env["BONOB_ICON_FOREGROUND_COLOR"] = "#dfasd";
|
||||
expect(() => config()).toThrow("Invalid color specified for BONOB_ICON_FOREGROUND_COLOR")
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
describe("backgroundColor", () => {
|
||||
describe("when BONOB_ICON_BACKGROUND_COLOR is not specified", () => {
|
||||
it(`should default to undefined`, () => {
|
||||
expect(config().icons.backgroundColor).toEqual(undefined);
|
||||
});
|
||||
});
|
||||
|
||||
describe("when BONOB_ICON_BACKGROUND_COLOR is ''", () => {
|
||||
it(`should default to undefined`, () => {
|
||||
process.env["BONOB_ICON_BACKGROUND_COLOR"] = "";
|
||||
expect(config().icons.backgroundColor).toEqual(undefined);
|
||||
});
|
||||
});
|
||||
|
||||
describe("when BONOB_ICON_BACKGROUND_COLOR is specified", () => {
|
||||
it(`should use it`, () => {
|
||||
process.env["BONOB_ICON_BACKGROUND_COLOR"] = "blue";
|
||||
expect(config().icons.backgroundColor).toEqual("blue");
|
||||
});
|
||||
});
|
||||
|
||||
describe("when BONOB_ICON_BACKGROUND_COLOR is an invalid string", () => {
|
||||
it(`should blow up`, () => {
|
||||
process.env["BONOB_ICON_BACKGROUND_COLOR"] = "#red";
|
||||
expect(() => config()).toThrow("Invalid color specified for BONOB_ICON_BACKGROUND_COLOR")
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
describe("secret", () => {
|
||||
it("should default to bonob", () => {
|
||||
expect(config().secret).toEqual("bonob");
|
||||
|
||||
429
tests/icon.test.ts
Normal file
429
tests/icon.test.ts
Normal file
@@ -0,0 +1,429 @@
|
||||
import dayjs from "dayjs";
|
||||
import libxmljs from "libxmljs2";
|
||||
|
||||
import {
|
||||
ColorOverridingIcon,
|
||||
HOLI_COLORS,
|
||||
Icon,
|
||||
makeFestive,
|
||||
SvgIcon,
|
||||
Transformation,
|
||||
} from "../src/icon";
|
||||
|
||||
describe("SvgIcon", () => {
|
||||
const xmlTidy = (xml: string) =>
|
||||
libxmljs.parseXmlString(xml, { noblanks: true, net: false }).toString();
|
||||
|
||||
const svgIcon24 = `<?xml version="1.0" encoding="UTF-8"?>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
|
||||
<path d="something1"/>
|
||||
<path d="something2"/>
|
||||
<path d="something3"/>
|
||||
</svg>
|
||||
`;
|
||||
|
||||
const svgIcon128 = `<?xml version="1.0" encoding="UTF-8"?>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 128 128">
|
||||
<path d="something1"/>
|
||||
<path d="something2"/>
|
||||
<path d="something3"/>
|
||||
</svg>
|
||||
`;
|
||||
|
||||
describe("with no transformation", () => {
|
||||
it("should be the same", () => {
|
||||
expect(new SvgIcon(svgIcon24).toString()).toEqual(xmlTidy(svgIcon24));
|
||||
});
|
||||
});
|
||||
|
||||
describe("with a view port increase", () => {
|
||||
describe("of 50%", () => {
|
||||
describe("when the viewPort is of size 0 0 24 24", () => {
|
||||
it("should resize the viewPort", () => {
|
||||
expect(
|
||||
new SvgIcon(svgIcon24)
|
||||
.with({ viewPortIncreasePercent: 50 })
|
||||
.toString()
|
||||
).toEqual(
|
||||
xmlTidy(`<?xml version="1.0" encoding="UTF-8"?>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="-4 -4 32 32">
|
||||
<path d="something1"/>
|
||||
<path d="something2"/>
|
||||
<path d="something3"/>
|
||||
</svg>
|
||||
`)
|
||||
);
|
||||
});
|
||||
});
|
||||
describe("when the viewPort is of size 0 0 128 128", () => {
|
||||
it("should resize the viewPort", () => {
|
||||
expect(
|
||||
new SvgIcon(svgIcon128)
|
||||
.with({ viewPortIncreasePercent: 50 })
|
||||
.toString()
|
||||
).toEqual(
|
||||
xmlTidy(`<?xml version="1.0" encoding="UTF-8"?>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="-21 -21 170 170">
|
||||
<path d="something1"/>
|
||||
<path d="something2"/>
|
||||
<path d="something3"/>
|
||||
</svg>
|
||||
`)
|
||||
);
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
describe("of 0%", () => {
|
||||
it("should do nothing", () => {
|
||||
expect(
|
||||
new SvgIcon(svgIcon24).with({ viewPortIncreasePercent: 0 }).toString()
|
||||
).toEqual(xmlTidy(svgIcon24));
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
describe("background color", () => {
|
||||
describe("with no viewPort increase", () => {
|
||||
it("should add a rectangle the same size as the original viewPort", () => {
|
||||
expect(
|
||||
new SvgIcon(svgIcon24).with({ backgroundColor: "red" }).toString()
|
||||
).toEqual(
|
||||
xmlTidy(`<?xml version="1.0" encoding="UTF-8"?>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
|
||||
<rect x="0" y="0" width="24" height="24" style="fill:red"/>
|
||||
<path d="something1"/>
|
||||
<path d="something2"/>
|
||||
<path d="something3"/>
|
||||
</svg>
|
||||
`)
|
||||
);
|
||||
});
|
||||
});
|
||||
|
||||
describe("with a viewPort increase", () => {
|
||||
it("should add a rectangle the same size as the original viewPort", () => {
|
||||
expect(
|
||||
new SvgIcon(svgIcon24)
|
||||
.with({ backgroundColor: "pink", viewPortIncreasePercent: 50 })
|
||||
.toString()
|
||||
).toEqual(
|
||||
xmlTidy(`<?xml version="1.0" encoding="UTF-8"?>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="-4 -4 32 32">
|
||||
<rect x="-4" y="-4" width="36" height="36" style="fill:pink"/>
|
||||
<path d="something1"/>
|
||||
<path d="something2"/>
|
||||
<path d="something3"/>
|
||||
</svg>
|
||||
`)
|
||||
);
|
||||
});
|
||||
});
|
||||
|
||||
describe("of undefined", () => {
|
||||
it("should not do anything", () => {
|
||||
expect(
|
||||
new SvgIcon(svgIcon24)
|
||||
.with({ backgroundColor: undefined })
|
||||
.toString()
|
||||
).toEqual(
|
||||
xmlTidy(`<?xml version="1.0" encoding="UTF-8"?>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
|
||||
<path d="something1"/>
|
||||
<path d="something2"/>
|
||||
<path d="something3"/>
|
||||
</svg>
|
||||
`)
|
||||
);
|
||||
});
|
||||
});
|
||||
|
||||
describe("multiple times", () => {
|
||||
it("should use the most recent", () => {
|
||||
expect(
|
||||
new SvgIcon(svgIcon24)
|
||||
.with({ backgroundColor: "green" })
|
||||
.with({ backgroundColor: "red" })
|
||||
.toString()
|
||||
).toEqual(
|
||||
xmlTidy(`<?xml version="1.0" encoding="UTF-8"?>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
|
||||
<rect x="0" y="0" width="24" height="24" style="fill:red"/>
|
||||
<path d="something1"/>
|
||||
<path d="something2"/>
|
||||
<path d="something3"/>
|
||||
</svg>
|
||||
`)
|
||||
);
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
describe("foreground color", () => {
|
||||
describe("with no viewPort increase", () => {
|
||||
it("should add a rectangle the same size as the original viewPort", () => {
|
||||
expect(
|
||||
new SvgIcon(svgIcon24).with({ foregroundColor: "red" }).toString()
|
||||
).toEqual(
|
||||
xmlTidy(`<?xml version="1.0" encoding="UTF-8"?>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
|
||||
<path d="something1" style="fill:red"/>
|
||||
<path d="something2" style="fill:red"/>
|
||||
<path d="something3" style="fill:red"/>
|
||||
</svg>
|
||||
`)
|
||||
);
|
||||
});
|
||||
});
|
||||
|
||||
describe("with a viewPort increase", () => {
|
||||
it("should add a rectangle the same size as the original viewPort", () => {
|
||||
expect(
|
||||
new SvgIcon(svgIcon24)
|
||||
.with({ foregroundColor: "pink", viewPortIncreasePercent: 50 })
|
||||
.toString()
|
||||
).toEqual(
|
||||
xmlTidy(`<?xml version="1.0" encoding="UTF-8"?>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="-4 -4 32 32">
|
||||
<path d="something1" style="fill:pink"/>
|
||||
<path d="something2" style="fill:pink"/>
|
||||
<path d="something3" style="fill:pink"/>
|
||||
</svg>
|
||||
`)
|
||||
);
|
||||
});
|
||||
});
|
||||
|
||||
describe("of undefined", () => {
|
||||
it("should not do anything", () => {
|
||||
expect(
|
||||
new SvgIcon(svgIcon24)
|
||||
.with({ foregroundColor: undefined })
|
||||
.toString()
|
||||
).toEqual(
|
||||
xmlTidy(`<?xml version="1.0" encoding="UTF-8"?>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
|
||||
<path d="something1"/>
|
||||
<path d="something2"/>
|
||||
<path d="something3"/>
|
||||
</svg>
|
||||
`)
|
||||
);
|
||||
});
|
||||
});
|
||||
|
||||
describe("mutliple times", () => {
|
||||
it("should use the most recent", () => {
|
||||
expect(
|
||||
new SvgIcon(svgIcon24)
|
||||
.with({ foregroundColor: "blue" })
|
||||
.with({ foregroundColor: "red" })
|
||||
.toString()
|
||||
).toEqual(
|
||||
xmlTidy(`<?xml version="1.0" encoding="UTF-8"?>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
|
||||
<path d="something1" style="fill:red"/>
|
||||
<path d="something2" style="fill:red"/>
|
||||
<path d="something3" style="fill:red"/>
|
||||
</svg>
|
||||
`)
|
||||
);
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
class DummyIcon implements Icon {
|
||||
transformation: Partial<Transformation>;
|
||||
constructor(transformation: Partial<Transformation>) {
|
||||
this.transformation = transformation;
|
||||
}
|
||||
public with = (newTransformation: Partial<Transformation>) =>
|
||||
new DummyIcon({ ...this.transformation, ...newTransformation });
|
||||
|
||||
public toString = () => JSON.stringify(this);
|
||||
}
|
||||
|
||||
describe("ColorOverridingIcon", () => {
|
||||
describe("when the rule matches", () => {
|
||||
const icon = new DummyIcon({
|
||||
backgroundColor: "black",
|
||||
foregroundColor: "black",
|
||||
});
|
||||
const overriding = new ColorOverridingIcon(
|
||||
icon,
|
||||
() => true,
|
||||
() => ({ backgroundColor: "blue", foregroundColor: "red" })
|
||||
);
|
||||
|
||||
describe("with", () => {
|
||||
it("should be the with of the underlieing icon with the overriden colors", () => {
|
||||
const result = overriding.with({
|
||||
viewPortIncreasePercent: 99,
|
||||
backgroundColor: "shouldBeIgnored",
|
||||
foregroundColor: "shouldBeIgnored",
|
||||
}) as DummyIcon;
|
||||
|
||||
expect(result.transformation).toEqual({
|
||||
viewPortIncreasePercent: 99,
|
||||
backgroundColor: "blue",
|
||||
foregroundColor: "red",
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
describe("toString", () => {
|
||||
it("should be the toString of the underlieing icon with the overriden colors", () => {
|
||||
expect(overriding.toString()).toEqual(
|
||||
new DummyIcon({
|
||||
backgroundColor: "blue",
|
||||
foregroundColor: "red",
|
||||
}).toString()
|
||||
);
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
describe("when the rule doesnt match", () => {
|
||||
const icon = new DummyIcon({
|
||||
backgroundColor: "black",
|
||||
foregroundColor: "black",
|
||||
});
|
||||
const overriding = new ColorOverridingIcon(
|
||||
icon,
|
||||
() => false,
|
||||
() => ({ backgroundColor: "blue", foregroundColor: "red" })
|
||||
);
|
||||
|
||||
describe("with", () => {
|
||||
it("should use the provided transformation", () => {
|
||||
const result = overriding.with({
|
||||
viewPortIncreasePercent: 88,
|
||||
backgroundColor: "shouldBeUsed",
|
||||
foregroundColor: "shouldBeUsed",
|
||||
}) as DummyIcon;
|
||||
|
||||
expect(result.transformation).toEqual({
|
||||
viewPortIncreasePercent: 88,
|
||||
backgroundColor: "shouldBeUsed",
|
||||
foregroundColor: "shouldBeUsed",
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
describe("toString", () => {
|
||||
it("should be the toString of the unchanged icon", () => {
|
||||
expect(overriding.toString()).toEqual(icon.toString());
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
describe("makeFestive", () => {
|
||||
const icon = new DummyIcon({
|
||||
backgroundColor: "black",
|
||||
foregroundColor: "black",
|
||||
});
|
||||
let now = dayjs();
|
||||
|
||||
const festiveIcon = makeFestive(icon, { now: () => now })
|
||||
|
||||
describe("on a non special day", () => {
|
||||
beforeEach(() => {
|
||||
now = dayjs("2022/10/12");
|
||||
});
|
||||
|
||||
it("should use the given colors", () => {
|
||||
const result = festiveIcon.with({
|
||||
viewPortIncreasePercent: 88,
|
||||
backgroundColor: "shouldBeUsed",
|
||||
foregroundColor: "shouldBeUsed",
|
||||
}) as DummyIcon;
|
||||
|
||||
expect(result.transformation).toEqual({
|
||||
viewPortIncreasePercent: 88,
|
||||
backgroundColor: "shouldBeUsed",
|
||||
foregroundColor: "shouldBeUsed",
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
describe("on christmas day", () => {
|
||||
beforeEach(() => {
|
||||
now = dayjs("2022/12/25");
|
||||
});
|
||||
|
||||
it("should use the given colors", () => {
|
||||
const result = festiveIcon.with({
|
||||
viewPortIncreasePercent: 25,
|
||||
backgroundColor: "shouldNotBeUsed",
|
||||
foregroundColor: "shouldNotBeUsed",
|
||||
}) as DummyIcon;
|
||||
|
||||
expect(result.transformation).toEqual({
|
||||
viewPortIncreasePercent: 25,
|
||||
backgroundColor: "green",
|
||||
foregroundColor: "red",
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
describe("on halloween", () => {
|
||||
beforeEach(() => {
|
||||
now = dayjs("2022/10/31");
|
||||
});
|
||||
|
||||
it("should use the given colors", () => {
|
||||
const result = festiveIcon.with({
|
||||
viewPortIncreasePercent: 12,
|
||||
backgroundColor: "shouldNotBeUsed",
|
||||
foregroundColor: "shouldNotBeUsed",
|
||||
}) as DummyIcon;
|
||||
|
||||
expect(result.transformation).toEqual({
|
||||
viewPortIncreasePercent: 12,
|
||||
backgroundColor: "orange",
|
||||
foregroundColor: "black",
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
describe("on cny", () => {
|
||||
beforeEach(() => {
|
||||
now = dayjs("2022/02/01");
|
||||
});
|
||||
|
||||
it("should use the given colors", () => {
|
||||
const result = festiveIcon.with({
|
||||
viewPortIncreasePercent: 12,
|
||||
backgroundColor: "shouldNotBeUsed",
|
||||
foregroundColor: "shouldNotBeUsed",
|
||||
}) as DummyIcon;
|
||||
|
||||
expect(result.transformation).toEqual({
|
||||
viewPortIncreasePercent: 12,
|
||||
backgroundColor: "red",
|
||||
foregroundColor: "yellow",
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
describe("on holi", () => {
|
||||
beforeEach(() => {
|
||||
now = dayjs("2022/03/18");
|
||||
});
|
||||
|
||||
it("should use the given colors", () => {
|
||||
const result = festiveIcon.with({
|
||||
viewPortIncreasePercent: 12,
|
||||
backgroundColor: "shouldNotBeUsed",
|
||||
foregroundColor: "shouldNotBeUsed",
|
||||
}) as DummyIcon;
|
||||
|
||||
expect(result.transformation.viewPortIncreasePercent).toEqual(12);
|
||||
expect(HOLI_COLORS.includes(result.transformation.backgroundColor!)).toEqual(true);
|
||||
expect(HOLI_COLORS.includes(result.transformation.foregroundColor!)).toEqual(true);
|
||||
expect(result.transformation.backgroundColor).not.toEqual(result.transformation.foregroundColor);
|
||||
});
|
||||
});
|
||||
});
|
||||
@@ -6,7 +6,6 @@ import Image from "image-js";
|
||||
import { MusicService } from "../src/music_service";
|
||||
import makeServer, {
|
||||
BONOB_ACCESS_TOKEN_HEADER,
|
||||
ICONS,
|
||||
RangeBytesFromFilter,
|
||||
rangeFilterFor,
|
||||
} from "../src/server";
|
||||
@@ -21,9 +20,8 @@ import { Response } from "express";
|
||||
import { Transform } from "stream";
|
||||
import url from "../src/url_builder";
|
||||
import i8n, { randomLang } from "../src/i8n";
|
||||
import {
|
||||
SONOS_RECOMMENDED_IMAGE_SIZES,
|
||||
} from "../src/smapi";
|
||||
import { SONOS_RECOMMENDED_IMAGE_SIZES } from "../src/smapi";
|
||||
import { Clock, SystemClock } from "../src/clock";
|
||||
|
||||
describe("rangeFilterFor", () => {
|
||||
describe("invalid range header string", () => {
|
||||
@@ -1264,14 +1262,23 @@ describe("server", () => {
|
||||
});
|
||||
|
||||
describe("/icon", () => {
|
||||
const server = makeServer(
|
||||
jest.fn() as unknown as Sonos,
|
||||
aService(),
|
||||
url("http://localhost:1234"),
|
||||
jest.fn() as unknown as MusicService,
|
||||
new InMemoryLinkCodes(),
|
||||
jest.fn() as unknown as AccessTokens
|
||||
);
|
||||
const server = (
|
||||
clock: Clock = SystemClock,
|
||||
iconColors: {
|
||||
foregroundColor: string | undefined;
|
||||
backgroundColor: string | undefined;
|
||||
} = { foregroundColor: undefined, backgroundColor: undefined }
|
||||
) =>
|
||||
makeServer(
|
||||
jest.fn() as unknown as Sonos,
|
||||
aService(),
|
||||
url("http://localhost:1234"),
|
||||
jest.fn() as unknown as MusicService,
|
||||
new InMemoryLinkCodes(),
|
||||
jest.fn() as unknown as AccessTokens,
|
||||
clock,
|
||||
iconColors
|
||||
);
|
||||
|
||||
describe("invalid icon names", () => {
|
||||
[
|
||||
@@ -1286,7 +1293,7 @@ describe("server", () => {
|
||||
].forEach((type) => {
|
||||
describe(`trying to retrieve an icon with name ${type}`, () => {
|
||||
it(`should fail`, async () => {
|
||||
const response = await request(server).get(
|
||||
const response = await request(server()).get(
|
||||
`/icon/${type}/size/legacy`
|
||||
);
|
||||
|
||||
@@ -1300,7 +1307,7 @@ describe("server", () => {
|
||||
["-1", "0", "59", "foo"].forEach((size) => {
|
||||
describe(`trying to retrieve an icon with size ${size}`, () => {
|
||||
it(`should fail`, async () => {
|
||||
const response = await request(server).get(
|
||||
const response = await request(server()).get(
|
||||
`/icon/artists/size/${size}`
|
||||
);
|
||||
|
||||
@@ -1311,11 +1318,22 @@ describe("server", () => {
|
||||
});
|
||||
|
||||
describe("fetching", () => {
|
||||
Object.keys(ICONS).forEach((type) => {
|
||||
[
|
||||
"artists",
|
||||
"albums",
|
||||
"playlists",
|
||||
"genres",
|
||||
"random",
|
||||
"starred",
|
||||
"recentlyAdded",
|
||||
"recentlyPlayed",
|
||||
"mostPlayed",
|
||||
"discover",
|
||||
].forEach((type) => {
|
||||
describe(`type=${type}`, () => {
|
||||
describe(`legacy icon`, () => {
|
||||
it("should return the png image", async () => {
|
||||
const response = await request(server).get(
|
||||
const response = await request(server()).get(
|
||||
`/icon/${type}/size/legacy`
|
||||
);
|
||||
|
||||
@@ -1330,7 +1348,7 @@ describe("server", () => {
|
||||
describe("svg icon", () => {
|
||||
SONOS_RECOMMENDED_IMAGE_SIZES.forEach((size) => {
|
||||
it(`should return an svg image for size = ${size}`, async () => {
|
||||
const response = await request(server).get(
|
||||
const response = await request(server()).get(
|
||||
`/icon/${type}/size/${size}`
|
||||
);
|
||||
|
||||
@@ -1339,12 +1357,33 @@ describe("server", () => {
|
||||
"image/svg+xml; charset=utf-8"
|
||||
);
|
||||
const svg = Buffer.from(response.body).toString();
|
||||
expect(svg).toContain(`viewBox="0 0 ${size} ${size}"`);
|
||||
expect(svg).toContain(
|
||||
` xmlns="http://www.w3.org/2000/svg" `
|
||||
);
|
||||
});
|
||||
});
|
||||
|
||||
it("should return icon colors as per config if overriden", async () => {
|
||||
const response = await request(server(SystemClock, { foregroundColor: 'brightblue', backgroundColor: 'brightpink' })).get(
|
||||
`/icon/${type}/size/180`
|
||||
);
|
||||
|
||||
expect(response.status).toEqual(200);
|
||||
const svg = Buffer.from(response.body).toString();
|
||||
expect(svg).toContain(`fill:brightblue`);
|
||||
expect(svg).toContain(`fill:brightpink`);
|
||||
});
|
||||
|
||||
it("should return a christmas icon on christmas day", async () => {
|
||||
const response = await request(server({ now: () => dayjs("2022/12/25") })).get(
|
||||
`/icon/${type}/size/180`
|
||||
);
|
||||
|
||||
expect(response.status).toEqual(200);
|
||||
const svg = Buffer.from(response.body).toString();
|
||||
expect(svg).toContain(`fill:red`);
|
||||
expect(svg).toContain(`fill:green`);
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user