45 lines
1.6 KiB
TypeScript
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])
|
|
})
|
|
})
|