95 lines
2.9 KiB
JavaScript
95 lines
2.9 KiB
JavaScript
import test from 'node:test'
|
|
import assert from 'node:assert/strict'
|
|
import { readFile } from 'node:fs/promises'
|
|
|
|
const source = await readFile(new URL('../utils/picking-state.js', import.meta.url), 'utf8')
|
|
const state = await import(`data:text/javascript;base64,${Buffer.from(source).toString('base64')}`)
|
|
|
|
const items = [{ id: 1 }, { id: 2 }, { id: 3 }]
|
|
|
|
test('createItemStates initializes every item as pending', () => {
|
|
assert.deepEqual(state.createItemStates(items), {
|
|
1: state.ITEM_STATUS.PENDING,
|
|
2: state.ITEM_STATUS.PENDING,
|
|
3: state.ITEM_STATUS.PENDING,
|
|
})
|
|
})
|
|
|
|
test('getPickSummary disables submit before any effective pick', () => {
|
|
const summary = state.getPickSummary(items, {
|
|
1: state.ITEM_STATUS.SKIPPED,
|
|
2: state.ITEM_STATUS.PENDING,
|
|
3: state.ITEM_STATUS.PENDING,
|
|
})
|
|
|
|
assert.equal(summary.canSubmit, false)
|
|
assert.equal(summary.buttonText, '提交拣货完成')
|
|
assert.equal(summary.progress, 33)
|
|
})
|
|
|
|
test('getPickSummary enables early submit after a picked item', () => {
|
|
const summary = state.getPickSummary(items, {
|
|
1: state.ITEM_STATUS.PICKED,
|
|
2: state.ITEM_STATUS.PENDING,
|
|
3: state.ITEM_STATUS.PENDING,
|
|
})
|
|
|
|
assert.equal(summary.canSubmit, true)
|
|
assert.equal(summary.buttonText, '提交拣货完成')
|
|
assert.deepEqual(
|
|
{ picked: summary.picked, partial: summary.partial, skipped: summary.skipped, pending: summary.pending },
|
|
{ picked: 1, partial: 0, skipped: 0, pending: 2 },
|
|
)
|
|
})
|
|
|
|
test('getPickSummary enables submit when every item is processed', () => {
|
|
const summary = state.getPickSummary(items, {
|
|
1: state.ITEM_STATUS.SKIPPED,
|
|
2: state.ITEM_STATUS.SKIPPED,
|
|
3: state.ITEM_STATUS.SKIPPED,
|
|
})
|
|
|
|
assert.equal(summary.canSubmit, true)
|
|
assert.equal(summary.buttonText, '提交拣货完成')
|
|
assert.equal(summary.progress, 100)
|
|
})
|
|
|
|
test('submitStates turns only pending items into skipped', () => {
|
|
assert.deepEqual(state.submitStates(items, {
|
|
1: state.ITEM_STATUS.PICKED,
|
|
2: state.ITEM_STATUS.PARTIAL,
|
|
3: state.ITEM_STATUS.PENDING,
|
|
}), {
|
|
states: {
|
|
1: state.ITEM_STATUS.PICKED,
|
|
2: state.ITEM_STATUS.PARTIAL,
|
|
3: state.ITEM_STATUS.SKIPPED,
|
|
},
|
|
autoSkippedIds: [3],
|
|
})
|
|
})
|
|
|
|
test('classifyScan distinguishes pending, repeated, and unknown SKU codes', () => {
|
|
const scanItems = [{ id: 1, sku: 'EL-38201' }, { id: 2, sku: 'EL-38202' }]
|
|
|
|
assert.deepEqual(state.classifyScan(scanItems, {
|
|
1: state.ITEM_STATUS.PICKED,
|
|
2: state.ITEM_STATUS.PENDING,
|
|
}, 'EL-38202'), {
|
|
type: 'pending',
|
|
item: scanItems[1],
|
|
})
|
|
assert.deepEqual(state.classifyScan(scanItems, {
|
|
1: state.ITEM_STATUS.PARTIAL,
|
|
2: state.ITEM_STATUS.PENDING,
|
|
}, 'EL-38201'), {
|
|
type: 'processed',
|
|
item: scanItems[0],
|
|
status: state.ITEM_STATUS.PARTIAL,
|
|
})
|
|
assert.deepEqual(state.classifyScan(scanItems, {}, 'NO-SUCH-SKU'), {
|
|
type: 'unknown',
|
|
item: null,
|
|
})
|
|
})
|