import { describe, it, expect } from "vitest"; import { buildBases } from "@/lib/tools/bases"; const base = { viewType: "table" as const, viewName: "Проекты", properties: ["file.name", "status"], filterScope: "none" as const, filterValue: "", }; describe("buildBases", () => { it("базовая таблица: type/name/order", () => { const y = buildBases(base); expect(y).toContain("views:"); expect(y).toContain(" - type: table"); expect(y).toContain(" name: Проекты"); expect(y).toContain(" order:"); expect(y).toContain(" - file.name"); expect(y).toContain(" - status"); expect(y).not.toContain("filters:"); }); it("фильтр по папке", () => { const y = buildBases({ ...base, filterScope: "folder", filterValue: "Projects" }); expect(y).toContain("filters:"); expect(y).toContain(" and:"); expect(y).toContain(` - 'file.inFolder("Projects")'`); }); it("фильтр по тегу снимает ведущий #", () => { const y = buildBases({ ...base, filterScope: "tag", filterValue: "#проект" }); expect(y).toContain(`- 'file.hasTag("проект")'`); }); it("property-фильтр — готовое выражение как есть", () => { const y = buildBases({ ...base, filterScope: "property", filterValue: 'status == "done"' }); expect(y).toContain(`- 'status == "done"'`); }); it("сортировка → sort: column/direction (не property)", () => { const y = buildBases({ ...base, sortBy: "status", sortDir: "DESC" }); expect(y).toContain(" sort:"); expect(y).toContain(" - column: status"); expect(y).toContain(" direction: DESC"); }); it("группировка и лимит", () => { const y = buildBases({ ...base, groupBy: "status", limit: 50 }); expect(y).toContain(" groupBy:"); expect(y).toContain(" property: status"); expect(y).toContain(" limit: 50"); }); it("имя вида квотится при двоеточии+пробеле", () => { expect(buildBases({ ...base, viewName: "Книги: всё" })).toContain('name: "Книги: всё"'); }); });