alepha
Version:
Easy-to-use modern TypeScript framework for building many kind of applications.
225 lines (180 loc) • 6.9 kB
text/typescript
import { Alepha } from "alepha";
import { FileSystemProvider } from "alepha/system";
import { expect } from "vitest";
import {
$bucket,
FileNotFoundError,
type FileStorageProvider,
} from "../index.ts";
export const TEST_IMAGES_BUCKET = "test-images";
export const TEST_DOCUMENTS_BUCKET = "test-documents";
export class TestApp {
images = $bucket({ name: TEST_IMAGES_BUCKET });
documents = $bucket({ name: TEST_DOCUMENTS_BUCKET });
}
const BUCKET_NAME = TEST_IMAGES_BUCKET;
// Helper to create file system instance
const getFileSystem = () => Alepha.create().inject(FileSystemProvider);
export const testUploadAndExistence = async (
provider: FileStorageProvider,
): Promise<string> => {
const content = "This is a test image.";
const file = getFileSystem().createFile({
text: content,
name: "test.jpg",
type: "image/jpeg",
});
const fileId = await provider.upload(BUCKET_NAME, file);
expect(fileId).toBeTypeOf("string");
expect(fileId.length).toBeGreaterThan(0);
// Verify the file physically exists
const fileExists = await provider.exists(BUCKET_NAME, fileId);
expect(fileExists).toBe(true);
return fileId;
};
export const testDownloadAndMetadata = async (
provider: FileStorageProvider,
): Promise<string> => {
const content = "<h1>Hello Alepha</h1>";
const originalFile = getFileSystem().createFile({
text: content,
name: "index.html",
type: "text/html",
});
const fileId = await provider.upload(BUCKET_NAME, originalFile);
const downloadedFile = await provider.download(BUCKET_NAME, fileId);
// Check metadata
expect(downloadedFile.type).toBe("text/html");
expect(downloadedFile.size).toBe(content.length);
// Check content
const downloadedContent = await downloadedFile.text();
expect(downloadedContent).toBe(content);
return fileId;
};
export const testFileExistence = async (
provider: FileStorageProvider,
): Promise<string> => {
const file = getFileSystem().createFile({
text: "exists",
name: "exists.txt",
});
const fileId = await provider.upload(BUCKET_NAME, file);
const fileExists = await provider.exists(BUCKET_NAME, fileId);
expect(fileExists).toBe(true);
return fileId;
};
export const testNonExistentFile = async (provider: FileStorageProvider) => {
const fileExists = await provider.exists(BUCKET_NAME, "non-existent-file-id");
expect(fileExists).toBe(false);
};
export const testDeleteNonExistentFile = async (
provider: FileStorageProvider,
) => {
const file = getFileSystem().createFile({
text: "exists",
name: "exists.txt",
});
const fileId = await provider.upload(BUCKET_NAME, file);
const fileExists = await provider.exists(BUCKET_NAME, fileId);
expect(fileExists).toBe(true);
await provider.delete(BUCKET_NAME, fileId);
const fileExists2 = await provider.exists(BUCKET_NAME, fileId);
expect(fileExists2).toBe(false);
};
export const testDeleteFile = async (provider: FileStorageProvider) => {
const file = getFileSystem().createFile({
text: "to be deleted",
name: "delete_me.txt",
});
const fileId = await provider.upload(BUCKET_NAME, file);
// Verify it exists before deleting
expect(await provider.exists(BUCKET_NAME, fileId)).toBe(true);
await provider.delete(BUCKET_NAME, fileId);
// Verify it no longer exists after deletion
expect(await provider.exists(BUCKET_NAME, fileId)).toBe(false);
};
export const testNonExistentFileError = async (
provider: FileStorageProvider,
) => {
await expect(
provider.download(BUCKET_NAME, "i-do-not-exist"),
).rejects.toThrow(FileNotFoundError);
};
export const testUploadIntoBuckets = async (
provider: FileStorageProvider,
): Promise<{ docId: string; imgId: string }> => {
const fs = getFileSystem();
const docFile = fs.createFile({ text: "report", name: "report.pdf" });
const imgFile = fs.createFile({ text: "logo", name: "logo.png" });
const docId = await provider.upload(TEST_DOCUMENTS_BUCKET, docFile);
const imgId = await provider.upload(TEST_IMAGES_BUCKET, imgFile);
expect(await provider.exists(TEST_DOCUMENTS_BUCKET, docId)).toBe(true);
expect(await provider.exists(TEST_IMAGES_BUCKET, imgId)).toBe(true);
// Ensure files are in separate directories and not mixed up
expect(await provider.exists(TEST_DOCUMENTS_BUCKET, imgId)).toBe(false);
expect(await provider.exists(TEST_IMAGES_BUCKET, docId)).toBe(false);
return { docId, imgId };
};
export const testFileStream = async (
provider: FileStorageProvider,
): Promise<string> => {
const content = "Streaming content test.";
const file = getFileSystem().createFile({
text: content,
name: "stream.txt",
type: "text/plain",
});
const fileId = await provider.upload(BUCKET_NAME, file);
const stream = await provider.download(BUCKET_NAME, fileId);
expect(stream.type).toBe("text/plain");
const streamContent = await stream.text();
expect(streamContent).toBe(content);
return fileId;
};
export const testEmptyFiles = async (provider: FileStorageProvider) => {
const emptyFile = getFileSystem().createFile({
text: "",
name: "empty.txt",
type: "text/plain",
});
const fileId = await provider.upload(BUCKET_NAME, emptyFile);
const downloadedFile = await provider.download(BUCKET_NAME, fileId);
expect(downloadedFile.type).toBe("text/plain");
expect(downloadedFile.size).toBe(0);
expect(await downloadedFile.text()).toBe("");
};
export const testListFiles = async (provider: FileStorageProvider) => {
const fs = getFileSystem();
// Unknown bucket lists to nothing rather than throwing.
expect(await provider.list("test-unknown-bucket")).toEqual([]);
// Use a declared bucket so directory-backed providers have it provisioned.
const a = await provider.upload(
TEST_DOCUMENTS_BUCKET,
fs.createFile({ text: "a", name: "a.txt" }),
);
const b = await provider.upload(
TEST_DOCUMENTS_BUCKET,
fs.createFile({ text: "b", name: "b.txt" }),
);
const ids = await provider.list(TEST_DOCUMENTS_BUCKET);
expect(ids).toContain(a);
expect(ids).toContain(b);
// Listing is scoped to the bucket — ids do not leak across buckets.
expect(await provider.list(TEST_IMAGES_BUCKET)).not.toContain(a);
// Deleted files drop out of the listing.
await provider.delete(TEST_DOCUMENTS_BUCKET, a);
const after = await provider.list(TEST_DOCUMENTS_BUCKET);
expect(after).not.toContain(a);
expect(after).toContain(b);
};
export const testCustomFileId = async (provider: FileStorageProvider) => {
const file = getFileSystem().createFile({
text: "custom id",
name: "custom.txt",
});
const customFileId = "custom-file-id";
const uploadedFileId = await provider.upload(BUCKET_NAME, file, customFileId);
expect(uploadedFileId).toBe(customFileId);
const fileExists = await provider.exists(BUCKET_NAME, customFileId);
expect(fileExists).toBe(true);
};