Files
landing-builder/lib/exporter/zip.validation.test.ts
T
jaybe 0e70cee93c
Auto PR / open-pr (push) Successful in 18s
Auto Label PR / add-automerge-label (pull_request) Successful in 3s
CI / test (pull_request) Successful in 55s
test(zip): Export ZIP 검증 강화(assets 유무/서브폴더 포함)
2025-11-14 23:45:08 +09:00

45 lines
1.6 KiB
TypeScript

import { describe, it, expect } from 'vitest'
import JSZip from 'jszip'
import { buildZip } from '@/lib/exporter/zip'
const TE = new TextEncoder()
describe('Export ZIP 검증 강화', () => {
it('assets가 비어있을 때 index.html/styles.css/app.js만 포함한다', async () => {
const zipBytes = await buildZip({
html: '<!DOCTYPE html><html><head><title>a</title></head><body>ok</body></html>',
css: 'body{color:#111}',
js: 'console.log("ok")',
assets: {},
})
const zip = await JSZip.loadAsync(zipBytes)
const names = Object.keys(zip.files).sort()
expect(names).toEqual(['app.js','index.html','styles.css'])
})
it('assets가 있으면 모든 파일을 그대로 포함한다(서브폴더 포함)', async () => {
const assets = {
'assets/img/logo.png': new Uint8Array([0,1,2,3]),
'assets/svg/icon.svg': TE.encode('<svg></svg>'),
'assets/fonts/inter.woff2': new Uint8Array([4,5,6]),
}
const zipBytes = await buildZip({
html: '<!DOCTYPE html><html><head><title>a</title></head><body>ok</body></html>',
css: 'body{color:#111}',
js: 'console.log("ok")',
assets,
})
const zip = await JSZip.loadAsync(zipBytes)
const names = Object.keys(zip.files)
expect(names).toContain('index.html')
expect(names).toContain('styles.css')
expect(names).toContain('app.js')
expect(names).toContain('assets/img/logo.png')
expect(names).toContain('assets/svg/icon.svg')
expect(names).toContain('assets/fonts/inter.woff2')
const logo = await zip.files['assets/img/logo.png'].async('uint8array')
expect(Array.from(logo)).toEqual([0,1,2,3])
})
})