109 lines
3.9 KiB
TypeScript
109 lines
3.9 KiB
TypeScript
/**
|
|
* @license
|
|
* Copyright 2025 AionUi (aionui.com)
|
|
* SPDX-License-Identifier: Apache-2.0
|
|
*/
|
|
|
|
import { describe, it, expect } from 'vitest';
|
|
import { base64ToBlob, BINARY_MIME_MAP } from '@/renderer/utils/file/base64';
|
|
|
|
describe('base64 utils', () => {
|
|
describe('base64ToBlob', () => {
|
|
it('decodes base64 data URL to Blob', () => {
|
|
const base64 = btoa('Hello, World!');
|
|
const dataUrl = `data:text/plain;base64,${base64}`;
|
|
const blob = base64ToBlob(dataUrl, 'text/plain');
|
|
|
|
expect(blob).toBeInstanceOf(Blob);
|
|
expect(blob.type).toMatch(/^text\/plain/);
|
|
expect(blob.size).toBe(13);
|
|
});
|
|
|
|
it('handles empty base64 string', () => {
|
|
const dataUrl = 'data:text/plain;base64,';
|
|
const blob = base64ToBlob(dataUrl, 'text/plain');
|
|
|
|
expect(blob.size).toBe(0);
|
|
});
|
|
|
|
it('preserves MIME type from parameter', () => {
|
|
const base64 = btoa('test');
|
|
const dataUrl = `data:text/plain;base64,${base64}`;
|
|
const blob = base64ToBlob(dataUrl, 'application/json');
|
|
|
|
expect(blob.type).toMatch(/^application\/json/);
|
|
});
|
|
|
|
it('handles binary data', () => {
|
|
const binaryData = new Uint8Array([0xff, 0xd8, 0xff, 0xe0]);
|
|
const binaryStr = String.fromCharCode(...binaryData);
|
|
const base64 = btoa(binaryStr);
|
|
const dataUrl = `data:image/jpeg;base64,${base64}`;
|
|
const blob = base64ToBlob(dataUrl, 'image/jpeg');
|
|
|
|
expect(blob.size).toBe(4);
|
|
expect(blob.type).toBe('image/jpeg');
|
|
});
|
|
|
|
it('handles data URL without MIME type prefix', () => {
|
|
const base64 = btoa('test');
|
|
const dataUrl = base64;
|
|
const blob = base64ToBlob(dataUrl, 'text/plain');
|
|
|
|
expect(blob.size).toBe(0);
|
|
});
|
|
|
|
it('handles multiline base64', () => {
|
|
const text = 'a'.repeat(100);
|
|
const base64 = btoa(text);
|
|
const dataUrl = `data:text/plain;base64,${base64}`;
|
|
const blob = base64ToBlob(dataUrl, 'text/plain');
|
|
|
|
expect(blob.size).toBe(100);
|
|
});
|
|
});
|
|
|
|
describe('BINARY_MIME_MAP', () => {
|
|
it('contains expected Office document MIME types', () => {
|
|
expect(BINARY_MIME_MAP.xlsx).toBe('application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
|
|
expect(BINARY_MIME_MAP.docx).toBe('application/vnd.openxmlformats-officedocument.wordprocessingml.document');
|
|
expect(BINARY_MIME_MAP.pptx).toBe('application/vnd.openxmlformats-officedocument.presentationml.presentation');
|
|
});
|
|
|
|
it('contains legacy Office MIME types', () => {
|
|
expect(BINARY_MIME_MAP.xls).toBe('application/vnd.ms-excel');
|
|
expect(BINARY_MIME_MAP.doc).toBe('application/msword');
|
|
expect(BINARY_MIME_MAP.ppt).toBe('application/vnd.ms-powerpoint');
|
|
});
|
|
|
|
it('contains OpenDocument MIME types', () => {
|
|
expect(BINARY_MIME_MAP.ods).toBe('application/vnd.oasis.opendocument.spreadsheet');
|
|
expect(BINARY_MIME_MAP.odt).toBe('application/vnd.oasis.opendocument.text');
|
|
expect(BINARY_MIME_MAP.odp).toBe('application/vnd.oasis.opendocument.presentation');
|
|
});
|
|
|
|
it('contains common file format MIME types', () => {
|
|
expect(BINARY_MIME_MAP.pdf).toBe('application/pdf');
|
|
expect(BINARY_MIME_MAP.csv).toBe('text/csv');
|
|
});
|
|
|
|
it('contains archive MIME types', () => {
|
|
expect(BINARY_MIME_MAP.zip).toBe('application/zip');
|
|
expect(BINARY_MIME_MAP.tar).toBe('application/x-tar');
|
|
expect(BINARY_MIME_MAP.gz).toBe('application/gzip');
|
|
expect(BINARY_MIME_MAP.bz2).toBe('application/x-bzip2');
|
|
expect(BINARY_MIME_MAP['7z']).toBe('application/x-7z-compressed');
|
|
expect(BINARY_MIME_MAP.rar).toBe('application/vnd.rar');
|
|
});
|
|
|
|
it('has all expected file extensions', () => {
|
|
const extensions = Object.keys(BINARY_MIME_MAP);
|
|
expect(extensions).toContain('xlsx');
|
|
expect(extensions).toContain('pdf');
|
|
expect(extensions).toContain('zip');
|
|
expect(extensions).toContain('docx');
|
|
expect(extensions.length).toBeGreaterThanOrEqual(16);
|
|
});
|
|
});
|
|
});
|