Files
t8y2--dbx/packages/app-tests/gridFsBrowser.test.ts
T
2026-07-13 13:09:14 +08:00

117 lines
4.5 KiB
TypeScript
Vendored

import assert from "node:assert/strict";
import { test } from "vitest";
import * as gridFsBrowserModule from "../../apps/desktop/src/lib/document/gridFsBrowser.ts";
import {
buildGridFsFilesStructuredFilter,
currentGridFsBucketFilter,
currentGridFsBucketSort,
currentGridFsBucketSortDirection,
currentGridFsFileSortDirection,
gridFsFileFilterFieldOptions,
gridFsBucketSortInputForColumn,
gridFsFilesQueryPreview,
parseGridFsBucketSort,
} from "../../apps/desktop/src/lib/document/gridFsBrowser.ts";
test("builds a Mongo-style GridFS files query preview", () => {
assert.equal(
gridFsFilesQueryPreview({
bucket: "fs",
filterJson: '{"metadata.owner":"alice"}',
sortJson: '{"uploadDate":-1}',
}),
'db.getCollection("fs.files").find({"metadata.owner":"alice"}).sort({"uploadDate":-1})',
);
});
test("omits the sort stage when the GridFS file preview has no explicit sort", () => {
assert.equal(
gridFsFilesQueryPreview({
bucket: "fs",
filterJson: '{"filename":"report.zip"}',
}),
'db.getCollection("fs.files").find({"filename":"report.zip"})',
);
});
test("normalizes GridFS bucket filters by trimming blank input", () => {
assert.equal(currentGridFsBucketFilter(" nightly "), "nightly");
assert.equal(currentGridFsBucketFilter(" "), undefined);
});
test("normalizes GridFS manager sort directions for supported fields", () => {
assert.deepEqual(parseGridFsBucketSort('{"totalBytes":-1}'), { field: "totalBytes", direction: "desc" });
assert.deepEqual(parseGridFsBucketSort("{ fileCount: 1 }"), { field: "fileCount", direction: "asc" });
});
test("serializes GridFS manager sort input for supported columns", () => {
assert.equal(gridFsBucketSortInputForColumn("name", "asc"), '{"name":1}');
assert.equal(gridFsBucketSortInputForColumn("totalBytes", "desc"), '{"totalBytes":-1}');
assert.equal(gridFsBucketSortInputForColumn("fileCount", null), "");
});
test("rejects unsupported GridFS bucket sort fields", () => {
assert.throws(() => parseGridFsBucketSort('{"createdAt":-1}'), /Unsupported GridFS bucket sort field/);
});
test("returns canonical GridFS bucket sort JSON", () => {
assert.equal(currentGridFsBucketSort("{ totalBytes: -1 }"), '{"totalBytes":-1}');
assert.equal(currentGridFsBucketSort(" "), undefined);
});
test("exposes the available GridFS file filter fields for the compact builder", () => {
assert.deepEqual(gridFsFileFilterFieldOptions, ["_id", "filename", "contentType", "length", "chunkSize", "uploadDate", "md5"]);
});
test("exposes shared GridFS file field display metadata for filters and headers", () => {
assert.deepEqual((gridFsBrowserModule as any).gridFsFileFieldDisplayOptions, [
{ fieldName: "_id", label: "ID" },
{ fieldName: "filename", labelKey: "gridfsBrowser.name" },
{ fieldName: "contentType", labelKey: "gridfsBrowser.contentType" },
{ fieldName: "length", labelKey: "gridfsBrowser.totalSize" },
{ fieldName: "chunkSize", labelKey: "gridfsBrowser.chunkSize" },
{ fieldName: "uploadDate", labelKey: "gridfsBrowser.uploadDate" },
{ fieldName: "md5", label: "MD5" },
]);
});
test("combines GridFS file filter rules into a MongoDB structured filter", () => {
assert.deepEqual(
buildGridFsFilesStructuredFilter([
{
id: "rule-1",
fieldName: "filename",
mode: "equals",
rawValue: "report.zip",
conjunction: "AND",
},
{
id: "rule-2",
fieldName: "contentType",
mode: "like",
rawValue: "image",
conjunction: "AND",
},
]),
{
$and: [
{ filename: "report.zip" },
{ contentType: { $regex: "image", $options: "i" } },
],
},
);
});
test("derives explicit GridFS file sort directions for visible header indicators", () => {
assert.equal(currentGridFsFileSortDirection('{"filename":1}', "filename"), "asc");
assert.equal(currentGridFsFileSortDirection('{"filename":-1}', "filename"), "desc");
assert.equal(currentGridFsFileSortDirection('{"filename":1}', "uploadDate"), "none");
assert.equal(currentGridFsFileSortDirection('{"filename":1,"uploadDate":-1}', "filename"), "none");
});
test("derives explicit GridFS bucket sort directions for visible header indicators", () => {
assert.equal(currentGridFsBucketSortDirection('{"name":1}', "name"), "asc");
assert.equal(currentGridFsBucketSortDirection('{"totalBytes":-1}', "totalBytes"), "desc");
assert.equal(currentGridFsBucketSortDirection('{"name":1}', "fileCount"), "none");
});