mirror of
https://github.com/complexcaresolutions/cms.c2sgmbh.git
synced 2026-03-17 18:34:13 +00:00
95 lines
2.8 KiB
TypeScript
95 lines
2.8 KiB
TypeScript
// tests/unit/media-download.unit.spec.ts
|
|
import { describe, it, expect, vi, beforeEach } from 'vitest'
|
|
import { downloadAndUploadImage } from '../../src/lib/utils/media-download'
|
|
|
|
// Mock fetch globally
|
|
const mockFetch = vi.fn()
|
|
vi.stubGlobal('fetch', mockFetch)
|
|
|
|
// Mock payload instance
|
|
const mockPayload = {
|
|
find: vi.fn(),
|
|
create: vi.fn(),
|
|
}
|
|
|
|
describe('downloadAndUploadImage', () => {
|
|
beforeEach(() => {
|
|
vi.clearAllMocks()
|
|
})
|
|
|
|
it('should download image and create media document', async () => {
|
|
// Mock successful fetch
|
|
const mockBuffer = Buffer.from('fake-image-data')
|
|
mockFetch.mockResolvedValue({
|
|
ok: true,
|
|
headers: { get: (h: string) => (h === 'content-type' ? 'image/jpeg' : '1024') },
|
|
arrayBuffer: () => Promise.resolve(mockBuffer.buffer),
|
|
})
|
|
|
|
// Mock no existing duplicate
|
|
mockPayload.find.mockResolvedValue({ docs: [], totalDocs: 0 })
|
|
|
|
// Mock media creation
|
|
mockPayload.create.mockResolvedValue({ id: 42 })
|
|
|
|
const result = await downloadAndUploadImage(mockPayload as any, {
|
|
url: 'https://img.youtube.com/vi/abc123/hqdefault.jpg',
|
|
filename: 'abc123_thumbnail.jpg',
|
|
alt: 'Video Thumbnail',
|
|
})
|
|
|
|
expect(result).toBe(42)
|
|
expect(mockFetch).toHaveBeenCalledWith(
|
|
'https://img.youtube.com/vi/abc123/hqdefault.jpg',
|
|
expect.objectContaining({ signal: expect.any(AbortSignal) }),
|
|
)
|
|
expect(mockPayload.create).toHaveBeenCalledWith(
|
|
expect.objectContaining({
|
|
collection: 'media',
|
|
file: expect.objectContaining({
|
|
name: 'abc123_thumbnail.jpg',
|
|
mimetype: 'image/jpeg',
|
|
}),
|
|
}),
|
|
)
|
|
})
|
|
|
|
it('should return existing media ID if duplicate found', async () => {
|
|
mockPayload.find.mockResolvedValue({
|
|
docs: [{ id: 99 }],
|
|
totalDocs: 1,
|
|
})
|
|
|
|
const result = await downloadAndUploadImage(mockPayload as any, {
|
|
url: 'https://img.youtube.com/vi/abc123/hqdefault.jpg',
|
|
filename: 'abc123_thumbnail.jpg',
|
|
})
|
|
|
|
expect(result).toBe(99)
|
|
expect(mockFetch).not.toHaveBeenCalled()
|
|
})
|
|
|
|
it('should return null on fetch error', async () => {
|
|
mockPayload.find.mockResolvedValue({ docs: [], totalDocs: 0 })
|
|
mockFetch.mockRejectedValue(new Error('Network error'))
|
|
|
|
const result = await downloadAndUploadImage(mockPayload as any, {
|
|
url: 'https://img.youtube.com/vi/bad/hqdefault.jpg',
|
|
filename: 'bad_thumbnail.jpg',
|
|
})
|
|
|
|
expect(result).toBeNull()
|
|
})
|
|
|
|
it('should return null on non-ok response', async () => {
|
|
mockPayload.find.mockResolvedValue({ docs: [], totalDocs: 0 })
|
|
mockFetch.mockResolvedValue({ ok: false, status: 404 })
|
|
|
|
const result = await downloadAndUploadImage(mockPayload as any, {
|
|
url: 'https://img.youtube.com/vi/notfound/hqdefault.jpg',
|
|
filename: 'notfound_thumbnail.jpg',
|
|
})
|
|
|
|
expect(result).toBeNull()
|
|
})
|
|
})
|