summaryrefslogtreecommitdiff
path: root/web/test/tasks-board.test.mjs
diff options
context:
space:
mode:
Diffstat (limited to 'web/test/tasks-board.test.mjs')
-rw-r--r--web/test/tasks-board.test.mjs22
1 files changed, 22 insertions, 0 deletions
diff --git a/web/test/tasks-board.test.mjs b/web/test/tasks-board.test.mjs
index db61880..1e35e18 100644
--- a/web/test/tasks-board.test.mjs
+++ b/web/test/tasks-board.test.mjs
@@ -11,6 +11,7 @@ import {
columnForTaskState,
groupTasksByColumn,
createTaskCard,
+ cardContentSignature,
} from '../app.js';
describe('columnForTaskState', () => {
@@ -227,3 +228,24 @@ describe('createTaskCard elapsed timer', () => {
assert.equal(ready.querySelector('.task-elapsed[data-started-at]'), null);
});
});
+
+// ── renderTasksIntoContainer: log-tail preservation across re-renders ──────
+
+describe('cardContentSignature', () => {
+ it('excludes .task-log-tail content from the signature', () => {
+ const doc = makeMockDoc();
+ const cardA = createTaskCard({ id: 't1', name: 'Task', state: 'READY' }, doc);
+ const cardB = createTaskCard({ id: 't1', name: 'Task', state: 'READY' }, doc);
+ // Simulate cardB having accumulated live log lines that cardA (freshly built) doesn't have.
+ const tailB = cardB.querySelector('.task-log-tail');
+ tailB.children.push({ tag: 'div', className: 'log-line', textContent: 'some streamed output', children: [] });
+ assert.equal(cardContentSignature(cardA), cardContentSignature(cardB));
+ });
+
+ it('still differs when a non-log field changes', () => {
+ const doc = makeMockDoc();
+ const cardA = createTaskCard({ id: 't1', name: 'Task', state: 'READY' }, doc);
+ const cardB = createTaskCard({ id: 't1', name: 'Task', state: 'FAILED' }, doc);
+ assert.notEqual(cardContentSignature(cardA), cardContentSignature(cardB));
+ });
+});