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, /数据无法读取/);
|
}
|
});
|