48 lines
1.4 KiB
JavaScript
48 lines
1.4 KiB
JavaScript
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' });
|
||
|
|
});
|