刘光辉
4 小时以前 06f314545ac3514d7ce28939920866ae8188d31c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
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);
  }
});