web/src/hooks/useMobileUpload.ts contains several pure utility functions that are easily testable without any React rendering:
formatFileSize() (line 83) — formats bytes to human-readable sizes
validateFile() (line 96) — validates file size/type constraints
generateFileId() (line 111) — generates unique IDs
isFilePickerSupported() (line 122) — checks API support
isIOSSafari() (line 129) — browser detection
isMobileDevice() (line 141) — mobile detection
getMimeTypeFromExtension() (line 217) — MIME type lookup
What to do:
- Read
web/src/hooks/useMobileUpload.ts and extract the pure functions (or export them)
- Create
web/src/hooks/__tests__/useMobileUpload.test.ts
- Write tests for each function, covering edge cases:
formatFileSize(0), negative values, very large values
validateFile with oversized files, unsupported types
getMimeTypeFromExtension with unknown extensions
- Run:
pnpm -C web run test -- --run useMobileUpload
Skills needed: TypeScript, Vitest
Estimated time: 1-2 hours
web/src/hooks/useMobileUpload.tscontains several pure utility functions that are easily testable without any React rendering:formatFileSize()(line 83) — formats bytes to human-readable sizesvalidateFile()(line 96) — validates file size/type constraintsgenerateFileId()(line 111) — generates unique IDsisFilePickerSupported()(line 122) — checks API supportisIOSSafari()(line 129) — browser detectionisMobileDevice()(line 141) — mobile detectiongetMimeTypeFromExtension()(line 217) — MIME type lookupWhat to do:
web/src/hooks/useMobileUpload.tsand extract the pure functions (or export them)web/src/hooks/__tests__/useMobileUpload.test.tsformatFileSize(0), negative values, very large valuesvalidateFilewith oversized files, unsupported typesgetMimeTypeFromExtensionwith unknown extensionspnpm -C web run test -- --run useMobileUploadSkills needed: TypeScript, Vitest
Estimated time: 1-2 hours