Files
klz-cables.com/.pnpm-store/v10/files/a6/bbdbfe41e244a29d6574319bdde14c3b4253c7e8dd84a1885b995a4c941b427553ee80546c12d6d8be1a39c1d1f18e20a12b2cdcf787d8fe8bfdb44bd0a15e
Marc Mintel 5397309103
Some checks failed
Build & Deploy / 🔍 Prepare (push) Successful in 20s
Build & Deploy / 🧪 QA (push) Failing after 34s
Build & Deploy / 🏗️ Build (push) Has started running
Build & Deploy / 🚀 Deploy (push) Has been cancelled
Build & Deploy / 🧪 Smoke Test (push) Has been cancelled
Build & Deploy / ⚡ Lighthouse (push) Has been cancelled
Build & Deploy / 🔔 Notify (push) Has been cancelled
fix(products): fix breadcrumbs and product filtering (backport from main)
2026-02-24 16:04:21 +01:00

1 line
17 KiB
Plaintext

{"version":3,"sources":["../../src/uploads/getSafeFilename.spec.ts"],"sourcesContent":["import { beforeEach, describe, expect, it, vi } from 'vitest'\n\nimport { getSafeFileName, incrementName } from './getSafeFilename.js'\n\nvi.mock('./docWithFilenameExists.js', () => ({\n docWithFilenameExists: vi.fn(),\n}))\n\nvi.mock('./fileExists.js', () => ({\n fileExists: vi.fn(),\n}))\n\nimport { docWithFilenameExists } from './docWithFilenameExists.js'\nimport { fileExists } from './fileExists.js'\n\nconst mockDocWithFilenameExists = vi.mocked(docWithFilenameExists)\nconst mockFileExists = vi.mocked(fileExists)\n\ndescribe('incrementName', () => {\n it('should add -1 suffix to filename without existing suffix', () => {\n expect(incrementName('photo.jpg')).toBe('photo-1.jpg')\n })\n\n it('should increment existing numeric suffix', () => {\n expect(incrementName('photo-1.jpg')).toBe('photo-2.jpg')\n })\n\n it('should handle multi-digit suffixes', () => {\n expect(incrementName('photo-99.jpg')).toBe('photo-100.jpg')\n })\n\n it('should handle filenames with multiple dots', () => {\n expect(incrementName('my.photo.name.jpg')).toBe('my.photo.name-1.jpg')\n })\n\n it('should handle filenames with hyphens but no numeric suffix', () => {\n expect(incrementName('my-photo.jpg')).toBe('my-photo-1.jpg')\n })\n\n it('should handle filenames with hyphens and numeric suffix', () => {\n expect(incrementName('my-photo-5.jpg')).toBe('my-photo-6.jpg')\n })\n\n it('should preserve the original extension', () => {\n expect(incrementName('document.pdf')).toBe('document-1.pdf')\n expect(incrementName('image.png')).toBe('image-1.png')\n })\n\n it('should handle files with long extensions', () => {\n expect(incrementName('archive.tar.gz')).toBe('archive.tar-1.gz')\n })\n\n it('should handle filename with no extension', () => {\n expect(incrementName('filename')).toBe('filename-1.filename')\n })\n\n it('should handle filename that is just an extension', () => {\n expect(incrementName('.gitignore')).toBe('.gitignore-1.gitignore')\n })\n\n it('should handle empty string', () => {\n expect(incrementName('')).toBe('-1.')\n })\n\n it('should handle filename ending with hyphen and non-numeric', () => {\n expect(incrementName('file-abc.jpg')).toBe('file-abc-1.jpg')\n })\n\n it('should handle filename with only numbers before extension', () => {\n expect(incrementName('12345.jpg')).toBe('12345-1.jpg')\n })\n\n it('should handle filename where base ends with -0', () => {\n expect(incrementName('file-0.jpg')).toBe('file-1.jpg')\n })\n\n it('should preserve jpeg extension', () => {\n expect(incrementName('photo.jpeg')).toBe('photo-1.jpeg')\n expect(incrementName('photo-1.jpeg')).toBe('photo-2.jpeg')\n })\n\n it('should preserve jpg extension', () => {\n expect(incrementName('photo.jpg')).toBe('photo-1.jpg')\n expect(incrementName('photo-1.jpg')).toBe('photo-2.jpg')\n })\n\n it('should preserve tiff extension', () => {\n expect(incrementName('image.tiff')).toBe('image-1.tiff')\n expect(incrementName('image-1.tiff')).toBe('image-2.tiff')\n })\n\n it('should preserve tif extension', () => {\n expect(incrementName('image.tif')).toBe('image-1.tif')\n expect(incrementName('image-1.tif')).toBe('image-2.tif')\n })\n\n it('should handle common image formats', () => {\n expect(incrementName('image.png')).toBe('image-1.png')\n expect(incrementName('image.gif')).toBe('image-1.gif')\n expect(incrementName('image.webp')).toBe('image-1.webp')\n expect(incrementName('image.avif')).toBe('image-1.avif')\n expect(incrementName('image.svg')).toBe('image-1.svg')\n expect(incrementName('image.bmp')).toBe('image-1.bmp')\n expect(incrementName('image.ico')).toBe('image-1.ico')\n })\n\n it('should handle common document formats', () => {\n expect(incrementName('document.pdf')).toBe('document-1.pdf')\n expect(incrementName('document.doc')).toBe('document-1.doc')\n expect(incrementName('document.docx')).toBe('document-1.docx')\n expect(incrementName('spreadsheet.xls')).toBe('spreadsheet-1.xls')\n expect(incrementName('spreadsheet.xlsx')).toBe('spreadsheet-1.xlsx')\n expect(incrementName('presentation.ppt')).toBe('presentation-1.ppt')\n expect(incrementName('presentation.pptx')).toBe('presentation-1.pptx')\n })\n\n it('should handle common video formats', () => {\n expect(incrementName('video.mp4')).toBe('video-1.mp4')\n expect(incrementName('video.mov')).toBe('video-1.mov')\n expect(incrementName('video.avi')).toBe('video-1.avi')\n expect(incrementName('video.webm')).toBe('video-1.webm')\n expect(incrementName('video.mkv')).toBe('video-1.mkv')\n })\n\n it('should handle common audio formats', () => {\n expect(incrementName('audio.mp3')).toBe('audio-1.mp3')\n expect(incrementName('audio.wav')).toBe('audio-1.wav')\n expect(incrementName('audio.ogg')).toBe('audio-1.ogg')\n expect(incrementName('audio.flac')).toBe('audio-1.flac')\n expect(incrementName('audio.aac')).toBe('audio-1.aac')\n })\n\n it('should handle uppercase extensions', () => {\n expect(incrementName('PHOTO.JPG')).toBe('PHOTO-1.JPG')\n expect(incrementName('PHOTO.JPEG')).toBe('PHOTO-1.JPEG')\n expect(incrementName('IMAGE.PNG')).toBe('IMAGE-1.PNG')\n })\n\n it('should handle mixed case extensions', () => {\n expect(incrementName('photo.Jpeg')).toBe('photo-1.Jpeg')\n expect(incrementName('image.Png')).toBe('image-1.Png')\n })\n})\n\ndescribe('getSafeFileName', () => {\n const mockReq = {} as Parameters<typeof getSafeFileName>[0]['req']\n\n beforeEach(() => {\n vi.clearAllMocks()\n })\n\n it('should return original filename when no conflicts exist', async () => {\n mockDocWithFilenameExists.mockResolvedValue(false)\n mockFileExists.mockResolvedValue(false)\n\n const result = await getSafeFileName({\n collectionSlug: 'media',\n desiredFilename: 'photo.jpg',\n req: mockReq,\n staticPath: '/uploads',\n })\n\n expect(result).toBe('photo.jpg')\n expect(mockDocWithFilenameExists).toHaveBeenCalledTimes(1)\n expect(mockFileExists).toHaveBeenCalledTimes(1)\n })\n\n it('should increment filename when document exists in database', async () => {\n mockDocWithFilenameExists.mockResolvedValueOnce(true).mockResolvedValueOnce(false)\n mockFileExists.mockResolvedValue(false)\n\n const result = await getSafeFileName({\n collectionSlug: 'media',\n desiredFilename: 'photo.jpg',\n req: mockReq,\n staticPath: '/uploads',\n })\n\n expect(result).toBe('photo-1.jpg')\n })\n\n it('should increment filename when file exists on filesystem', async () => {\n mockDocWithFilenameExists.mockResolvedValue(false)\n mockFileExists.mockResolvedValueOnce(true).mockResolvedValueOnce(false)\n\n const result = await getSafeFileName({\n collectionSlug: 'media',\n desiredFilename: 'photo.jpg',\n req: mockReq,\n staticPath: '/uploads',\n })\n\n expect(result).toBe('photo-1.jpg')\n })\n\n it('should keep incrementing until unique name is found', async () => {\n mockDocWithFilenameExists\n .mockResolvedValueOnce(true)\n .mockResolvedValueOnce(true)\n .mockResolvedValueOnce(true)\n .mockResolvedValueOnce(false)\n mockFileExists.mockResolvedValue(false)\n\n const result = await getSafeFileName({\n collectionSlug: 'media',\n desiredFilename: 'photo.jpg',\n req: mockReq,\n staticPath: '/uploads',\n })\n\n expect(result).toBe('photo-3.jpg')\n })\n\n it('should handle conflicts from both database and filesystem', async () => {\n mockDocWithFilenameExists\n .mockResolvedValueOnce(true)\n .mockResolvedValueOnce(false)\n .mockResolvedValueOnce(false)\n mockFileExists.mockResolvedValueOnce(true).mockResolvedValueOnce(false)\n\n const result = await getSafeFileName({\n collectionSlug: 'media',\n desiredFilename: 'photo.jpg',\n req: mockReq,\n staticPath: '/uploads',\n })\n\n expect(result).toBe('photo-2.jpg')\n })\n\n it('should pass prefix to docWithFilenameExists', async () => {\n mockDocWithFilenameExists.mockResolvedValue(false)\n mockFileExists.mockResolvedValue(false)\n\n await getSafeFileName({\n collectionSlug: 'media',\n desiredFilename: 'photo.jpg',\n prefix: 'images/',\n req: mockReq,\n staticPath: '/uploads',\n })\n\n expect(mockDocWithFilenameExists).toHaveBeenCalledWith({\n collectionSlug: 'media',\n filename: 'photo.jpg',\n path: '/uploads',\n prefix: 'images/',\n req: mockReq,\n })\n })\n\n it('should check correct filesystem path', async () => {\n mockDocWithFilenameExists.mockResolvedValue(false)\n mockFileExists.mockResolvedValue(false)\n\n await getSafeFileName({\n collectionSlug: 'media',\n desiredFilename: 'photo.jpg',\n req: mockReq,\n staticPath: '/var/uploads/media',\n })\n\n expect(mockFileExists).toHaveBeenCalledWith('/var/uploads/media/photo.jpg')\n })\n\n it('should handle filename that already has numeric suffix', async () => {\n mockDocWithFilenameExists.mockResolvedValueOnce(true).mockResolvedValueOnce(false)\n mockFileExists.mockResolvedValue(false)\n\n const result = await getSafeFileName({\n collectionSlug: 'media',\n desiredFilename: 'photo-5.jpg',\n req: mockReq,\n staticPath: '/uploads',\n })\n\n expect(result).toBe('photo-6.jpg')\n })\n\n it('should preserve jpeg extension when incrementing', async () => {\n mockDocWithFilenameExists.mockResolvedValueOnce(true).mockResolvedValueOnce(false)\n mockFileExists.mockResolvedValue(false)\n\n const result = await getSafeFileName({\n collectionSlug: 'media',\n desiredFilename: 'photo.jpeg',\n req: mockReq,\n staticPath: '/uploads',\n })\n\n expect(result).toBe('photo-1.jpeg')\n })\n\n it('should preserve tiff extension when incrementing', async () => {\n mockDocWithFilenameExists.mockResolvedValueOnce(true).mockResolvedValueOnce(false)\n mockFileExists.mockResolvedValue(false)\n\n const result = await getSafeFileName({\n collectionSlug: 'media',\n desiredFilename: 'image.tiff',\n req: mockReq,\n staticPath: '/uploads',\n })\n\n expect(result).toBe('image-1.tiff')\n })\n\n it('should handle webp files', async () => {\n mockDocWithFilenameExists.mockResolvedValueOnce(true).mockResolvedValueOnce(false)\n mockFileExists.mockResolvedValue(false)\n\n const result = await getSafeFileName({\n collectionSlug: 'media',\n desiredFilename: 'image.webp',\n req: mockReq,\n staticPath: '/uploads',\n })\n\n expect(result).toBe('image-1.webp')\n })\n\n it('should handle pdf files', async () => {\n mockDocWithFilenameExists.mockResolvedValueOnce(true).mockResolvedValueOnce(false)\n mockFileExists.mockResolvedValue(false)\n\n const result = await getSafeFileName({\n collectionSlug: 'media',\n desiredFilename: 'document.pdf',\n req: mockReq,\n staticPath: '/uploads',\n })\n\n expect(result).toBe('document-1.pdf')\n })\n\n it('should handle mp4 video files', async () => {\n mockDocWithFilenameExists.mockResolvedValueOnce(true).mockResolvedValueOnce(false)\n mockFileExists.mockResolvedValue(false)\n\n const result = await getSafeFileName({\n collectionSlug: 'media',\n desiredFilename: 'video.mp4',\n req: mockReq,\n staticPath: '/uploads',\n })\n\n expect(result).toBe('video-1.mp4')\n })\n})\n"],"names":["beforeEach","describe","expect","it","vi","getSafeFileName","incrementName","mock","docWithFilenameExists","fn","fileExists","mockDocWithFilenameExists","mocked","mockFileExists","toBe","mockReq","clearAllMocks","mockResolvedValue","result","collectionSlug","desiredFilename","req","staticPath","toHaveBeenCalledTimes","mockResolvedValueOnce","prefix","toHaveBeenCalledWith","filename","path"],"mappings":"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"}