刘光辉
6 小时以前 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
const { readFileSync } = require('node:fs');
const { join } = require('node:path');
const vm = require('node:vm');
const { test } = require('node:test');
const assert = require('node:assert/strict');
const source = readFileSync(join(__dirname, '../../main/resources/forms/file-size-validation/runtime.js'), 'utf8');
const validate = vm.runInNewContext(source);
const file = (fileSize, name = '文件.docx') => ({ name, fileSize });
const run = formData => {
  const messages = [];
  return { messages, validate: () => validate({ formData, onlineUtils: { toast: (...args) => messages.push(args) } }) };
};
test('blocks a zero-byte main file and names it', () => {
  const check = run({ wenjian: [file(0, '主文档.txt')] });
  assert.throws(check.validate, /主文件“主文档.txt”为空文件(0 字节)/);
  assert.equal(check.messages.length, 1);
  assert.equal(check.messages[0][1], 'warning');
  assert.doesNotMatch(check.messages[0][0], /在线编辑/);
});
test('blocks a later record attachment, including a numeric-string size', () => {
  const check = run({ wenjian: [file(50)], jilu_mingxi: [
    { jilu_wenjian: [file(80)] }, { jilu_wenjian: JSON.stringify([file('0', '记录R02.docx')]) },
  ] });
  assert.throws(check.validate, /第 2 行记录附件“记录R02.docx”为空文件/);
});
test('validates every attachment in an array', () => {
  assert.throws(run({ wenjian: [file(10), file(0, '空附件.docx')] }).validate, /空附件/);
});
test('accepts nonempty main and record files without changing their values', () => {
  const data = { wenjian: JSON.stringify([file('2048')]), jilu_mingxi: [{ jilu_wenjian: [file(1)] }] };
  const before = JSON.stringify(data);
  const check = run(data);
  check.validate();
  assert.deepEqual(check.messages, []);
  assert.equal(JSON.stringify(data), before);
});
test('rechecks the latest saved edit rather than a stale upload/display snapshot', () => {
  const data = { wenjian: [file(0)], wenjian_jnpfId: [file(0)] };
  const check = run(data);
  assert.throws(check.validate, /0 字节/);
  data.wenjian = [file(4096, '编辑后.docx')];
  assert.doesNotThrow(check.validate);
  data.wenjian = [file(0)];
  assert.throws(check.validate, /0 字节/);
});
test('leaves missing attachments to native required-field validation', () => {
  assert.doesNotThrow(run({ wenjian: [], jilu_mingxi: [{ jilu_wenjian: null }] }).validate);
});
test('distinguishes unknown or invalid size from an empty file', () => {
  for (const size of [undefined, null, '', ' ', false, -1, 0.5, 'unknown', Infinity]) {
    const check = run({ wenjian: [file(size)] });
    assert.throws(check.validate, /大小(无法确认|无效)/);
    assert.doesNotMatch(check.messages[0][0], /0 字节/);
  }
});
test('does not silently skip malformed attachment or record arrays', () => {
  for (const data of [{ wenjian: '{}' }, { wenjian: '{' }, { jilu_mingxi: {} }]) {
    assert.throws(run(data).validate, /数据无法读取/);
  }
});