36 lines
1.5 KiB
TypeScript
36 lines
1.5 KiB
TypeScript
import { mkdir, mkdtemp, readFile, rm, writeFile } from 'node:fs/promises';
|
|
import { join } from 'node:path';
|
|
import { tmpdir } from 'node:os';
|
|
import { afterEach, describe, expect, it } from 'vitest';
|
|
import { writeStoredZip } from '@electron/services/streaming-zip';
|
|
|
|
describe('streaming ZIP writer', () => {
|
|
const temporaryDirectories: string[] = [];
|
|
|
|
afterEach(async () => {
|
|
await Promise.all(temporaryDirectories.splice(0).map((directory) => (
|
|
rm(directory, { recursive: true, force: true })
|
|
)));
|
|
});
|
|
|
|
it('writes deterministic stored entries without buffering the archive', async () => {
|
|
const root = await mkdtemp(join(tmpdir(), 'streaming-zip-test-'));
|
|
temporaryDirectories.push(root);
|
|
await mkdir(join(root, 'assets'));
|
|
await writeFile(join(root, 'index.html'), '<main>ok</main>');
|
|
await writeFile(join(root, 'assets', '中.js'), 'console.log(1)');
|
|
const archivePath = join(root, 'build.zip');
|
|
const result = await writeStoredZip([
|
|
{ path: 'assets/中.js', source: { filePath: join(root, 'assets', '中.js') } },
|
|
{ path: 'index.html', source: { filePath: join(root, 'index.html') } },
|
|
], archivePath);
|
|
|
|
const archiveBytes = await readFile(archivePath);
|
|
expect(archiveBytes.subarray(0, 4).toString('hex')).toBe('504b0304');
|
|
expect(archiveBytes.includes(Buffer.from('<main>ok</main>'))).toBe(true);
|
|
expect(archiveBytes.includes(Buffer.from('console.log(1)'))).toBe(true);
|
|
expect(result.archiveBytes).toBe(archiveBytes.length);
|
|
expect(result.sha256).toMatch(/^[a-f0-9]{64}$/);
|
|
});
|
|
});
|