36 lines
2.1 KiB
JavaScript
36 lines
2.1 KiB
JavaScript
const { test } = require('node:test')
|
|
const assert = require('node:assert/strict')
|
|
const fs = require('node:fs')
|
|
const vm = require('node:vm')
|
|
const ts = require('typescript')
|
|
const output = {}
|
|
vm.runInNewContext(ts.transpileModule(fs.readFileSync(require.resolve('../src/renderer/src/components/chatAttachments.ts'), 'utf8'), {
|
|
compilerOptions: { module: ts.ModuleKind.CommonJS, target: ts.ScriptTarget.ES2022 }
|
|
}).outputText, { exports: output, TextDecoder })
|
|
const { readChatAttachments } = output
|
|
const file = (name, content) => new File([content], name)
|
|
|
|
test('reads source/config/log files and preserves Korean UTF-8 text', async () => {
|
|
const files = await readChatAttachments([file('control.py', '# 조향 설정'), file('config.yaml', 'robot: mkmini'), file('runtime.log', 'started')], [])
|
|
assert.equal(files[0].content, '# 조향 설정')
|
|
assert.equal(files[2].name, 'runtime.log')
|
|
})
|
|
test('rejects unsupported image/PDF files', async () => {
|
|
await assert.rejects(readChatAttachments([file('photo.png', 'image')], []), /이미지와 PDF/)
|
|
await assert.rejects(readChatAttachments([file('guide.pdf', 'pdf')], []), /이미지와 PDF/)
|
|
})
|
|
test('rejects more than five attachments including existing ones', async () => {
|
|
await assert.rejects(readChatAttachments([file('a.txt', 'a')], Array(5).fill({ name: 'b.txt', content: '' })), /최대 5개/)
|
|
})
|
|
test('rejects binary and non-UTF8 content even under a text extension', async () => {
|
|
await assert.rejects(readChatAttachments([file('a.txt', 'a\0b')], []), /바이너리/)
|
|
await assert.rejects(readChatAttachments([file('a.txt', new Uint8Array([255, 254]))], []), /UTF-8/)
|
|
})
|
|
test('rejects oversized files instead of silently truncating', async () => {
|
|
await assert.rejects(readChatAttachments([file('a.txt', 'a'.repeat(100_001))], []), /100KB/)
|
|
await assert.rejects(readChatAttachments([file('a.txt', 'a'.repeat(50_001))], []), /5만 자/)
|
|
})
|
|
test('rejects aggregate attachment context above 100000 characters', async () => {
|
|
await assert.rejects(readChatAttachments([file('a.txt', 'a'.repeat(50_000)), file('b.txt', 'a'.repeat(50_000))], []), /10만 자/)
|
|
})
|