import { readFile, mkdtemp, rm } from "node:fs/promises"; import os from "node:os"; import path from "node:path"; import { afterEach, describe, expect, it } from "vitest"; import type { Catalog, CatalogComponent, FlowNode } from "../../shared/types"; import type { RunContext } from "../engine/types"; import { getHandler } from "../engine/registry"; import "./office"; import "./extended"; import "./office-file-extended"; import { EXCEL_COMMON_ALIASES } from "./office-aliases"; const dirs: string[] = []; const context = {} as RunContext; const component = {} as CatalogComponent; const node = (id: string): FlowNode => ({ id, componentId: id, position: { x: 0, y: 0 }, values: {}, options: {} }); async function run(id: string, args: Record) { const handler = getHandler(id); expect(handler, id).toBeTruthy(); return handler!(context, node(id), args, component); } afterEach(async () => Promise.all(dirs.splice(0).map((dir) => rm(dir, { recursive: true, force: true })))); describe("common Excel aliases", () => { it("registers only real catalog aliases", async () => { const catalog = JSON.parse(await readFile("resources/catalog.json", "utf8")) as Catalog; const ids = new Set(catalog.components.map((item) => item.id)); expect(EXCEL_COMMON_ALIASES.length).toBeGreaterThanOrEqual(25); for (const id of EXCEL_COMMON_ALIASES) { expect(ids.has(id), id).toBe(true); expect(getHandler(id), id).toBeTruthy(); } }); it("runs a real create, write and read pipeline through alias IDs", async () => { const directory = await mkdtemp(path.join(os.tmpdir(), "rpa-excel-alias-")); dirs.push(directory); const handle = await run("Excel_NewExcel", { path: directory, name: "aliases.xlsx", override: "1" }); await run("Excel_WriteCellNew", { workbook: handle, sheet: "Sheet1", row: 1, column: "A", content: "alias", save: "1" }); await expect(run("Excel_ReadCellNew", { workbook: handle, sheet: "Sheet1", row: 1, column: "A" })).resolves.toBe("alias"); }); it("accepts the Excel_NewExcel catalog keys (filePath / isMakedirs)", async () => { const directory = await mkdtemp(path.join(os.tmpdir(), "rpa-excel-new-")); dirs.push(directory); const handle = await run("Excel_NewExcel", { filePath: directory, name: "catalog-keys.xlsx", isMakedirs: "True" }) as { path: string }; expect(handle.path).toBe(path.resolve(directory, "catalog-keys.xlsx")); }); it("rejects a missing directory when isMakedirs is False", async () => { const directory = path.join(await mkdtemp(path.join(os.tmpdir(), "rpa-excel-new-")), "missing"); dirs.push(directory); await expect(run("Excel_NewExcel", { filePath: directory, name: "none.xlsx", isMakedirs: "False" })).rejects.toThrow("目录不存在"); }); it("opens a workbook through the Excel_OpenExcel filePath key", async () => { const directory = await mkdtemp(path.join(os.tmpdir(), "rpa-excel-open-")); dirs.push(directory); const created = await run("Excel_NewExcel", { filePath: directory, name: "open-me.xlsx" }) as { path: string }; await expect(run("Excel_OpenExcel", { filePath: created.path })).resolves.toMatchObject({ path: created.path }); }); it("renames a sheet through the Excel_RenameSheet newSheet key", async () => { const directory = await mkdtemp(path.join(os.tmpdir(), "rpa-excel-rename-")); dirs.push(directory); const created = await run("Excel_NewExcel", { filePath: directory, name: "rename-me.xlsx" }) as { path: string }; await expect(run("Excel_RenameSheet", { objExcel: created, sheet: "Sheet1", newSheet: "库存表", isSave: "True" })).resolves.toBeTruthy(); const reopened = await run("Excel_OpenExcel", { filePath: created.path }) as { id: string }; await expect(run("Excel_GetSheetsName", { objExcel: reopened })).resolves.toEqual(["库存表"]); }); it("writes a range through the Excel_WriteRange catalog keys (objExcel/cellPos/data/isSave)", async () => { const directory = await mkdtemp(path.join(os.tmpdir(), "rpa-excel-range-")); dirs.push(directory); const created = await run("Excel_NewExcel", { filePath: directory, name: "range.xlsx" }) as { path: string }; await run("Excel_WriteRange", { objExcel: created, sheet: "Sheet1", cellPos: "B2", data: [[1, "壹"], [2, "贰"]], isSave: "True" }); const reopened = await run("Excel_OpenExcel", { filePath: created.path }) as { id: string }; await expect(run("Excel_Cs_ReadContentV2", { workbook: reopened, sheet: "Sheet1", excelRng: "B2:C3" })).resolves.toEqual([[1, "壹"], [2, "贰"]]); }); });