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

131 lines
7.5 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 inboundPage = html.match(/<div class="page-content" id="page-inbound">([\s\S]*?)<!-- ========== PAGE: 头程订单详情/)?.[1] || '';
assert.ok(inboundPage, 'inbound order list should exist');
assert.match(inboundPage, /onclick="openInboundBatchOrder\(\)"[^>]*>[\s\S]*?批量下单<\/button>/);
assert.doesNotMatch(inboundPage, /导出订单尾程信息/);
assert.match(inboundPage, /class="filter-item inbound-destination-filter"[\s\S]*?id="inbound-filter-destination-type"[\s\S]*?onclick="filterInboundOrders\(\)"[\s\S]*?>查询<\/button>/);
const modalStart = html.indexOf('<div class="topup-overlay hidden" id="inbound-batch-order-modal"');
const modalEnd = html.indexOf('<div class="sea-edit-overlay"', modalStart);
const modal = modalStart >= 0 && modalEnd > modalStart ? html.slice(modalStart, modalEnd) : '';
assert.ok(modal, 'batch order modal should exist');
assert.match(modal, /下载模板/);
assert.match(modal, /id="inbound-batch-order-file"[^>]*accept="\.xlsx,\.xls"/);
assert.match(modal, /onclick="submitInboundBatchOrder\(\)"[^>]*>提交订单<\/button>/);
const getTemplateSheets = vm.runInNewContext(`(${extractFunction('getInboundBatchTemplateSheets')})`);
const sheets = getTemplateSheets();
assert.deepEqual(Array.from(sheets, sheet => sheet.name), ['订单信息', '商品信息', '箱子信息']);
assert.deepEqual(Array.from(sheets, sheet => sheet.headers[0]), ['批次编号*', '批次编号*', '批次编号*']);
for (const sheet of sheets) {
const headers = Array.from(sheet.headers);
const firstOptional = headers.findIndex(header => !header.endsWith('*'));
assert.notEqual(firstOptional, -1, `${sheet.name} should include optional fields`);
assert.ok(headers.slice(0, firstOptional).every(header => header.endsWith('*')), `${sheet.name} required fields should come first`);
assert.ok(headers.slice(firstOptional).every(header => !header.endsWith('*')), `${sheet.name} optional fields should follow required fields`);
}
assert.ok(sheets[0].headers.includes('取货方式*'));
assert.ok(sheets[0].headers.includes('目的仓类型*'));
assert.ok(sheets[0].headers.includes('收货仓*'));
assert.ok(sheets[0].headers.includes('渠道*'));
assert.ok(sheets[0].headers.includes('买单/退税*'));
assert.ok(sheets[0].headers.includes('LX入库单号*'));
assert.ok(!sheets[0].headers.includes('一件代发仓*'));
assert.ok(sheets[0].headers.includes('订单备注'));
assert.ok(sheets[1].headers.includes('SKU NO.*'));
assert.ok(sheets[1].headers.includes('中文品名'));
assert.ok(sheets[2].headers.includes('关联 SKU*'));
assert.ok(sheets[2].headers.includes('箱数*'));
assert.ok(sheets[2].headers.includes('总体积(m³)'));
const validateWorkbookData = vm.runInNewContext(`(${extractFunction('validateInboundBatchWorkbookData')})`, {
getInboundBatchTemplateSheets: getTemplateSheets
});
const valid = validateWorkbookData({
订单信息: [sheets[0].headers, sheets[0].headers.map(header => header.endsWith('*') ? '示例值' : '')],
商品信息: [sheets[1].headers, sheets[1].headers.map(header => header.endsWith('*') ? '示例值' : '')],
箱子信息: [sheets[2].headers, sheets[2].headers.map(header => header.endsWith('*') ? '1' : '')]
});
assert.equal(valid.ok, true);
assert.deepEqual(Array.from(valid.counts), [1, 1, 1]);
const invalid = validateWorkbookData({
订单信息: [sheets[0].headers, sheets[0].headers.map(header => header === '订单备注' ? '测试备注' : '')],
商品信息: [sheets[1].headers],
箱子信息: [sheets[2].headers]
});
assert.equal(invalid.ok, false);
assert.match(invalid.message, /订单信息.*第 2 行.*批次编号/);
function makeRow(headers, values) {
return headers.map(header => values[header] || '');
}
const conditionalInvalid = validateWorkbookData({
订单信息: [sheets[0].headers, makeRow(sheets[0].headers, {
'批次编号*':'B001', '取货方式*':'我司提货(有取货费)', '目的仓类型*':'FBA仓', '收货仓*':'义乌仓', '渠道*':'美线快线', '买单/退税*':'买单', 'FBA仓编码*':'ONT8'
})],
商品信息: [sheets[1].headers, makeRow(sheets[1].headers, {'批次编号*':'B001', 'SKU NO.*':'SKU-01'})],
箱子信息: [sheets[2].headers, makeRow(sheets[2].headers, {'批次编号*':'B001', '关联 SKU*':'SKU-01', '箱数*':'2'})]
});
assert.equal(conditionalInvalid.ok, false);
assert.match(conditionalInvalid.message, /提货时间/);
const fulfillmentInvalid = validateWorkbookData({
订单信息: [sheets[0].headers, makeRow(sheets[0].headers, {
'批次编号*':'B002', '取货方式*':'自送货', '目的仓类型*':'一件代发', '收货仓*':'义乌仓', '渠道*':'美线快线', '买单/退税*':'买单', '预计到达时间*':'2026-09-10 10:00'
})],
商品信息: [sheets[1].headers, makeRow(sheets[1].headers, {'批次编号*':'B002', 'SKU NO.*':'SKU-02'})],
箱子信息: [sheets[2].headers, makeRow(sheets[2].headers, {'批次编号*':'B002', '关联 SKU*':'SKU-02', '箱数*':'1'})]
});
assert.equal(fulfillmentInvalid.ok, false);
assert.match(fulfillmentInvalid.message, /LX入库单号/);
const createOrders = vm.runInNewContext(`(${extractFunction('createInboundOrdersFromBatchData')})`);
const orders = createOrders({
订单信息: [sheets[0].headers, makeRow(sheets[0].headers, {
'批次编号*':'B001', '取货方式*':'自送货', '目的仓类型*':'FBA仓', '收货仓*':'义乌仓', '渠道*':'美线快线', '买单/退税*':'买单', '预计到达时间*':'2026-09-10 10:00', 'FBA仓编码*':'ONT8', '订单备注':'测试订单'
})],
商品信息: [sheets[1].headers, makeRow(sheets[1].headers, {'批次编号*':'B001', 'SKU NO.*':'SKU-01'})],
箱子信息: [sheets[2].headers, makeRow(sheets[2].headers, {'批次编号*':'B001', '关联 SKU*':'SKU-01', '箱数*':'2', '总毛重(kg)':'20', '总净重(kg)':'18', '总体积(m³)':'0.2'})]
}, new Date('2026-09-04T12:30:00'));
assert.equal(orders.length, 1);
assert.equal(orders[0].destinationWarehouse, 'ONT8');
assert.equal(orders[0].skus, 'SKU-01');
assert.equal(orders[0].boxes, 2);
assert.equal(orders[0].grossWeight, '20 kg');
assert.equal(orders[0].volume, '0.2 m³');
assert.equal(orders[0].status, '待处理');
const fulfillmentOrders = createOrders({
订单信息: [sheets[0].headers, makeRow(sheets[0].headers, {
'批次编号*':'B003', '取货方式*':'自送货', '目的仓类型*':'一件代发', '收货仓*':'深圳仓', '渠道*':'美线快线', '买单/退税*':'买单', '预计到达时间*':'2026-09-10 10:00', 'LX入库单号*':'LX20260904001'
})],
商品信息: [sheets[1].headers, makeRow(sheets[1].headers, {'批次编号*':'B003', 'SKU NO.*':'SKU-03'})],
箱子信息: [sheets[2].headers, makeRow(sheets[2].headers, {'批次编号*':'B003', '关联 SKU*':'SKU-03', '箱数*':'1'})]
}, new Date('2026-09-04T12:30:00'));
assert.equal(fulfillmentOrders[0].destinationWarehouse, 'LX20260904001');
assert.equal(fulfillmentOrders[0].lxInboundNo, 'LX20260904001');
console.log('inbound batch order requirements: ok');