feat: add salon-images upload helper

This commit is contained in:
belviskhoremk
2026-08-12 11:13:02 +02:00
parent 27ef99c76d
commit 0f4b95a6dd
2 changed files with 46 additions and 0 deletions

38
src/lib/storage.test.ts Normal file
View 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
View 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
}