50 lines
2.2 KiB
Python
50 lines
2.2 KiB
Python
from test_est_rea_parity import run
|
|
import subprocess
|
|
from pathlib import Path
|
|
|
|
|
|
def test_attachment_size_prediction_includes_utf8_and_base64_overhead():
|
|
result = run(
|
|
"math",
|
|
"""(()=>{
|
|
const p=EstNative.empty();p.name='한글';const file={name:'파일.bin',type:'',size:4};
|
|
const expected={...p,id:'0'.repeat(24),attachments:[{id:'0'.repeat(36),...file,data:'AAECAw=='}]};
|
|
return {predicted:EstAttachments.requiredBytes(p,[file]),actual:new Blob([JSON.stringify(expected)]).size,
|
|
large:EstAttachments.requiredBytes(p,[{name:'large',type:'',size:210000000}]),count:p.attachments.length};
|
|
})()""",
|
|
)
|
|
assert result["predicted"] == result["actual"]
|
|
assert result["large"] > 256 * 1024 * 1024
|
|
assert result["count"] == 0
|
|
|
|
|
|
def test_attachment_validation_keeps_valid_data_and_rejects_malformed_content():
|
|
result = run(
|
|
"math",
|
|
"""(()=>{
|
|
const p=EstNative.empty();p.attachments=[{id:'one',name:'test.bin',type:'application/octet-stream',size:4,data:'AAECAw=='}];
|
|
const valid=EstModel.validate(p).attachments[0];let rejected=0;
|
|
for(const item of [{...valid,data:'AAECAw=A'},{...valid,size:5},{...valid,id:''},{...valid,name:''}]) {
|
|
const q=EstNative.empty();q.attachments=[item];try{EstModel.validate(q)}catch{rejected++}
|
|
}
|
|
const dup=EstNative.empty();dup.attachments=[valid,valid];try{EstModel.validate(dup)}catch{rejected++}
|
|
const empty=EstNative.empty();empty.attachments=[{id:'zero',name:'empty',type:'',size:0,data:''}];
|
|
return {valid,rejected,empty:EstModel.validate(empty).attachments[0].size};
|
|
})()""",
|
|
)
|
|
assert result["valid"]["data"] == "AAECAw=="
|
|
assert result["rejected"] == 5
|
|
assert result["empty"] == 0
|
|
|
|
|
|
def test_estx_export_rejects_web_attachments_instead_of_dropping_them():
|
|
script = """try{require('./tools/est-test/export-estx.cjs').exportEstx({originalArchive:'AA==',attachments:[{}]});process.exit(1)}catch(e){process.stdout.write(e.message)}"""
|
|
result = subprocess.run(
|
|
["node", "-e", script],
|
|
cwd=Path(__file__).resolve().parents[2],
|
|
capture_output=True,
|
|
check=True,
|
|
timeout=10,
|
|
)
|
|
assert "JSON" in result.stdout.decode("utf-8")
|