Codetreffer ueberstimmt keinen Widerspruch der technischen Angaben mehr
Ein gelesener Rohcode ist nicht garantiert eine Teilenummer: teilen sich zwei technisch verschiedene Module z.B. denselben Los-Tag, hat der bisherige Codeabgleich sie ohne Rueckfrage auf denselben Stapel gezogen. proposeAssignment verlangt fuer einen Codekandidaten jetzt zusaetzlich specsCompatible; widerspricht der einzige Treffer, faellt die Zuordnung auf den Vergleich der technischen Angaben zurueck und im Zweifel auf einen eigenen Stapel. TDD: Test zuerst rot gesehen (Los-Tag-Fall aus der Beanstandung), dann die Filterung ergaenzt.
This commit is contained in:
+54
-1
@@ -1,6 +1,6 @@
|
||||
import { test } from 'node:test';
|
||||
import assert from 'node:assert/strict';
|
||||
import { emptySpec } from '../src/spec.js';
|
||||
import { emptySpec, specsCompatible } from '../src/spec.js';
|
||||
import {
|
||||
createSession, proposeAssignment, commitAssignment,
|
||||
undoLast, moveEntry, removeEntry,
|
||||
@@ -241,6 +241,59 @@ test('ein Stapel sammelt unterschiedliche Codes ueber mehrere Scans hinweg', ()
|
||||
assert.deepEqual([...stackA.codes].sort(), ['CODE-1', 'CODE-2']);
|
||||
});
|
||||
|
||||
// --- Fehler 1: ein Codetreffer darf einen Widerspruch der Angaben nicht ueberstimmen ---
|
||||
|
||||
test('Codetreffer mit widersprechenden technischen Angaben ist kein Kandidat (geteilter Los-Tag statt Teilenummer)', () => {
|
||||
const session = createSession();
|
||||
// Modul 1: Samsung 64GB LRDIMM, Etikett traegt zusaetzlich einen Los-Tag.
|
||||
const modul1 = { ...emptySpec(), capacityGb: 64, formFactor: 'LRDIMM' };
|
||||
commitAssignment(session, modul1, 'barcode', 'A', ['LOS-2024-07']);
|
||||
|
||||
// Modul 2: Samsung 64GB RDIMM (andere Bauform!), aber derselbe Los-Tag,
|
||||
// weil beide Etiketten aus derselben Fertigungscharge stammen.
|
||||
const modul2 = { ...emptySpec(), capacityGb: 64, formFactor: 'RDIMM' };
|
||||
assert.equal(specsCompatible(modul1, modul2), false, 'Vorbedingung: die Bauformen widersprechen sich');
|
||||
|
||||
const plan = proposeAssignment(session, modul2, ['LOS-2024-07']);
|
||||
assert.notEqual(plan.stackId, 'A', 'ein RDIMM darf trotz geteiltem Los-Tag nicht auf den LRDIMM-Stapel A');
|
||||
assert.equal(plan.kind, 'new', 'ohne vertraeglichen Kandidaten faellt das Modul auf einen eigenen Stapel zurueck');
|
||||
});
|
||||
|
||||
// --- Fehler 2: eine Korrektur (Umsortieren/Entfernen) muss den Code am alten Stapel entfernen ---
|
||||
|
||||
test('nach moveEntry zieht der Code des umsortierten Eintrags den alten Stapel nicht mehr an', () => {
|
||||
const session = createSession();
|
||||
const a = commitAssignment(session, emptySpec(), 'barcode', 'A', ['CODE-X']);
|
||||
// Ein zweiter Eintrag mit anderem Code haelt Stapel A am Leben, damit der
|
||||
// Test tatsaechlich prueft, dass CODE-X verschwindet - nicht nur, dass ein
|
||||
// leerer Stapel entfernt wurde.
|
||||
commitAssignment(session, emptySpec(), 'barcode', 'A', ['CODE-Y']);
|
||||
|
||||
moveEntry(session, a.entryId, 'B');
|
||||
|
||||
const stackA = session.stacks.find((s) => s.id === 'A');
|
||||
assert.ok(stackA, 'Stapel A bleibt bestehen (der zweite Eintrag mit CODE-Y haengt noch dort)');
|
||||
assert.deepEqual(stackA.codes, ['CODE-Y'], 'CODE-X darf nach dem Umsortieren nicht mehr zu Stapel A gehoeren');
|
||||
|
||||
const plan = proposeAssignment(session, emptySpec(), ['CODE-X']);
|
||||
assert.notEqual(plan.stackId, 'A', 'ein neues Modul mit CODE-X darf Stapel A nicht mehr an sich ziehen');
|
||||
});
|
||||
|
||||
test('nach removeEntry zieht der Code des entfernten Eintrags den alten Stapel nicht mehr an', () => {
|
||||
const session = createSession();
|
||||
const a = commitAssignment(session, emptySpec(), 'barcode', 'A', ['CODE-X']);
|
||||
commitAssignment(session, emptySpec(), 'barcode', 'A', ['CODE-Y']);
|
||||
|
||||
removeEntry(session, a.entryId);
|
||||
|
||||
const stackA = session.stacks.find((s) => s.id === 'A');
|
||||
assert.ok(stackA, 'Stapel A bleibt bestehen (der zweite Eintrag mit CODE-Y haengt noch dort)');
|
||||
assert.deepEqual(stackA.codes, ['CODE-Y'], 'CODE-X darf nach dem Entfernen nicht mehr zu Stapel A gehoeren');
|
||||
|
||||
const plan = proposeAssignment(session, emptySpec(), ['CODE-X']);
|
||||
assert.notEqual(plan.stackId, 'A', 'ein neues Modul mit CODE-X darf Stapel A nicht mehr an sich ziehen');
|
||||
});
|
||||
|
||||
test('undoLast-Vertrag: nach einem Umsortieren wird weiterhin der zuletzt erfasste Eintrag zurueckgenommen', () => {
|
||||
const session = createSession();
|
||||
const a = scan(session, s64());
|
||||
|
||||
Reference in New Issue
Block a user