Sifa professional network API (Fastify, AT Protocol, Jetstream)
sifa.id/
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});