99 lines
5.1 KiB
JavaScript
99 lines
5.1 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 editModal = html.match(/<div class="modal-overlay" id="return-relabel-edit-modal"([\s\S]*?)<!-- ========== MODAL:/)?.[1] || '';
|
|
assert.ok(editModal, '退货换标编辑弹框 should exist');
|
|
assert.match(editModal, /onsubmit="submitReturnRelabelEdit\(event\)"/);
|
|
for (const field of ['sourceFba', 'reason', 'carrier', 'trackingNo', 'returnRemark', 'relabel', 'labelCase', 'cartonLabel', 'skuLabel', 'destinationFba', 'address', 'expectedArrival', 'tailRemark']) {
|
|
assert.match(editModal, new RegExp(`name="${field}"`), `edit modal should include ${field}`);
|
|
}
|
|
assert.match(editModal, /id="return-relabel-edit-sku-body"/);
|
|
assert.match(editModal, /id="return-relabel-edit-error"/);
|
|
assert.match(editModal, /当前文件/);
|
|
|
|
const tbody = { innerHTML: '' };
|
|
const controls = {
|
|
'return-relabel-list-body': tbody,
|
|
'return-relabel-total': { textContent: '' },
|
|
'return-relabel-page-number': { textContent: '' },
|
|
'return-relabel-prev': { disabled: false },
|
|
'return-relabel-next': { disabled: false }
|
|
};
|
|
const renderReturnRelabelList = vm.runInNewContext(
|
|
`(${extractFunction('renderReturnRelabelList')})`,
|
|
{
|
|
document: { getElementById: id => controls[id] || null },
|
|
returnRelabelFilteredOrders: null,
|
|
loadReturnRelabelOrders: () => [{
|
|
id: 'order-1', orderNo: 'THHB001', sourceFba: 'ONT8', destinationFba: 'LAX9',
|
|
relabel: true, labelCase: 'Case1', backendTailOrderNo: 'LC001',
|
|
backendRelabelOrderNo: 'HB001', relabelStatus: '待换标', tailStatus: '待入库',
|
|
createdAt: '2026-09-04 09:00', skus: [{ sku: 'SKU-1', quantity: 2 }]
|
|
}],
|
|
RETURN_RELABEL_PAGE_SIZE: 10,
|
|
returnRelabelCurrentPage: 1,
|
|
returnRelabelLabelText: () => '换箱唛',
|
|
escapeReturnRelabelHtml: value => String(value == null ? '' : value)
|
|
}
|
|
);
|
|
renderReturnRelabelList();
|
|
assert.match(tbody.innerHTML, />查看<\/button>[\s\S]*?>编辑<\/button>/, '编辑 should follow 查看');
|
|
assert.match(tbody.innerHTML, /openReturnRelabelEdit\(this\.dataset\.returnRelabelEditId\)/);
|
|
|
|
const mergeReturnRelabelOrder = vm.runInNewContext(`(${extractFunction('mergeReturnRelabelOrder')})`);
|
|
const original = {
|
|
id: 'order-1', orderNo: 'THHB001', backendTailOrderNo: 'LC001', backendRelabelOrderNo: 'HB001',
|
|
relabelStatus: '换标中', tailStatus: '待入库', createdAt: '2026-09-01 08:00',
|
|
sourceFba: 'ONT8', carrier: 'UPS', cartonLabel: 'old-carton.pdf', skuLabel: ''
|
|
};
|
|
const updated = mergeReturnRelabelOrder(original, {
|
|
sourceFba: 'ABE8', destinationFba: 'ONT8', reason: '客户退货', carrier: 'FedEx',
|
|
trackingNo: 'NEW-TRACK', returnRemark: '已更新', relabel: true, labelCase: 'Case3',
|
|
cartonLabel: 'old-carton.pdf', skuLabel: 'new-sku.pdf', address: 'New address',
|
|
expectedArrival: '2026-09-10T10:30', tailRemark: 'new remark',
|
|
skus: [{ sku: 'SKU-2', name: '新品', fnsku: 'FN-2', newSku: 'NEW-2', quantity: 5 }]
|
|
});
|
|
assert.deepEqual(JSON.parse(JSON.stringify(updated)), {
|
|
id: 'order-1', orderNo: 'THHB001', backendTailOrderNo: 'LC001', backendRelabelOrderNo: 'HB001',
|
|
relabelStatus: '换标中', tailStatus: '待入库', createdAt: '2026-09-01 08:00',
|
|
sourceFba: 'ABE8', destinationFba: 'ONT8', reason: '客户退货', carrier: 'FedEx',
|
|
trackingNo: 'NEW-TRACK', returnRemark: '已更新', relabel: true, labelCase: 'Case3',
|
|
cartonLabel: 'old-carton.pdf', skuLabel: 'new-sku.pdf', address: 'New address',
|
|
expectedArrival: '2026-09-10T10:30', tailRemark: 'new remark',
|
|
skus: [{ sku: 'SKU-2', name: '新品', fnsku: 'FN-2', newSku: 'NEW-2', quantity: 5 }]
|
|
});
|
|
|
|
const saved = [];
|
|
const storageContext = {
|
|
localStorage: {
|
|
getItem: () => JSON.stringify([{ id: 'return-relabel-seed-1', orderNo: 'EDITED', skus: [{ sku: 'SKU', name: '商品', fnsku: 'FN', quantity: 1 }] }]),
|
|
setItem: (_key, value) => saved.push(JSON.parse(value))
|
|
},
|
|
RETURN_RELABEL_KEY: 'key',
|
|
RETURN_RELABEL_SEED: [{ id: 'return-relabel-seed-1', orderNo: 'SEED', skus: [{ sku: 'SKU', name: '商品', fnsku: 'FN', quantity: 1 }] }],
|
|
showToast() {}
|
|
};
|
|
const loadReturnRelabelOrders = vm.runInNewContext(`(${extractFunction('loadReturnRelabelOrders')})`, storageContext);
|
|
const saveReturnRelabelOrders = vm.runInNewContext(`(${extractFunction('saveReturnRelabelOrders')})`, storageContext);
|
|
assert.equal(loadReturnRelabelOrders()[0].orderNo, 'EDITED', 'saved seed override should win');
|
|
assert.equal(saveReturnRelabelOrders([{ id: 'return-relabel-seed-1', orderNo: 'EDITED', skus: [] }]), true);
|
|
assert.equal(saved[0][0].id, 'return-relabel-seed-1', 'seed edits should be persisted');
|
|
|
|
console.log('return relabel edit: ok');
|