Files
houseplan-card/test/initial-load.test.mjs
T
2026-08-20 01:38:01 +03:00

100 lines
4.2 KiB
JavaScript

import test from 'node:test';
import assert from 'node:assert/strict';
import {
resolveFixedFloor, resolveInitialSpace, settleBestEffort,
} from '../test-build/initial-load.js';
test('fixed floor distinguishes absence, stable ids and zero-based indexes', () => {
const spaceIds = ['ground', 'upstairs'];
assert.deepEqual(resolveFixedFloor({ spaceIds, hasFloor: false }), { kind: 'absent' });
assert.deepEqual(resolveFixedFloor({ spaceIds, hasFloor: true, floor: 'upstairs' }), {
kind: 'valid', id: 'upstairs', source: 'id',
});
assert.deepEqual(resolveFixedFloor({ spaceIds, hasFloor: true, floor: 0 }), {
kind: 'valid', id: 'ground', source: 'index',
});
assert.deepEqual(resolveFixedFloor({ spaceIds: ['1', 'other'], hasFloor: true, floor: '1' }), {
kind: 'valid', id: '1', source: 'id',
});
});
test('fixed floor rejects invalid values without coercion or fallback', () => {
const spaceIds = ['ground', 'upstairs'];
const cases = [
['', 'empty-id'],
['missing', 'unknown-id'],
[Number.NaN, 'non-finite-index'],
[Number.POSITIVE_INFINITY, 'non-finite-index'],
[1.5, 'fractional-index'],
[-1, 'negative-index'],
[2, 'out-of-range-index'],
[null, 'invalid-type'],
[true, 'invalid-type'],
[{ id: 'ground' }, 'invalid-type'],
];
for (const [floor, reason] of cases) {
const result = resolveFixedFloor({ spaceIds, hasFloor: true, floor });
assert.equal(result.kind, 'invalid');
assert.equal(result.reason, reason);
}
});
test('initial space follows hash, saved, default and first live precedence', () => {
const base = { spaceIds: ['home', 'upstairs'] };
assert.deepEqual(resolveInitialSpace({
...base, hashSpace: 'upstairs', savedSpace: 'home', defaultSpace: 'home',
}), { id: 'upstairs', source: 'hash' });
assert.deepEqual(resolveInitialSpace({
...base, hashSpace: 'stale', savedSpace: 'upstairs', defaultSpace: 'home',
}), { id: 'upstairs', source: 'saved' });
assert.deepEqual(resolveInitialSpace({
...base, hashSpace: 'stale', savedSpace: 'gone', defaultSpace: 'upstairs',
}), { id: 'upstairs', source: 'default' });
assert.deepEqual(resolveInitialSpace({
...base, hashSpace: 'stale', savedSpace: 'gone', defaultSpace: 'missing',
}), { id: 'home', source: 'first' });
});
test('legacy current id is not a cold-start persistence source', () => {
assert.deepEqual(resolveInitialSpace({
spaceIds: ['home', 'f1'], currentSpace: 'f1', preserveCurrent: false,
}), { id: 'home', source: 'first' });
assert.deepEqual(resolveInitialSpace({
spaceIds: ['home', 'upstairs'], currentSpace: 'f1', preserveCurrent: true,
}), { id: 'home', source: 'first' });
});
test('a new explicit hash wins once, then adopted navigation is preserved', () => {
assert.deepEqual(resolveInitialSpace({
spaceIds: ['home', 'upstairs'], currentSpace: 'upstairs', preserveCurrent: true,
savedSpace: 'home', defaultSpace: 'home',
}), { id: 'upstairs', source: 'current' });
assert.deepEqual(resolveInitialSpace({
spaceIds: ['home', 'upstairs'], hashSpace: 'home', currentSpace: 'upstairs',
preserveCurrent: true, savedSpace: 'upstairs',
}), { id: 'home', source: 'hash' });
assert.deepEqual(resolveInitialSpace({
spaceIds: ['home', 'upstairs'], hashSpace: 'home', acceptHash: false,
currentSpace: 'upstairs', preserveCurrent: true, savedSpace: 'home',
}), { id: 'upstairs', source: 'current' });
});
test('empty model has no invented selection', () => {
assert.deepEqual(resolveInitialSpace({
spaceIds: [], hashSpace: 'home', savedSpace: 'home', defaultSpace: 'home',
}), { id: null, source: 'none' });
});
test('best-effort optional work starts every attempt and contains rejections', async () => {
const calls = [];
const results = await settleBestEffort([
async () => { calls.push('config'); throw new Error('unauthorized'); },
() => { calls.push('trail'); throw new Error('sync rejection'); },
async () => { calls.push('layout'); return 'subscribed'; },
]);
assert.deepEqual(calls, ['config', 'trail', 'layout']);
assert.deepEqual(results.map((result) => result.status), ['rejected', 'rejected', 'fulfilled']);
assert.equal(results[2].status === 'fulfilled' ? results[2].value : null, 'subscribed');
});