index.test.ts 3.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. import { describe, it, expect } from 'vitest';
  2. import {
  3. formatFileSize,
  4. isPreviewableFileType,
  5. getFileIconType,
  6. validateFileType,
  7. validateFileSize
  8. } from '../../src/utils';
  9. describe('工具函数', () => {
  10. describe('formatFileSize', () => {
  11. it('应该格式化文件大小', () => {
  12. expect(formatFileSize(0)).toBe('0 Bytes');
  13. expect(formatFileSize(1024)).toBe('1 KB');
  14. expect(formatFileSize(1048576)).toBe('1 MB');
  15. expect(formatFileSize(1073741824)).toBe('1 GB');
  16. expect(formatFileSize(1099511627776)).toBe('1 TB');
  17. });
  18. it('应该处理小数文件大小', () => {
  19. expect(formatFileSize(1536)).toBe('1.5 KB');
  20. expect(formatFileSize(1572864)).toBe('1.5 MB');
  21. });
  22. });
  23. describe('isPreviewableFileType', () => {
  24. it('应该检查文件类型是否可预览', () => {
  25. expect(isPreviewableFileType('image/jpeg')).toBe(true);
  26. expect(isPreviewableFileType('image/png')).toBe(true);
  27. expect(isPreviewableFileType('video/mp4')).toBe(true);
  28. expect(isPreviewableFileType('video/quicktime')).toBe(true);
  29. expect(isPreviewableFileType('application/pdf')).toBe(false);
  30. expect(isPreviewableFileType('text/plain')).toBe(false);
  31. expect(isPreviewableFileType(null)).toBe(false);
  32. });
  33. });
  34. describe('getFileIconType', () => {
  35. it('应该返回正确的文件图标类型', () => {
  36. expect(getFileIconType('image/jpeg')).toBe('image');
  37. expect(getFileIconType('video/mp4')).toBe('video');
  38. expect(getFileIconType('audio/mp3')).toBe('audio');
  39. expect(getFileIconType('application/pdf')).toBe('pdf');
  40. expect(getFileIconType('application/msword')).toBe('document');
  41. expect(getFileIconType('application/vnd.ms-excel')).toBe('spreadsheet');
  42. expect(getFileIconType('text/plain')).toBe('text');
  43. expect(getFileIconType('application/octet-stream')).toBe('other');
  44. });
  45. });
  46. describe('validateFileType', () => {
  47. it('应该验证文件类型', () => {
  48. const imageFile = new File([''], 'test.jpg', { type: 'image/jpeg' });
  49. const pdfFile = new File([''], 'test.pdf', { type: 'application/pdf' });
  50. // 接受所有文件类型
  51. expect(validateFileType(imageFile, '*/*')).toBe(true);
  52. expect(validateFileType(pdfFile, '*/*')).toBe(true);
  53. // 接受特定MIME类型
  54. expect(validateFileType(imageFile, 'image/*')).toBe(true);
  55. expect(validateFileType(pdfFile, 'image/*')).toBe(false);
  56. // 接受文件扩展名
  57. expect(validateFileType(imageFile, '.jpg,.png')).toBe(true);
  58. expect(validateFileType(pdfFile, '.jpg,.png')).toBe(false);
  59. // 混合类型
  60. expect(validateFileType(imageFile, 'image/*,.pdf')).toBe(true);
  61. expect(validateFileType(pdfFile, 'image/*,.pdf')).toBe(true);
  62. });
  63. it('应该在没有accept参数时返回true', () => {
  64. const file = new File([''], 'test.txt', { type: 'text/plain' });
  65. expect(validateFileType(file)).toBe(true);
  66. });
  67. });
  68. describe('validateFileSize', () => {
  69. it('应该验证文件大小', () => {
  70. const smallFile = new File([''], 'small.txt', { type: 'text/plain' });
  71. Object.defineProperty(smallFile, 'size', { value: 1024 * 1024 }); // 1MB
  72. const largeFile = new File([''], 'large.txt', { type: 'text/plain' });
  73. Object.defineProperty(largeFile, 'size', { value: 10 * 1024 * 1024 }); // 10MB
  74. expect(validateFileSize(smallFile, 5)).toBe(true); // 5MB限制
  75. expect(validateFileSize(largeFile, 5)).toBe(false); // 5MB限制
  76. });
  77. it('应该处理边界情况', () => {
  78. const exactSizeFile = new File([''], 'exact.txt', { type: 'text/plain' });
  79. Object.defineProperty(exactSizeFile, 'size', { value: 5 * 1024 * 1024 }); // 5MB
  80. expect(validateFileSize(exactSizeFile, 5)).toBe(true);
  81. });
  82. });
  83. });