Files
MBN_STOCK_WEBVIEW/tests/LegacyParityWeb/legacy-named-playlist-selection.test.cjs

109 lines
3.3 KiB
JavaScript

"use strict";
const test = require("node:test");
const assert = require("node:assert/strict");
const selection = require("../../src/MBN_STOCK_WEBVIEW.LegacyParityApp/Web/legacy-named-playlist-selection.js");
const first = "named-definition-first";
const second = "named-definition-second";
test("a second-row click blocks actions until native state selects that exact row", () => {
const workflow = selection.create();
const started = workflow.begin(second, first, "named-ui-1", 1);
assert.deepEqual(started, {
accepted: true,
shouldSend: true,
definitionId: second,
requestId: "named-ui-1"
});
assert.equal(workflow.isPending(), true);
assert.equal(workflow.pendingDefinitionId(), second);
assert.deepEqual(workflow.reconcile({
sequence: 1,
command: "refresh-named-playlists",
targetId: "named-ui-old",
succeeded: true
}, first), {
completed: false,
succeeded: false,
deferredAction: null
});
assert.equal(workflow.isPending(), true);
const completed = workflow.reconcile({
sequence: 1,
command: "select-named-playlist",
targetId: "named-ui-1",
succeeded: true
}, second);
assert.equal(completed.completed, true);
assert.equal(completed.succeeded, true);
assert.equal(workflow.isPending(), false);
});
test("repeated click and double click queue one exact action without a duplicate select", () => {
const workflow = selection.create();
assert.equal(workflow.begin(second, first, "named-ui-2", 2).shouldSend, true);
const repeated = workflow.begin(second, first);
const deferred = Object.freeze({ definitionId: second, mode: "save" });
assert.equal(repeated.accepted, true);
assert.equal(repeated.shouldSend, false);
assert.equal(repeated.requestId, "named-ui-2");
assert.equal(workflow.defer(second, deferred), true);
const completed = workflow.reconcile({
sequence: 2,
command: "select-named-playlist",
targetId: "named-ui-2",
succeeded: true
}, second);
assert.deepEqual(completed.deferredAction, deferred);
assert.equal(completed.succeeded, true);
});
test("a failed native selection clears the lock and discards the deferred mutation", () => {
const workflow = selection.create();
workflow.begin(second, first, "named-ui-3", 3);
workflow.defer(second, { definitionId: second, mode: "load" });
const failed = workflow.reconcile({
sequence: 3,
command: "select-named-playlist",
targetId: "named-ui-3",
succeeded: false
}, first);
assert.deepEqual(failed, {
completed: true,
succeeded: false,
deferredAction: null
});
assert.equal(workflow.isPending(), false);
});
test("an already selected row never creates a pending native request", () => {
const workflow = selection.create();
const current = workflow.begin(first, first);
assert.equal(current.accepted, true);
assert.equal(current.shouldSend, false);
assert.equal(current.requestId, null);
assert.equal(workflow.isPending(), false);
});
test("a different row cannot replace an in-flight selection target", () => {
const workflow = selection.create();
workflow.begin(second, first, "named-ui-4", 4);
const conflicting = workflow.begin(first, first);
assert.equal(conflicting.accepted, false);
assert.equal(conflicting.shouldSend, false);
assert.equal(workflow.pendingDefinitionId(), second);
});