89 lines
2.4 KiB
JavaScript
89 lines
2.4 KiB
JavaScript
const test = require('node:test');
|
|
const assert = require('node:assert/strict');
|
|
|
|
const {
|
|
validateTaskEnvelope,
|
|
} = require('../erp_task_contract');
|
|
|
|
test('normalizes a ready team-single task to erp-task-v1', () => {
|
|
const result = validateTaskEnvelope({
|
|
status: 'ready',
|
|
operation: 'create_order',
|
|
route: 'team_single',
|
|
task: {
|
|
operation: 'create_order',
|
|
route: 'team_single',
|
|
fields: { productName: '遇见老挝' },
|
|
originalText: '团队-单个下单',
|
|
},
|
|
});
|
|
|
|
assert.equal(result.valid, true);
|
|
assert.equal(result.task.schemaVersion, 'erp-task-v1');
|
|
});
|
|
|
|
test('rejects create tasks without a route', () => {
|
|
const result = validateTaskEnvelope({
|
|
status: 'ready',
|
|
operation: 'create_order',
|
|
task: { operation: 'create_order', fields: {} },
|
|
});
|
|
|
|
assert.equal(result.valid, false);
|
|
assert.equal(result.status, 'invalid_task');
|
|
assert.match(result.violations.join('\n'), /route/i);
|
|
});
|
|
|
|
test('rejects update tasks without an identifier', () => {
|
|
const result = validateTaskEnvelope({
|
|
status: 'ready',
|
|
operation: 'update_order',
|
|
task: { operation: 'update_order', updatePlan: { status: 'ready', actions: [] } },
|
|
});
|
|
|
|
assert.equal(result.valid, false);
|
|
assert.match(result.violations.join('\n'), /identifier/i);
|
|
});
|
|
|
|
test('rejects unsupported export types', () => {
|
|
const result = validateTaskEnvelope({
|
|
status: 'ready',
|
|
operation: 'export_confirmation',
|
|
task: {
|
|
operation: 'export_confirmation',
|
|
identifier: 'LW-270520A-A',
|
|
exportTypes: ['unknown-artifact'],
|
|
},
|
|
});
|
|
|
|
assert.equal(result.valid, false);
|
|
assert.match(result.violations.join('\n'), /exportTypes/i);
|
|
});
|
|
|
|
test('normalizes legacy confirmation export aliases', () => {
|
|
const result = validateTaskEnvelope({
|
|
status: 'ready',
|
|
operation: 'export_confirmation',
|
|
task: {
|
|
operation: 'export_confirmation',
|
|
identifier: 'D14079',
|
|
exportTypes: ['confirmation'],
|
|
},
|
|
});
|
|
|
|
assert.equal(result.valid, true);
|
|
assert.deepEqual(result.task.exportTypes, ['xingyou-confirm']);
|
|
});
|
|
|
|
test('accepts a non-ready adapter result without making it executable', () => {
|
|
const result = validateTaskEnvelope({
|
|
status: 'needs_clarification',
|
|
route: 'team_single',
|
|
task: null,
|
|
});
|
|
|
|
assert.equal(result.valid, false);
|
|
assert.equal(result.executable, false);
|
|
assert.equal(result.status, 'needs_clarification');
|
|
});
|