feat: Sitzungsverwaltung mit Stapel-Zuweisung und Ruecknahme
This commit is contained in:
@@ -0,0 +1,104 @@
|
||||
import { test } from 'node:test';
|
||||
import assert from 'node:assert/strict';
|
||||
import { emptySpec } from '../src/spec.js';
|
||||
import {
|
||||
createSession, proposeAssignment, commitAssignment,
|
||||
undoLast, moveEntry, removeEntry,
|
||||
} from '../src/session.js';
|
||||
|
||||
const s64 = () => ({ ...emptySpec(), capacityGb: 64, formFactor: 'LRDIMM', rank: '4DRx4', speed: 'PC4-2400', partNumber: 'M386A8K40BM1-CRC4Y' });
|
||||
const s32 = () => ({ ...emptySpec(), capacityGb: 32, formFactor: 'RDIMM', rank: '2Rx4', speed: 'PC4-2666', partNumber: 'M393A4K40BB1-CTD' });
|
||||
|
||||
function scan(session, spec, source = 'barcode') {
|
||||
const plan = proposeAssignment(session, spec);
|
||||
return commitAssignment(session, spec, source, plan.stackId);
|
||||
}
|
||||
|
||||
test('erster Scan legt Stapel A an', () => {
|
||||
const session = createSession();
|
||||
const plan = proposeAssignment(session, s64());
|
||||
assert.equal(plan.kind, 'new');
|
||||
assert.equal(plan.stackId, 'A');
|
||||
});
|
||||
|
||||
test('gleiches Modul landet auf demselben Stapel', () => {
|
||||
const session = createSession();
|
||||
scan(session, s64());
|
||||
const plan = proposeAssignment(session, s64());
|
||||
assert.equal(plan.kind, 'match');
|
||||
assert.equal(plan.stackId, 'A');
|
||||
});
|
||||
|
||||
test('anderes Modul legt Stapel B an', () => {
|
||||
const session = createSession();
|
||||
scan(session, s64());
|
||||
const plan = proposeAssignment(session, s32());
|
||||
assert.equal(plan.kind, 'new');
|
||||
assert.equal(plan.stackId, 'B');
|
||||
});
|
||||
|
||||
test('eine Verwechslung erzeugt keinen Fast-Duplikat-Stapel', () => {
|
||||
const session = createSession();
|
||||
scan(session, s64());
|
||||
const verrauscht = { ...s64(), partNumber: 'M386A8K4OBM1-CRC4Y' };
|
||||
const plan = proposeAssignment(session, verrauscht);
|
||||
assert.equal(plan.kind, 'match');
|
||||
assert.equal(plan.stackId, 'A');
|
||||
});
|
||||
|
||||
test('Scan ohne Teilenummer bei zwei passenden Stapeln ist mehrdeutig', () => {
|
||||
const session = createSession();
|
||||
scan(session, { ...s64(), partNumber: 'M386A8K40BM1-CRC4Y' });
|
||||
scan(session, { ...s64(), partNumber: 'HMAA8GL7AMR4N-UH' });
|
||||
const ohnePn = { ...s64(), partNumber: null };
|
||||
const plan = proposeAssignment(session, ohnePn);
|
||||
assert.equal(plan.kind, 'ambiguous');
|
||||
assert.deepEqual(plan.candidates, ['A', 'B']);
|
||||
});
|
||||
|
||||
test('commitAssignment zaehlt den Stapel hoch und fuehrt die Liste', () => {
|
||||
const session = createSession();
|
||||
scan(session, s64());
|
||||
scan(session, s64());
|
||||
assert.equal(session.stacks.length, 1);
|
||||
assert.equal(session.stacks[0].count, 2);
|
||||
assert.equal(session.entries.length, 2);
|
||||
});
|
||||
|
||||
test('undoLast nimmt den letzten Eintrag zurueck', () => {
|
||||
const session = createSession();
|
||||
scan(session, s64());
|
||||
scan(session, s64());
|
||||
const entfernt = undoLast(session);
|
||||
assert.equal(entfernt.stackId, 'A');
|
||||
assert.equal(session.stacks[0].count, 1);
|
||||
assert.equal(session.entries.length, 1);
|
||||
});
|
||||
|
||||
test('undoLast entfernt einen leer gewordenen Stapel', () => {
|
||||
const session = createSession();
|
||||
scan(session, s64());
|
||||
undoLast(session);
|
||||
assert.equal(session.stacks.length, 0);
|
||||
assert.equal(undoLast(session), null);
|
||||
});
|
||||
|
||||
test('moveEntry sortiert einen Eintrag um', () => {
|
||||
const session = createSession();
|
||||
const a = scan(session, s64());
|
||||
scan(session, s32());
|
||||
moveEntry(session, a.entryId, 'B');
|
||||
const stapelA = session.stacks.find((s) => s.id === 'A');
|
||||
const stapelB = session.stacks.find((s) => s.id === 'B');
|
||||
assert.equal(stapelA, undefined, 'leerer Stapel wird entfernt');
|
||||
assert.equal(stapelB.count, 2);
|
||||
});
|
||||
|
||||
test('removeEntry entfernt einen einzelnen Eintrag', () => {
|
||||
const session = createSession();
|
||||
const a = scan(session, s64());
|
||||
scan(session, s64());
|
||||
removeEntry(session, a.entryId);
|
||||
assert.equal(session.entries.length, 1);
|
||||
assert.equal(session.stacks[0].count, 1);
|
||||
});
|
||||
Reference in New Issue
Block a user