From 2bfeb6325c8c673d89fd256e57c10ccf100598bc Mon Sep 17 00:00:00 2001 From: mkelvers Date: Wed, 24 Jun 2026 16:08:38 +0200 Subject: [PATCH] test: add player validate unit tests for isRecord, parseModeSources and parseSegments --- static/player/validate.test.ts | 58 ++++++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) create mode 100644 static/player/validate.test.ts diff --git a/static/player/validate.test.ts b/static/player/validate.test.ts new file mode 100644 index 0000000..087c795 --- /dev/null +++ b/static/player/validate.test.ts @@ -0,0 +1,58 @@ +import assert from "node:assert/strict"; +import { describe, test } from "node:test"; + +import { isRecord, parseModeSources, parseSegments } from "./validate"; + +describe("player validation", () => { + test("identifies plain records", () => { + assert.equal(isRecord({}), true); + assert.equal(isRecord({ token: "abc" }), true); + assert.equal(isRecord(null), false); + assert.equal(isRecord([]), false); + assert.equal(isRecord("value"), false); + }); + + test("parses valid mode sources and drops malformed entries", () => { + const sources = parseModeSources({ + sub: { + token: "sub-token", + type: "hls", + qualities: ["1080p", "720p"], + subtitles: [{ lang: "English", token: "subtitle-token" }], + }, + dub: { token: "", subtitles: [] }, + badSubtitles: { token: "bad", subtitles: [{ lang: "English" }] }, + badQualities: { token: "ok", qualities: ["1080p", 720], subtitles: [] }, + }); + + assert.deepEqual(sources, { + sub: { + token: "sub-token", + type: "hls", + qualities: ["1080p", "720p"], + subtitles: [{ lang: "English", token: "subtitle-token" }], + }, + badQualities: { token: "ok", type: undefined, qualities: undefined, subtitles: [] }, + }); + }); + + test("parses skip segments from numbers and numeric strings", () => { + assert.deepEqual( + parseSegments([ + { type: "op", start: 10, end: 90, source: "aniskip" }, + { type: "ed", start: "1200.5", end: "1280" }, + { type: "", start: 0, end: 1 }, + { type: "op", start: "nope", end: 1 }, + ]), + [ + { type: "op", start: 10, end: 90, source: "aniskip" }, + { type: "ed", start: 1200.5, end: 1280, source: undefined }, + ], + ); + }); + + test("returns empty structures for non-container inputs", () => { + assert.deepEqual(parseModeSources(null), {}); + assert.deepEqual(parseSegments({}), []); + }); +});