147 lines
4.8 KiB
TypeScript
147 lines
4.8 KiB
TypeScript
import { LocalStorageAdapter } from '@/lib/storage/storage.adapter';
|
|
import { promises as fs } from 'fs';
|
|
import path from 'path';
|
|
|
|
describe('LocalStorageAdapter', () => {
|
|
const testUploadDir = 'tests/tmp/uploads';
|
|
let adapter: LocalStorageAdapter;
|
|
|
|
beforeEach(async () => {
|
|
adapter = new LocalStorageAdapter(testUploadDir);
|
|
// Clean up test directory before each test
|
|
try {
|
|
await fs.rm(testUploadDir, { recursive: true, force: true });
|
|
} catch {
|
|
// Directory doesn't exist yet
|
|
}
|
|
});
|
|
|
|
afterEach(async () => {
|
|
// Clean up test directory after each test
|
|
try {
|
|
await fs.rm(testUploadDir, { recursive: true, force: true });
|
|
} catch {
|
|
// Directory might not exist
|
|
}
|
|
});
|
|
|
|
describe('put', () => {
|
|
it('should create uploads directory if it does not exist', async () => {
|
|
const key = 'test-image.jpg';
|
|
const file = Buffer.from('test file content');
|
|
|
|
await adapter.put(key, file, 'image/jpeg');
|
|
|
|
const dirExists = await fs
|
|
.stat(testUploadDir)
|
|
.then(() => true)
|
|
.catch(() => false);
|
|
expect(dirExists).toBe(true);
|
|
});
|
|
|
|
it('should save file to disk with provided key', async () => {
|
|
const key = 'test-image.jpg';
|
|
const fileContent = 'test file content';
|
|
const file = Buffer.from(fileContent);
|
|
|
|
await adapter.put(key, file, 'image/jpeg');
|
|
|
|
const savedContent = await fs.readFile(
|
|
path.join(testUploadDir, key),
|
|
'utf-8'
|
|
);
|
|
expect(savedContent).toBe(fileContent);
|
|
});
|
|
|
|
it('should return StorageResult with local type', async () => {
|
|
const key = 'test-image.jpg';
|
|
const file = Buffer.from('test file content');
|
|
|
|
const result = await adapter.put(key, file, 'image/jpeg');
|
|
|
|
expect(result).toEqual({
|
|
type: 'local',
|
|
provider: null,
|
|
key,
|
|
publicUrl: `/tests/tmp/uploads/test-image.jpg`,
|
|
});
|
|
});
|
|
|
|
it('should handle Blob input', async () => {
|
|
const key = 'test-blob.jpg';
|
|
const fileContent = 'blob file content';
|
|
const blob = new Blob([fileContent], { type: 'image/jpeg' });
|
|
|
|
const result = await adapter.put(key, blob, 'image/jpeg');
|
|
|
|
const savedContent = await fs.readFile(
|
|
path.join(testUploadDir, key),
|
|
'utf-8'
|
|
);
|
|
expect(savedContent).toBe(fileContent);
|
|
expect(result.type).toBe('local');
|
|
});
|
|
|
|
it('should create nested directories for keys with paths', async () => {
|
|
const key = 'articles/2026/04/image.jpg';
|
|
const file = Buffer.from('nested file content');
|
|
|
|
const result = await adapter.put(key, file, 'image/jpeg');
|
|
|
|
const savedContent = await fs.readFile(
|
|
path.join(testUploadDir, key),
|
|
'utf-8'
|
|
);
|
|
expect(savedContent).toBe('nested file content');
|
|
expect(result.publicUrl).toBe(
|
|
`/tests/tmp/uploads/articles/2026/04/image.jpg`
|
|
);
|
|
});
|
|
});
|
|
|
|
describe('delete', () => {
|
|
it('should delete file from disk', async () => {
|
|
const key = 'test-image.jpg';
|
|
const file = Buffer.from('test file content');
|
|
|
|
await adapter.put(key, file, 'image/jpeg');
|
|
const filePathBeforeDelete = path.join(testUploadDir, key);
|
|
expect(
|
|
await fs
|
|
.stat(filePathBeforeDelete)
|
|
.then(() => true)
|
|
.catch(() => false)
|
|
).toBe(true);
|
|
|
|
await adapter.delete(key);
|
|
|
|
const fileExists = await fs
|
|
.stat(filePathBeforeDelete)
|
|
.then(() => true)
|
|
.catch(() => false);
|
|
expect(fileExists).toBe(false);
|
|
});
|
|
|
|
it('should not throw error if file does not exist', async () => {
|
|
const key = 'non-existent-file.jpg';
|
|
|
|
// Should not throw
|
|
await expect(adapter.delete(key)).resolves.toBeUndefined();
|
|
});
|
|
|
|
it('should delete nested files', async () => {
|
|
const key = 'articles/2026/04/image.jpg';
|
|
const file = Buffer.from('nested file content');
|
|
|
|
await adapter.put(key, file, 'image/jpeg');
|
|
await adapter.delete(key);
|
|
|
|
const fileExists = await fs
|
|
.stat(path.join(testUploadDir, key))
|
|
.then(() => true)
|
|
.catch(() => false);
|
|
expect(fileExists).toBe(false);
|
|
});
|
|
});
|
|
});
|