Add pure state-merge module with unit tests

This commit is contained in:
2026-04-26 09:32:52 -07:00
parent ad8fde0dda
commit acf5e74f30
2 changed files with 70 additions and 0 deletions
+23
View File
@@ -0,0 +1,23 @@
const initialState = Object.freeze({
title: '',
artist: '',
album: '',
albumArt: '',
isPlaying: false,
progress: 0,
duration: 0,
});
function mergeState(current, update) {
return {
title: update.title ?? current.title,
artist: update.artist ?? current.artist,
album: update.album ?? current.album,
albumArt: update.albumArt ?? current.albumArt,
isPlaying: update.isPlaying ?? current.isPlaying,
progress: update.progress ?? current.progress,
duration: update.duration ?? current.duration,
};
}
module.exports = { initialState, mergeState };
+47
View File
@@ -0,0 +1,47 @@
const test = require('node:test');
const assert = require('node:assert/strict');
const { initialState, mergeState } = require('../state');
test('initialState has the expected shape', () => {
assert.deepEqual(initialState, {
title: '',
artist: '',
album: '',
albumArt: '',
isPlaying: false,
progress: 0,
duration: 0,
});
});
test('mergeState applies a single field update', () => {
const next = mergeState(initialState, { title: 'Foo' });
assert.equal(next.title, 'Foo');
});
test('mergeState preserves fields not present in the update', () => {
const current = { ...initialState, title: 'Old', artist: 'Bar' };
const next = mergeState(current, { title: 'New' });
assert.equal(next.artist, 'Bar');
});
test('mergeState treats undefined fields as no-change', () => {
const current = { ...initialState, isPlaying: true };
const next = mergeState(current, { isPlaying: undefined });
assert.equal(next.isPlaying, true);
});
test('mergeState applies false as a real value (not a no-change)', () => {
const current = { ...initialState, isPlaying: true };
const next = mergeState(current, { isPlaying: false });
assert.equal(next.isPlaying, false);
});
test('mergeState does not mutate inputs', () => {
const current = { ...initialState };
const update = { title: 'X' };
const before = { ...current };
mergeState(current, update);
assert.deepEqual(current, before);
assert.deepEqual(update, { title: 'X' });
});