feat: add salon-images upload helper
This commit is contained in:
38
src/lib/storage.test.ts
Normal file
38
src/lib/storage.test.ts
Normal file
@@ -0,0 +1,38 @@
|
|||||||
|
import { describe, it, expect, vi, beforeEach } from 'vitest'
|
||||||
|
|
||||||
|
const uploadMock = vi.fn()
|
||||||
|
const getPublicUrlMock = vi.fn()
|
||||||
|
const fromMock = vi.fn(() => ({ upload: uploadMock, getPublicUrl: getPublicUrlMock }))
|
||||||
|
|
||||||
|
vi.mock('./supabase', () => ({
|
||||||
|
supabase: { storage: { from: (...args: unknown[]) => fromMock(...args) } },
|
||||||
|
}))
|
||||||
|
|
||||||
|
import { uploadSalonImage } from './storage'
|
||||||
|
|
||||||
|
describe('uploadSalonImage', () => {
|
||||||
|
beforeEach(() => {
|
||||||
|
uploadMock.mockReset()
|
||||||
|
getPublicUrlMock.mockReset()
|
||||||
|
fromMock.mockClear()
|
||||||
|
})
|
||||||
|
|
||||||
|
it('uploads to the salon-images bucket and returns the public URL', async () => {
|
||||||
|
uploadMock.mockResolvedValue({ error: null })
|
||||||
|
getPublicUrlMock.mockReturnValue({ data: { publicUrl: 'https://example.supabase.co/storage/v1/object/public/salon-images/products/edge-control.jpg' } })
|
||||||
|
|
||||||
|
const file = new File(['fake'], 'edge-control.jpg', { type: 'image/jpeg' })
|
||||||
|
const url = await uploadSalonImage(file, 'products/edge-control.jpg')
|
||||||
|
|
||||||
|
expect(fromMock).toHaveBeenCalledWith('salon-images')
|
||||||
|
expect(uploadMock).toHaveBeenCalledWith('products/edge-control.jpg', file, { upsert: true })
|
||||||
|
expect(url).toBe('https://example.supabase.co/storage/v1/object/public/salon-images/products/edge-control.jpg')
|
||||||
|
})
|
||||||
|
|
||||||
|
it('throws when the upload fails', async () => {
|
||||||
|
uploadMock.mockResolvedValue({ error: { message: 'Storage error' } })
|
||||||
|
const file = new File(['fake'], 'bad.jpg', { type: 'image/jpeg' })
|
||||||
|
|
||||||
|
await expect(uploadSalonImage(file, 'products/bad.jpg')).rejects.toEqual({ message: 'Storage error' })
|
||||||
|
})
|
||||||
|
})
|
||||||
8
src/lib/storage.ts
Normal file
8
src/lib/storage.ts
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
import { supabase } from './supabase'
|
||||||
|
|
||||||
|
export async function uploadSalonImage(file: File, path: string): Promise<string> {
|
||||||
|
const { error } = await supabase.storage.from('salon-images').upload(path, file, { upsert: true })
|
||||||
|
if (error) throw error
|
||||||
|
const { data } = supabase.storage.from('salon-images').getPublicUrl(path)
|
||||||
|
return data.publicUrl
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user