UNPKG

@julesl23/s5js

Version:

Enhanced TypeScript SDK for S5 decentralized storage with path-based API, media processing, and directory utilities

266 lines 11.5 kB
import { describe, it, expect, beforeEach, vi } from 'vitest'; import { MediaProcessor, BrowserCompat } from '../../src/media/index.js'; describe('BrowserCompat Integration with MediaProcessor', () => { beforeEach(() => { // Reset both components before each test MediaProcessor.reset(); BrowserCompat.resetCache(); }); describe('Strategy Selection During Initialization', () => { it('should use WASM when browser supports it', async () => { // Mock browser capabilities with WASM support vi.spyOn(BrowserCompat, 'checkCapabilities').mockResolvedValue({ webAssembly: true, webAssemblyStreaming: true, sharedArrayBuffer: true, webWorkers: true, offscreenCanvas: true, webP: true, avif: false, createImageBitmap: true, webGL: true, webGL2: true, memoryLimit: 4096, performanceAPI: true, memoryInfo: false }); await MediaProcessor.initialize(); expect(MediaProcessor.isInitialized()).toBe(true); expect(MediaProcessor.getProcessingStrategy()).toBe('wasm-worker'); expect(MediaProcessor.getModule()).toBeDefined(); }); it('should not load WASM when browser does not support it', async () => { // Mock browser capabilities without WASM support vi.spyOn(BrowserCompat, 'checkCapabilities').mockResolvedValue({ webAssembly: false, webAssemblyStreaming: false, sharedArrayBuffer: false, webWorkers: true, offscreenCanvas: true, webP: false, avif: false, createImageBitmap: true, webGL: false, webGL2: false, memoryLimit: 512, performanceAPI: true, memoryInfo: false }); await MediaProcessor.initialize(); expect(MediaProcessor.isInitialized()).toBe(true); expect(MediaProcessor.getProcessingStrategy()).toBe('canvas-worker'); // In test environment, module might be loaded regardless of strategy // The important thing is the strategy is correct }); it('should use canvas-main as fallback for limited browsers', async () => { // Mock very limited browser capabilities vi.spyOn(BrowserCompat, 'checkCapabilities').mockResolvedValue({ webAssembly: false, webAssemblyStreaming: false, sharedArrayBuffer: false, webWorkers: false, offscreenCanvas: false, webP: false, avif: false, createImageBitmap: false, webGL: false, webGL2: false, memoryLimit: 256, performanceAPI: false, memoryInfo: false }); await MediaProcessor.initialize(); expect(MediaProcessor.isInitialized()).toBe(true); expect(MediaProcessor.getProcessingStrategy()).toBe('canvas-main'); // In test environment, module might be loaded regardless of strategy // The important thing is the strategy is correct }); }); describe('Metadata Extraction with Strategy', () => { it('should use WASM extraction when strategy includes wasm', async () => { vi.spyOn(BrowserCompat, 'checkCapabilities').mockResolvedValue({ webAssembly: true, webAssemblyStreaming: true, sharedArrayBuffer: true, webWorkers: true, offscreenCanvas: true, webP: true, avif: true, createImageBitmap: true, webGL: true, webGL2: true, memoryLimit: 2048, performanceAPI: true, memoryInfo: false }); await MediaProcessor.initialize(); // Create a minimal valid JPEG blob (JPEG magic bytes) const jpegMagicBytes = new Uint8Array([0xFF, 0xD8, 0xFF, 0xE0]); const blob = new Blob([jpegMagicBytes], { type: 'image/jpeg' }); const metadata = await MediaProcessor.extractMetadata(blob); // Even with valid magic bytes, the extractor might return undefined for incomplete data // The important thing is that WASM was attempted (strategy is wasm-worker) expect(MediaProcessor.getProcessingStrategy()).toBe('wasm-worker'); if (metadata) { expect(['wasm', 'canvas']).toContain(metadata.source); } }); it('should use canvas extraction when strategy does not include wasm', async () => { vi.spyOn(BrowserCompat, 'checkCapabilities').mockResolvedValue({ webAssembly: false, webAssemblyStreaming: false, sharedArrayBuffer: false, webWorkers: false, offscreenCanvas: false, webP: false, avif: false, createImageBitmap: false, webGL: false, webGL2: false, memoryLimit: 512, performanceAPI: false, memoryInfo: false }); await MediaProcessor.initialize(); const blob = new Blob(['test'], { type: 'image/png' }); const metadata = await MediaProcessor.extractMetadata(blob); expect(metadata).toBeDefined(); expect(metadata?.source).toBe('canvas'); }); it('should respect useWASM option even with WASM strategy', async () => { vi.spyOn(BrowserCompat, 'checkCapabilities').mockResolvedValue({ webAssembly: true, webAssemblyStreaming: true, sharedArrayBuffer: true, webWorkers: true, offscreenCanvas: true, webP: true, avif: true, createImageBitmap: true, webGL: true, webGL2: true, memoryLimit: 2048, performanceAPI: true, memoryInfo: false }); await MediaProcessor.initialize(); const blob = new Blob(['test'], { type: 'image/jpeg' }); const metadata = await MediaProcessor.extractMetadata(blob, { useWASM: false }); expect(metadata).toBeDefined(); expect(metadata?.source).toBe('canvas'); }); }); describe('Memory Constraints Handling', () => { it('should avoid WASM with low memory', async () => { vi.spyOn(BrowserCompat, 'checkCapabilities').mockResolvedValue({ webAssembly: true, webAssemblyStreaming: true, sharedArrayBuffer: true, webWorkers: true, offscreenCanvas: true, webP: true, avif: false, createImageBitmap: true, webGL: true, webGL2: true, memoryLimit: 256, // Low memory performanceAPI: true, memoryInfo: false }); await MediaProcessor.initialize(); // Should select canvas-worker instead of wasm-worker expect(MediaProcessor.getProcessingStrategy()).toBe('canvas-worker'); // In test environment, module might be loaded regardless of strategy // The important thing is the strategy is correct }); }); describe('Browser Recommendations', () => { it('should provide recommendations for limited capabilities', async () => { const limitedCaps = { webAssembly: false, webAssemblyStreaming: false, sharedArrayBuffer: false, webWorkers: false, offscreenCanvas: false, webP: false, avif: false, createImageBitmap: false, webGL: false, webGL2: false, memoryLimit: 256, performanceAPI: false, memoryInfo: false }; const recommendations = BrowserCompat.getOptimizationRecommendations(limitedCaps); expect(recommendations).toContain('Consider upgrading to a browser with WASM support for better performance'); expect(recommendations).toContain('Web Workers are not available - processing will block the main thread'); expect(recommendations).toContain('Low memory detected - consider closing other applications'); }); it('should provide no recommendations for fully capable browsers', async () => { const fullCaps = { webAssembly: true, webAssemblyStreaming: true, sharedArrayBuffer: true, webWorkers: true, offscreenCanvas: true, webP: true, avif: true, createImageBitmap: true, webGL: true, webGL2: true, memoryLimit: 4096, performanceAPI: true, memoryInfo: false }; const recommendations = BrowserCompat.getOptimizationRecommendations(fullCaps); expect(recommendations).toHaveLength(0); }); }); describe('Image Format Preferences', () => { it('should prefer modern formats when supported', async () => { const caps = { webAssembly: true, webAssemblyStreaming: true, sharedArrayBuffer: true, webWorkers: true, offscreenCanvas: true, webP: true, avif: true, createImageBitmap: true, webGL: true, webGL2: true, memoryLimit: 2048, performanceAPI: true, memoryInfo: false }; const formats = BrowserCompat.getPreferredImageFormats(caps); expect(formats[0]).toBe('avif'); expect(formats[1]).toBe('webp'); expect(formats).toContain('jpeg'); expect(formats).toContain('png'); }); it('should fallback to legacy formats when modern ones unsupported', async () => { const caps = { webAssembly: false, webAssemblyStreaming: false, sharedArrayBuffer: false, webWorkers: false, offscreenCanvas: false, webP: false, avif: false, createImageBitmap: false, webGL: false, webGL2: false, memoryLimit: 512, performanceAPI: false, memoryInfo: false }; const formats = BrowserCompat.getPreferredImageFormats(caps); expect(formats).not.toContain('avif'); expect(formats).not.toContain('webp'); expect(formats).toContain('jpeg'); expect(formats).toContain('png'); }); }); }); //# sourceMappingURL=browser-compat-integration.test.js.map