126 lines
5.8 KiB
JavaScript
126 lines
5.8 KiB
JavaScript
const assert = require('node:assert/strict');
|
|
const fs = require('node:fs');
|
|
const vm = require('node:vm');
|
|
|
|
const html = fs.readFileSync('workbench.html', 'utf8');
|
|
|
|
function extractFunction(name) {
|
|
const start = html.indexOf(`function ${name}(`);
|
|
assert.notEqual(start, -1, `${name} should exist`);
|
|
const bodyStart = html.indexOf('{', start);
|
|
let depth = 0;
|
|
for (let index = bodyStart; index < html.length; index += 1) {
|
|
if (html[index] === '{') depth += 1;
|
|
if (html[index] === '}') depth -= 1;
|
|
if (depth === 0) return html.slice(start, index + 1);
|
|
}
|
|
throw new Error(`Unable to extract ${name}`);
|
|
}
|
|
|
|
const createPage = html.match(/<div class="page-content" id="page-storage-transfer-create">([\s\S]*?)<!-- ========== PAGE: 仓储转运单详情/)?.[1] || '';
|
|
const editModal = html.match(/<div class="modal-overlay" id="storage-transfer-edit-modal"([\s\S]*?)<!-- ========== MODAL:/)?.[1] || '';
|
|
assert.ok(editModal, 'storage transfer edit modal should exist');
|
|
|
|
const fieldNames = source => Array.from(source.matchAll(/\bname="([^"]+)"/g), match => match[1]).sort();
|
|
assert.deepEqual(fieldNames(editModal), fieldNames(createPage), 'edit modal should expose the same fields as create order');
|
|
|
|
const tbody = { innerHTML: '' };
|
|
const controls = {
|
|
'storage-transfer-list-body': tbody,
|
|
'storage-transfer-total': { textContent: '' },
|
|
'storage-transfer-page-number': { textContent: '' },
|
|
'storage-transfer-prev': { disabled: false },
|
|
'storage-transfer-next': { disabled: false }
|
|
};
|
|
const renderStorageTransferList = vm.runInNewContext(
|
|
`(${extractFunction('renderStorageTransferList')})`,
|
|
{
|
|
document: { getElementById: id => controls[id] || null },
|
|
storageTransferFilteredOrders: null,
|
|
loadStorageTransferOrders: () => [{
|
|
id: 'order-1', orderNo: 'ZY001', inboundNo: 'RK001', boxCount: 2,
|
|
warehouse: '美西洛杉矶仓', fbaCode: 'ONT8', shipmentId: 'FBA001',
|
|
deliveryMethod: '卡车派送', relabel: 'yes', tailOrderNo: 'LC001',
|
|
relabelOrderNo: 'HB001', status: '待处理', createdAt: '2026-09-04 09:00'
|
|
}],
|
|
STORAGE_TRANSFER_PAGE_SIZE: 10,
|
|
storageTransferCurrentPage: 1,
|
|
escapeStorageTransferHtml: value => String(value == null ? '' : value)
|
|
}
|
|
);
|
|
renderStorageTransferList();
|
|
assert.match(tbody.innerHTML, />查看<\/button>[\s\S]*?>编辑<\/button>/, 'each row should show edit after view');
|
|
assert.match(tbody.innerHTML, /openStorageTransferEdit\(this\.dataset\.storageTransferId\)/);
|
|
|
|
const mergeStorageTransferOrder = vm.runInNewContext(`(${extractFunction('mergeStorageTransferOrder')})`);
|
|
const original = {
|
|
id: 'order-1', orderNo: 'ZY001', tailOrderNo: 'LC001', relabelOrderNo: '',
|
|
status: '处理中', createdAt: '2026-09-01 08:00', cargo: [{ sku: 'KEEP' }],
|
|
inboundNo: 'OLD', fbaCode: 'OLD1', relabel: 'no'
|
|
};
|
|
const updated = mergeStorageTransferOrder(original, {
|
|
inboundNo: 'RK009', warehouse: '美东新泽西仓', fbaCode: 'ABE8',
|
|
address: 'New address', boxCount: 9, deliveryMethod: '快递派送',
|
|
expectedArrival: '2026-09-10T10:30', shipmentId: 'FBA009', trackingId: '1Z009',
|
|
boxId: 'B001-B009', note: 'updated', relabel: 'yes',
|
|
relabelRequirement: 'Case2', relabelCartonLabel: '', relabelSkuLabel: 'sku-new.pdf',
|
|
relabelRelationFile: '关联明细.xlsx', relabelRemark: '优先处理 A 箱',
|
|
relabelOrderNo: 'HB009'
|
|
});
|
|
assert.deepEqual(JSON.parse(JSON.stringify(updated)), {
|
|
id: 'order-1', orderNo: 'ZY001', tailOrderNo: 'LC001', relabelOrderNo: 'HB009',
|
|
status: '处理中', createdAt: '2026-09-01 08:00', cargo: [{ sku: 'KEEP' }],
|
|
inboundNo: 'RK009', warehouse: '美东新泽西仓', fbaCode: 'ABE8',
|
|
address: 'New address', boxCount: 9, deliveryMethod: '快递派送',
|
|
expectedArrival: '2026-09-10T10:30', shipmentId: 'FBA009', trackingId: '1Z009',
|
|
boxId: 'B001-B009', note: 'updated', relabel: 'yes',
|
|
relabelRequirement: 'Case2', relabelCartonLabel: '', relabelSkuLabel: 'sku-new.pdf',
|
|
relabelRelationFile: '关联明细.xlsx', relabelRemark: '优先处理 A 箱'
|
|
});
|
|
|
|
const getStorageTransferLegacyRelabelFile = vm.runInNewContext(`(${extractFunction('getStorageTransferLegacyRelabelFile')})`);
|
|
const getStorageTransferEditExistingFiles = vm.runInNewContext(
|
|
`(${extractFunction('getStorageTransferEditExistingFiles')})`,
|
|
{ getStorageTransferLegacyRelabelFile }
|
|
);
|
|
assert.deepEqual(
|
|
JSON.parse(JSON.stringify(getStorageTransferEditExistingFiles({
|
|
relabel: 'yes', relabelRequirement: 'Case2', cargo: [{ fileName: 'legacy-sku.pdf' }]
|
|
}, 'Case2'))),
|
|
{ carton: '', sku: 'legacy-sku.pdf' },
|
|
'legacy Case2 files should refill the SKU upload instead of the carton upload'
|
|
);
|
|
assert.deepEqual(
|
|
JSON.parse(JSON.stringify(getStorageTransferEditExistingFiles({
|
|
relabel: 'yes', relabelRequirement: 'Case1', relabelCartonLabel: 'carton.pdf', relabelSkuLabel: 'old-sku.pdf'
|
|
}, 'Case1'))),
|
|
{ carton: 'carton.pdf', sku: 'old-sku.pdf' },
|
|
'explicit stored files should win over legacy cargo data'
|
|
);
|
|
|
|
let filterCalls = 0;
|
|
let renderCalls = 0;
|
|
const refreshContext = {
|
|
document: { getElementById: id => ({ value: id === 'storage-transfer-filter-status' ? '处理中' : '' }) },
|
|
filterStorageTransferOrders: () => { filterCalls += 1; },
|
|
renderStorageTransferList: () => { renderCalls += 1; },
|
|
storageTransferFilteredOrders: [{ id: 'stale' }]
|
|
};
|
|
const refreshStorageTransferListAfterEdit = vm.runInNewContext(
|
|
`(${extractFunction('refreshStorageTransferListAfterEdit')})`,
|
|
refreshContext
|
|
);
|
|
refreshStorageTransferListAfterEdit();
|
|
assert.equal(filterCalls, 1, 'saving under an active filter should reapply that filter');
|
|
assert.equal(renderCalls, 0);
|
|
|
|
filterCalls = 0;
|
|
renderCalls = 0;
|
|
refreshContext.document.getElementById = () => ({ value: '' });
|
|
refreshStorageTransferListAfterEdit();
|
|
assert.equal(filterCalls, 0);
|
|
assert.equal(renderCalls, 1, 'saving without filters should render the full list');
|
|
assert.equal(refreshContext.storageTransferFilteredOrders, null);
|
|
|
|
console.log('storage transfer edit: ok');
|