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

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