Sifa professional network API (Fastify, AT Protocol, Jetstream) sifa.id/
at main 50 lines 1.9 kB view raw
1import { describe, it, expect, afterEach } from 'vitest'; 2import { existsSync, rmSync } from 'node:fs'; 3import { join } from 'node:path'; 4import { createLocalStorage } from '../../src/lib/storage.js'; 5 6const TEST_DIR = join(import.meta.dirname, '../.test-uploads'); 7const BASE_URL = 'https://sifa.id'; 8 9const mockLogger = { debug: () => {} } as any; 10 11describe('createLocalStorage', () => { 12 afterEach(() => { 13 rmSync(TEST_DIR, { recursive: true, force: true }); 14 }); 15 16 it('stores a file and returns a public URL', async () => { 17 const storage = createLocalStorage(TEST_DIR, BASE_URL, mockLogger); 18 const data = Buffer.from('fake image data'); 19 const url = await storage.store(data, 'image/webp', 'avatars'); 20 21 expect(url).toMatch(/^https:\/\/sifa\.id\/uploads\/avatars\/avatars-[a-f0-9-]+\.webp$/); 22 23 const relativePath = url.replace(`${BASE_URL}/uploads/`, ''); 24 expect(existsSync(join(TEST_DIR, relativePath))).toBe(true); 25 }); 26 27 it('deletes a stored file', async () => { 28 const storage = createLocalStorage(TEST_DIR, BASE_URL, mockLogger); 29 const data = Buffer.from('fake image data'); 30 const url = await storage.store(data, 'image/webp', 'avatars'); 31 32 await storage.delete(url); 33 34 const relativePath = url.replace(`${BASE_URL}/uploads/`, ''); 35 expect(existsSync(join(TEST_DIR, relativePath))).toBe(false); 36 }); 37 38 it('uses correct extension for mime type', async () => { 39 const storage = createLocalStorage(TEST_DIR, BASE_URL, mockLogger); 40 const url = await storage.store(Buffer.from('x'), 'image/jpeg', 'avatars'); 41 expect(url).toMatch(/\.jpg$/); 42 }); 43 44 it('handles delete of non-existent URL gracefully', async () => { 45 const storage = createLocalStorage(TEST_DIR, BASE_URL, mockLogger); 46 await expect( 47 storage.delete('https://sifa.id/uploads/avatars/nonexistent.webp'), 48 ).resolves.toBeUndefined(); 49 }); 50});