82 lines
2.4 KiB
JavaScript
82 lines
2.4 KiB
JavaScript
const test = require("node:test");
|
|
const assert = require("node:assert/strict");
|
|
const { openDatabase } = require("../src/database");
|
|
const { runMigrations } = require("../src/database/migrate");
|
|
const {
|
|
SettingsValidationError,
|
|
createSettingsService,
|
|
} = require("../src/settings/service");
|
|
|
|
function createService() {
|
|
const database = openDatabase({ path: ":memory:" });
|
|
runMigrations(database);
|
|
return {
|
|
database,
|
|
service: createSettingsService(database, { now: () => 2_000_000_000_000 }),
|
|
};
|
|
}
|
|
|
|
test("settings are persisted with the approved defaults", (t) => {
|
|
const { database, service } = createService();
|
|
t.after(() => database.close());
|
|
|
|
assert.deepEqual(service.get(), {
|
|
revision: 1,
|
|
defaultDurationMs: 7000,
|
|
defaultBackgroundMode: "blurred",
|
|
defaultSolidBackgroundColor: "#000000",
|
|
defaultBackgroundDarkened: false,
|
|
defaultBlurPx: 20,
|
|
crossfadeDurationMs: 1000,
|
|
updatedAt: database.prepare("SELECT updated_at FROM app_settings").get()
|
|
.updated_at,
|
|
});
|
|
});
|
|
|
|
test("settings updates persist boolean darkening and increment revision", (t) => {
|
|
const { database, service } = createService();
|
|
t.after(() => database.close());
|
|
|
|
const updated = service.update({
|
|
defaultBackgroundDarkened: true,
|
|
defaultBlurPx: 24,
|
|
});
|
|
|
|
assert.equal(updated.revision, 2);
|
|
assert.equal(updated.defaultBackgroundDarkened, true);
|
|
assert.equal(updated.defaultBlurPx, 24);
|
|
assert.equal(
|
|
database.prepare("SELECT default_background_darkened FROM app_settings").get()
|
|
.default_background_darkened,
|
|
1,
|
|
);
|
|
});
|
|
|
|
test("settings reject strength values, unknown fields, and invalid values", (t) => {
|
|
const { database, service } = createService();
|
|
t.after(() => database.close());
|
|
|
|
const original = service.get();
|
|
|
|
assert.throws(
|
|
() => service.update({ defaultBlurPx: 24, darkeningOverride: 0.25 }),
|
|
(error) => error instanceof SettingsValidationError,
|
|
);
|
|
assert.deepEqual(service.get(), original);
|
|
assert.throws(
|
|
() => service.update({ defaultBlurPx: 24, defaultBackgroundDarkened: 1 }),
|
|
/must be a boolean/,
|
|
);
|
|
assert.deepEqual(service.get(), original);
|
|
assert.throws(
|
|
() => service.update({ defaultDurationMs: 0 }),
|
|
/positive integer/,
|
|
);
|
|
assert.deepEqual(service.get(), original);
|
|
assert.throws(
|
|
() => service.update({ toString: "not a setting" }),
|
|
/unknown fields/,
|
|
);
|
|
assert.deepEqual(service.get(), original);
|
|
});
|