54 lines
2.4 KiB
TypeScript
Vendored
54 lines
2.4 KiB
TypeScript
Vendored
// @vitest-environment happy-dom
|
|
|
|
import { describe, expect, it } from "vitest";
|
|
import { ExternalSqlFileTooLargeError, externalSqlFileDisplayTitles, externalSqlFileOpenErrorMessage, formatSqlFileSize, MAX_EXTERNAL_SQL_EDITOR_FILE_BYTES, normalizeExternalSqlPath, readBrowserSqlFile } from "@/lib/sql/sqlFileOpen";
|
|
|
|
describe("external SQL file paths", () => {
|
|
it("normalizes Windows separators for identity checks", () => {
|
|
expect(normalizeExternalSqlPath(" C:\\work\\demo.sql ")).toBe("C:/work/demo.sql");
|
|
});
|
|
|
|
it("uses the shortest unique parent path for duplicate filenames", () => {
|
|
expect(externalSqlFileDisplayTitles(["/work/demo/create.sql", "/work/learn/create.sql", "/work/query.sql"])).toEqual(["demo/create.sql", "learn/create.sql", "query.sql"]);
|
|
});
|
|
|
|
it("adds more parent segments when immediate parents also collide", () => {
|
|
expect(externalSqlFileDisplayTitles(["/one/sql/create.sql", "/two/sql/create.sql"])).toEqual(["one/sql/create.sql", "two/sql/create.sql"]);
|
|
});
|
|
});
|
|
|
|
describe("external SQL file editor limit", () => {
|
|
it("accepts the exact browser editor limit", async () => {
|
|
const file = new Blob(["select 1;"]);
|
|
Object.defineProperty(file, "size", { value: MAX_EXTERNAL_SQL_EDITOR_FILE_BYTES });
|
|
|
|
await expect(readBrowserSqlFile(file)).resolves.toBe("select 1;");
|
|
});
|
|
|
|
it("rejects browser files above the editor limit before reading", async () => {
|
|
const file = new Blob(["select 1;"]);
|
|
Object.defineProperty(file, "size", { value: MAX_EXTERNAL_SQL_EDITOR_FILE_BYTES + 1 });
|
|
|
|
await expect(readBrowserSqlFile(file)).rejects.toMatchObject({
|
|
name: "ExternalSqlFileTooLargeError",
|
|
sizeBytes: MAX_EXTERNAL_SQL_EDITOR_FILE_BYTES + 1,
|
|
maxSizeBytes: MAX_EXTERNAL_SQL_EDITOR_FILE_BYTES,
|
|
});
|
|
});
|
|
|
|
it("formats large file sizes", () => {
|
|
expect(formatSqlFileSize(64 * 1024 * 1024)).toBe("64.0 MB");
|
|
expect(formatSqlFileSize(50 * 1024 * 1024 * 1024)).toBe("50.0 GB");
|
|
});
|
|
|
|
it("builds a localized actionable message for oversized files", () => {
|
|
const message = externalSqlFileOpenErrorMessage(new ExternalSqlFileTooLargeError(50 * 1024 ** 3, 64 * 1024 ** 2), (_key, params) => `${params.size}/${params.limit}`);
|
|
|
|
expect(message).toBe("50.0 GB/64.0 MB");
|
|
});
|
|
|
|
it("preserves ordinary backend error messages", () => {
|
|
expect(externalSqlFileOpenErrorMessage(new Error("permission denied"), () => "unused")).toBe("permission denied");
|
|
});
|
|
});
|