diff --git a/src/lib/storage.test.ts b/src/lib/storage.test.ts new file mode 100644 index 0000000..21177e3 --- /dev/null +++ b/src/lib/storage.test.ts @@ -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' }) + }) +}) diff --git a/src/lib/storage.ts b/src/lib/storage.ts new file mode 100644 index 0000000..7940302 --- /dev/null +++ b/src/lib/storage.ts @@ -0,0 +1,8 @@ +import { supabase } from './supabase' + +export async function uploadSalonImage(file: File, path: string): Promise { + 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 +}