const { readFileSync } = require('node:fs');
|
const { resolve } = require('node:path');
|
const { test } = require('node:test');
|
const assert = require('node:assert/strict');
|
const runtimeSource = readFileSync(resolve(__dirname, '../../main/resources/forms/revision-edit/runtime.js'), 'utf8');
|
const authorize = eval(runtimeSource);
|
test('platform runtime uses ordinary functions and Promise chains only', () => {
|
assert.doesNotMatch(runtimeSource, /\b(async|await)\b/);
|
assert.equal(Object.prototype.toString.call(authorize), '[object Function]');
|
});
|
function fixture() {
|
const file = { fileId: 'main', name: 'main.docx' };
|
const formData = { xiuding_shenqing_zixiang_id: 'source', yuan_wenjian_banben_id: 'v1', wenjian: [file],
|
jilu_mingxi: [{ yuan_wenjian_banben_id: 'v2', jilu_wenjian: JSON.stringify([{ fileId: 'record', name: 'record.docx' }]) }] };
|
const messages = [];
|
const args = { data: { xiuding_shenqing_zixiang_id: 'source' }, formData,
|
setFormData(field, value, index) {
|
if (field.includes('.')) formData.jilu_mingxi[index].jilu_wenjian = value; else formData[field] = value;
|
}, onlineUtils: { toast: message => messages.push(message) } };
|
const result = { data: [
|
{ versionId: 'v1', parentField: '', field: 'wenjian', files: [{ ...file, revisionEditReceipt: 'main-grant' }] },
|
{ versionId: 'v2', parentField: 'jilu_mingxi', field: 'jilu_wenjian', files: [{ fileId: 'record', revisionEditReceipt: 'record-grant' }] },
|
] };
|
return { args, formData, result, messages };
|
}
|
test('main and record receive grants without saving the business form', async () => {
|
const f = fixture(); f.args.onlineUtils.request = async (url, method, body) => {
|
assert.equal(url, '/api/dms/revision-edit/prepare'); assert.deepEqual(body, { modelId: 'model', sourceItemId: 'source' }); return f.result;
|
};
|
await authorize(f.args, 'model');
|
assert.equal(f.formData.wenjian[0].revisionEditReceipt, 'main-grant');
|
assert.equal(f.formData.jilu_mingxi[0].jilu_wenjian[0].revisionEditReceipt, 'record-grant');
|
assert.equal(Object.keys(f.formData).some(key => key.includes('authorization')), false);
|
});
|
test('late authorization cannot overwrite replacement or a different source', async () => {
|
for (const change of [f => { f.formData.wenjian = []; }, f => { f.formData.xiuding_shenqing_zixiang_id = 'other'; }, f => { f.formData.id = 'saved'; }]) {
|
const f = fixture(); let finish; f.args.onlineUtils.request = () => new Promise(resolve => { finish = resolve; });
|
const pending = authorize(f.args, 'model'); change(f); const expected = JSON.stringify(f.formData); finish(f.result); await pending;
|
assert.equal(JSON.stringify(f.formData), expected); assert.equal(f.messages.length, 0);
|
}
|
});
|
test('a mismatched child prevents partial main authorization', async () => {
|
const f = fixture(); f.result.data[1].versionId = 'wrong'; f.args.onlineUtils.request = async () => f.result;
|
const before = JSON.stringify(f.formData); await authorize(f.args, 'model');
|
assert.equal(JSON.stringify(f.formData), before); assert.equal(f.messages.length, 1);
|
});
|
test('clearing selection invalidates an in-flight grant even when values return to original', async () => {
|
const f = fixture(); let finish; f.args.onlineUtils.request = () => new Promise(resolve => { finish = resolve; });
|
const pending = authorize(f.args, 'model'); f.args.data = {}; await authorize(f.args, 'model');
|
finish(f.result); await pending; assert.equal(f.formData.wenjian[0].revisionEditReceipt, undefined);
|
});
|
test('native row normalization and display edits keep grants bound to current files', async () => {
|
const f = fixture(); let finish;
|
f.args.onlineUtils.request = () => new Promise(resolve => { finish = resolve; });
|
const pending = authorize(f.args, 'model');
|
const row = f.formData.jilu_mingxi[0];
|
row.jnpfId = 'native-row'; row.jilu_bianhao_xianshi = '-R01'; row.fujian_mingcheng = 'Edited title';
|
row.jilu_wenjian = JSON.parse(row.jilu_wenjian);
|
finish(f.result); await pending;
|
assert.equal(f.formData.wenjian[0].revisionEditReceipt, 'main-grant');
|
assert.equal(row.jilu_wenjian[0].revisionEditReceipt, 'record-grant');
|
assert.equal(row.fujian_mingcheng, 'Edited title');
|
});
|
test('changed child file, version, removal or receipt rejects late authorization', async () => {
|
for (const change of [
|
row => { row.jilu_wenjian = [{fileId:'replacement',name:'other.docx'}]; },
|
row => { row.yuan_wenjian_banben_id = 'different-version'; },
|
row => { row.jilu_wenjian = []; },
|
row => { row.jilu_wenjian = [{fileId:'record',name:'record.docx',uploadReceipt:'new-grant'}]; },
|
]) {
|
const f = fixture(); let finish;
|
f.args.onlineUtils.request = () => new Promise(resolve => { finish = resolve; });
|
const pending = authorize(f.args, 'model'); change(f.formData.jilu_mingxi[0]);
|
const expected = JSON.stringify(f.formData); finish(f.result); await pending;
|
assert.equal(JSON.stringify(f.formData), expected);
|
assert.equal(f.messages.length, 0);
|
}
|
});
|