archive-shared.spec.ts 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. import { describe, expect, it } from 'vitest'
  2. import {
  3. createArchiveCacheKey,
  4. flattenArchiveObject,
  5. formatBytes,
  6. isArchiveExtension,
  7. isPreviewableArchiveEntry
  8. } from './helpers/archiveShared'
  9. const mockFile = (name: string, size: number) => ({
  10. name,
  11. size,
  12. lastModified: 1700000000000,
  13. extract: async () => new File(['sample'], name)
  14. })
  15. describe('archive shared helpers', () => {
  16. it('flattens nested libarchive file objects and marks previewable entries', () => {
  17. const entries = flattenArchiveObject({
  18. docs: {
  19. 'contract.pdf': mockFile('contract.pdf', 1024),
  20. 'raw.bin': mockFile('raw.bin', 2048)
  21. },
  22. 'mail.eml': mockFile('mail.eml', 512)
  23. })
  24. expect(entries.map(entry => entry.path)).toEqual([
  25. 'docs/contract.pdf',
  26. 'docs/raw.bin',
  27. 'mail.eml'
  28. ])
  29. expect(entries.find(entry => entry.name === 'contract.pdf')?.previewable).toBe(true)
  30. expect(entries.find(entry => entry.name === 'raw.bin')?.previewable).toBe(false)
  31. expect(entries.find(entry => entry.name === 'mail.eml')?.previewable).toBe(true)
  32. })
  33. it('detects archive and nested-preview extensions', () => {
  34. expect(isArchiveExtension('ZIP')).toBe(true)
  35. expect(isArchiveExtension('txt')).toBe(false)
  36. expect(isPreviewableArchiveEntry('folder/board.dra')).toBe(true)
  37. expect(isPreviewableArchiveEntry('folder/archive.7z')).toBe(true)
  38. })
  39. it('builds stable cache keys using archive and entry metadata', () => {
  40. const [entry] = flattenArchiveObject({
  41. 'contract.pdf': mockFile('contract.pdf', 1024)
  42. })
  43. expect(createArchiveCacheKey('demo.zip', 4096, entry)).toBe(
  44. 'archive-entry:demo.zip:4096:contract.pdf:1024:1700000000000'
  45. )
  46. })
  47. it('formats bytes for archive UI labels', () => {
  48. expect(formatBytes(512)).toBe('512 B')
  49. expect(formatBytes(1536)).toBe('1.5 KB')
  50. expect(formatBytes(5 * 1024 * 1024)).toBe('5.0 MB')
  51. })
  52. })