Files
docs/悦/官网头程下单/tests/storage-transfer-edit.test.js
T
2026-09-08 18:17:00 +08:00

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');