mirror of
https://github.com/ksyasuda/SubMiner.git
synced 2026-02-28 06:22:45 -08:00
refactor: extract runtime config access helpers
This commit is contained in:
98
src/core/services/runtime-config-service.test.ts
Normal file
98
src/core/services/runtime-config-service.test.ts
Normal file
@@ -0,0 +1,98 @@
|
||||
import test from "node:test";
|
||||
import assert from "node:assert/strict";
|
||||
import {
|
||||
getInitialInvisibleOverlayVisibilityService,
|
||||
isAutoUpdateEnabledRuntimeService,
|
||||
shouldAutoInitializeOverlayRuntimeFromConfigService,
|
||||
shouldBindVisibleOverlayToMpvSubVisibilityService,
|
||||
} from "./runtime-config-service";
|
||||
|
||||
const BASE_CONFIG = {
|
||||
auto_start_overlay: false,
|
||||
bind_visible_overlay_to_mpv_sub_visibility: true,
|
||||
invisibleOverlay: {
|
||||
startupVisibility: "platform-default" as const,
|
||||
},
|
||||
ankiConnect: {
|
||||
behavior: {
|
||||
autoUpdateNewCards: true,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
test("getInitialInvisibleOverlayVisibilityService handles visibility + platform", () => {
|
||||
assert.equal(
|
||||
getInitialInvisibleOverlayVisibilityService(
|
||||
{ ...BASE_CONFIG, invisibleOverlay: { startupVisibility: "visible" } },
|
||||
"linux",
|
||||
),
|
||||
true,
|
||||
);
|
||||
assert.equal(
|
||||
getInitialInvisibleOverlayVisibilityService(
|
||||
{ ...BASE_CONFIG, invisibleOverlay: { startupVisibility: "hidden" } },
|
||||
"darwin",
|
||||
),
|
||||
false,
|
||||
);
|
||||
assert.equal(
|
||||
getInitialInvisibleOverlayVisibilityService(BASE_CONFIG, "linux"),
|
||||
false,
|
||||
);
|
||||
assert.equal(
|
||||
getInitialInvisibleOverlayVisibilityService(BASE_CONFIG, "darwin"),
|
||||
true,
|
||||
);
|
||||
});
|
||||
|
||||
test("shouldAutoInitializeOverlayRuntimeFromConfigService respects auto start and visible startup", () => {
|
||||
assert.equal(
|
||||
shouldAutoInitializeOverlayRuntimeFromConfigService(BASE_CONFIG),
|
||||
false,
|
||||
);
|
||||
assert.equal(
|
||||
shouldAutoInitializeOverlayRuntimeFromConfigService({
|
||||
...BASE_CONFIG,
|
||||
auto_start_overlay: true,
|
||||
}),
|
||||
true,
|
||||
);
|
||||
assert.equal(
|
||||
shouldAutoInitializeOverlayRuntimeFromConfigService({
|
||||
...BASE_CONFIG,
|
||||
invisibleOverlay: { startupVisibility: "visible" },
|
||||
}),
|
||||
true,
|
||||
);
|
||||
});
|
||||
|
||||
test("shouldBindVisibleOverlayToMpvSubVisibilityService returns config value", () => {
|
||||
assert.equal(shouldBindVisibleOverlayToMpvSubVisibilityService(BASE_CONFIG), true);
|
||||
assert.equal(
|
||||
shouldBindVisibleOverlayToMpvSubVisibilityService({
|
||||
...BASE_CONFIG,
|
||||
bind_visible_overlay_to_mpv_sub_visibility: false,
|
||||
}),
|
||||
false,
|
||||
);
|
||||
});
|
||||
|
||||
test("isAutoUpdateEnabledRuntimeService prefers runtime option and falls back to config", () => {
|
||||
assert.equal(
|
||||
isAutoUpdateEnabledRuntimeService(BASE_CONFIG, {
|
||||
getOptionValue: () => false,
|
||||
}),
|
||||
false,
|
||||
);
|
||||
assert.equal(
|
||||
isAutoUpdateEnabledRuntimeService(
|
||||
{
|
||||
...BASE_CONFIG,
|
||||
ankiConnect: { behavior: { autoUpdateNewCards: false } },
|
||||
},
|
||||
null,
|
||||
),
|
||||
false,
|
||||
);
|
||||
assert.equal(isAutoUpdateEnabledRuntimeService(BASE_CONFIG, null), true);
|
||||
});
|
||||
50
src/core/services/runtime-config-service.ts
Normal file
50
src/core/services/runtime-config-service.ts
Normal file
@@ -0,0 +1,50 @@
|
||||
interface RuntimeAutoUpdateOptionManagerLike {
|
||||
getOptionValue: (id: "anki.autoUpdateNewCards") => unknown;
|
||||
}
|
||||
|
||||
interface RuntimeConfigLike {
|
||||
auto_start_overlay?: boolean;
|
||||
bind_visible_overlay_to_mpv_sub_visibility: boolean;
|
||||
invisibleOverlay: {
|
||||
startupVisibility: "visible" | "hidden" | "platform-default";
|
||||
};
|
||||
ankiConnect?: {
|
||||
behavior?: {
|
||||
autoUpdateNewCards?: boolean;
|
||||
};
|
||||
};
|
||||
}
|
||||
|
||||
export function getInitialInvisibleOverlayVisibilityService(
|
||||
config: RuntimeConfigLike,
|
||||
platform: NodeJS.Platform,
|
||||
): boolean {
|
||||
const visibility = config.invisibleOverlay.startupVisibility;
|
||||
if (visibility === "visible") return true;
|
||||
if (visibility === "hidden") return false;
|
||||
if (platform === "linux") return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
export function shouldAutoInitializeOverlayRuntimeFromConfigService(
|
||||
config: RuntimeConfigLike,
|
||||
): boolean {
|
||||
if (config.auto_start_overlay === true) return true;
|
||||
if (config.invisibleOverlay.startupVisibility === "visible") return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
export function shouldBindVisibleOverlayToMpvSubVisibilityService(
|
||||
config: RuntimeConfigLike,
|
||||
): boolean {
|
||||
return config.bind_visible_overlay_to_mpv_sub_visibility;
|
||||
}
|
||||
|
||||
export function isAutoUpdateEnabledRuntimeService(
|
||||
config: RuntimeConfigLike,
|
||||
runtimeOptionsManager: RuntimeAutoUpdateOptionManagerLike | null,
|
||||
): boolean {
|
||||
const value = runtimeOptionsManager?.getOptionValue("anki.autoUpdateNewCards");
|
||||
if (typeof value === "boolean") return value;
|
||||
return config.ankiConnect?.behavior?.autoUpdateNewCards !== false;
|
||||
}
|
||||
Reference in New Issue
Block a user