UNPKG

@dpkit/core

Version:

Fast TypeScript data management framework built on top of the Data Package standard and Polars DataFrames

69 lines 9.98 kB
import * as fs from "node:fs/promises"; import * as path from "node:path"; import { temporaryDirectory } from "tempy"; import { afterEach, beforeEach, describe, expect, it } from "vitest"; import { saveDescriptor } from "./save.js"; describe("saveDescriptor", () => { const testDescriptor = { name: "test-descriptor", version: "1.0.0", description: "Test descriptor for save function", resources: [ { name: "resource1", path: "data/resource1.csv", }, ], }; let testDir; let testPath; beforeEach(() => { testDir = temporaryDirectory(); testPath = path.join(testDir, "descriptor.json"); }); afterEach(async () => { try { await fs.rm(testDir, { recursive: true, force: true }); } catch (error) { if (error instanceof Error && !error.message.includes("ENOENT")) { console.error(`Failed to clean up test directory: ${testDir}`, error); } } }); it("should save a descriptor to the specified path", async () => { await saveDescriptor(testDescriptor, { path: testPath }); const fileExists = await fs .stat(testPath) .then(() => true) .catch(() => false); expect(fileExists).toBe(true); const content = await fs.readFile(testPath, "utf-8"); const parsedContent = JSON.parse(content); expect(parsedContent).toEqual(testDescriptor); }); it("should save a descriptor to a nested directory path", async () => { const nestedPath = path.join(testDir, "nested", "dir", "descriptor.json"); await saveDescriptor(testDescriptor, { path: nestedPath }); const fileExists = await fs .stat(nestedPath) .then(() => true) .catch(() => false); expect(fileExists).toBe(true); const content = await fs.readFile(nestedPath, "utf-8"); const parsedContent = JSON.parse(content); expect(parsedContent).toEqual(testDescriptor); }); it("should use pretty formatting with 2-space indentation", async () => { await saveDescriptor(testDescriptor, { path: testPath }); const content = await fs.readFile(testPath, "utf-8"); const expectedFormat = JSON.stringify(testDescriptor, null, 2); expect(content).toEqual(expectedFormat); const lines = content.split("\n"); expect(lines.length).toBeGreaterThan(1); if (lines.length > 1 && lines[1]) { expect(lines[1].startsWith(" ")).toBe(true); } }); }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2F2ZS5zcGVjLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vZ2VuZXJhbC9kZXNjcmlwdG9yL3NhdmUuc3BlYy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssRUFBRSxNQUFNLGtCQUFrQixDQUFBO0FBQ3RDLE9BQU8sS0FBSyxJQUFJLE1BQU0sV0FBVyxDQUFBO0FBQ2pDLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLE9BQU8sQ0FBQTtBQUMxQyxPQUFPLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRSxNQUFNLFFBQVEsQ0FBQTtBQUNwRSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sV0FBVyxDQUFBO0FBRTFDLFFBQVEsQ0FBQyxnQkFBZ0IsRUFBRSxHQUFHLEVBQUU7SUFDOUIsTUFBTSxjQUFjLEdBQUc7UUFDckIsSUFBSSxFQUFFLGlCQUFpQjtRQUN2QixPQUFPLEVBQUUsT0FBTztRQUNoQixXQUFXLEVBQUUsbUNBQW1DO1FBQ2hELFNBQVMsRUFBRTtZQUNUO2dCQUNFLElBQUksRUFBRSxXQUFXO2dCQUNqQixJQUFJLEVBQUUsb0JBQW9CO2FBQzNCO1NBQ0Y7S0FDRixDQUFBO0lBRUQsSUFBSSxPQUFlLENBQUE7SUFDbkIsSUFBSSxRQUFnQixDQUFBO0lBRXBCLFVBQVUsQ0FBQyxHQUFHLEVBQUU7UUFDZCxPQUFPLEdBQUcsa0JBQWtCLEVBQUUsQ0FBQTtRQUM5QixRQUFRLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsaUJBQWlCLENBQUMsQ0FBQTtJQUNsRCxDQUFDLENBQUMsQ0FBQTtJQUVGLFNBQVMsQ0FBQyxLQUFLLElBQUksRUFBRTtRQUNuQixJQUFJLENBQUM7WUFDSCxNQUFNLEVBQUUsQ0FBQyxFQUFFLENBQUMsT0FBTyxFQUFFLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLENBQUMs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LEdBQUcsQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ2pDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFBO1FBQzlDLENBQUM7SUFDSCxDQUFDLENBQUMsQ0FBQTtBQUNKLENBQUMsQ0FBQyxDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgZnMgZnJvbSBcIm5vZGU6ZnMvcHJvbWlzZXNcIlxuaW1wb3J0ICogYXMgcGF0aCBmcm9tIFwibm9kZTpwYXRoXCJcbmltcG9ydCB7IHRlbXBvcmFyeURpcmVjdG9yeSB9IGZyb20gXCJ0ZW1weVwiXG5pbXBvcnQgeyBhZnRlckVhY2gsIGJlZm9yZUVhY2gsIGRlc2NyaWJlLCBleHBlY3QsIGl0IH0gZnJvbSBcInZpdGVzdFwiXG5pbXBvcnQgeyBzYXZlRGVzY3JpcHRvciB9IGZyb20gXCIuL3NhdmUuanNcIlxuXG5kZXNjcmliZShcInNhdmVEZXNjcmlwdG9yXCIsICgpID0+IHtcbiAgY29uc3QgdGVzdERlc2NyaXB0b3IgPSB7XG4gICAgbmFtZTogXCJ0ZXN0LWRlc2NyaXB0b3JcIixcbiAgICB2ZXJzaW9uOiBcIjEuMC4wXCIsXG4gICAgZGVzY3JpcHRpb246IFwiVGVzdCBkZXNjcmlwdG9yIGZvciBzYXZlIGZ1bmN0aW9uXCIsXG4gICAgcmVzb3VyY2VzOiBbXG4gICAgICB7XG4gICAgICAgIG5hbWU6IFwicmVzb3VyY2UxXCIsXG4gICAgICAgIHBhdGg6IFwiZGF0YS9yZXNvdXJjZTEuY3N2XCIsXG4gICAgICB9LFxuICAgIF0sXG4gIH1cblxuICBsZXQgdGVzdERpcjogc3RyaW5nXG4gIGxldCB0ZXN0UGF0aDogc3RyaW5nXG5cbiAgYmVmb3JlRWFjaCgoKSA9PiB7XG4gICAgdGVzdERpciA9IHRlbXBvcmFyeURpcmVjdG9yeSgpXG4gICAgdGVzdFBhdGggPSBwYXRoLmpvaW4odGVzdERpciwgXCJkZXNjcmlwdG9yLmpzb25cIilcbiAgfSlcblxuICBhZnRlckVhY2goYXN5bmMgKCkgPT4ge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBmcy5ybSh0ZXN0RGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSwgZm9yY2U6IHRydWUgfSlcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IgJiYgIWVycm9yLm1lc3NhZ2UuaW5jbHVkZXMoXCJFTk9FTlRcIikpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihgRmFpbGVkIHRvIGNsZWFuIHVwIHRlc3QgZGlyZWN0b3J5OiAke3Rlc3REaXJ9YCwgZXJyb3IpXG4gICAgICB9XG4gICAgfVxuICB9KVxuXG4gIGl0KFwic2hvdWxkIHNhdmUgYSBkZXNjcmlwdG9yIHRvIHRoZSBzcGVjaWZpZWQgcGF0aFwiLCBhc3luYyAoKSA9PiB7XG4gICAgYXdhaXQgc2F2ZURlc2NyaXB0b3IodGVzdERlc2NyaXB0b3IsIHsgcGF0aDogdGVzdFBhdGggfSlcblxuICAgIGNvbnN0IGZpbGVFeGlzdHMgPSBhd2FpdCBmc1xuICAgICAgLnN0YXQodGVzdFBhdGgpXG4gICAgICAudGhlbigoKSA9PiB0cnVlKVxuICAgICAgLmNhdGNoKCgpID0+IGZhbHNlKVxuICAgIGV4cGVjdChmaWxlRXhpc3RzKS50b0JlKHRydWUpXG5cbiAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgZnMucmVhZEZpbGUodGVzdFBhdGgsIFwidXRmLThcIilcbiAgICBjb25zdCBwYXJzZWRDb250ZW50ID0gSlNPTi5wYXJzZShjb250ZW50KVxuICAgIGV4cGVjdChwYXJzZWRDb250ZW50KS50b0VxdWFsKHRlc3REZXNjcmlwdG9yKVxuICB9KVxuXG4gIGl0KFwic2hvdWxkIHNhdmUgYSBkZXNjcmlwdG9yIHRvIGEgbmVzdGVkIGRpcmVjdG9yeSBwYXRoXCIsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBuZXN0ZWRQYXRoID0gcGF0aC5qb2luKHRlc3REaXIsIFwibmVzdGVkXCIsIFwiZGlyXCIsIFwiZGVzY3JpcHRvci5qc29uXCIpXG5cbiAgICBhd2FpdCBzYXZlRGVzY3JpcHRvcih0ZXN0RGVzY3JpcHRvciwgeyBwYXRoOiBuZXN0ZWRQYXRoIH0pXG5cbiAgICBjb25zdCBmaWxlRXhpc3RzID0gYXdhaXQgZnNcbiAgICAgIC5zdGF0KG5lc3RlZFBhdGgpXG4gICAgICAudGhlbigoKSA9PiB0cnVlKVxuICAgICAgLmNhdGNoKCgpID0+IGZhbHNlKVxuICAgIGV4cGVjdChmaWxlRXhpc3RzKS50b0JlKHRydWUpXG5cbiAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgZnMucmVhZEZpbGUobmVzdGVkUGF0aCwgXCJ1dGYtOFwiKVxuICAgIGNvbnN0IHBhcnNlZENvbnRlbnQgPSBKU09OLnBhcnNlKGNvbnRlbnQpXG4gICAgZXhwZWN0KHBhcnNlZENvbnRlbnQpLnRvRXF1YWwodGVzdERlc2NyaXB0b3IpXG4gIH0pXG5cbiAgaXQoXCJzaG91bGQgdXNlIHByZXR0eSBmb3JtYXR0aW5nIHdpdGggMi1zcGFjZSBpbmRlbnRhdGlvblwiLCBhc3luYyAoKSA9PiB7XG4gICAgYXdhaXQgc2F2ZURlc2NyaXB0b3IodGVzdERlc2NyaXB0b3IsIHsgcGF0aDogdGVzdFBhdGggfSlcblxuICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCBmcy5yZWFkRmlsZSh0ZXN0UGF0aCwgXCJ1dGYtOFwiKVxuICAgIGNvbnN0IGV4cGVjdGVkRm9ybWF0ID0gSlNPTi5zdHJpbmdpZnkodGVzdERlc2NyaXB0b3IsIG51bGwsIDIpXG4gICAgZXhwZWN0KGNvbnRlbnQpLnRvRXF1YWwoZXhwZWN0ZWRGb3JtYXQpXG5cbiAgICBjb25zdCBsaW5lcyA9IGNvbnRlbnQuc3BsaXQoXCJcXG5cIilcbiAgICBleHBlY3QobGluZXMubGVuZ3RoKS50b0JlR3JlYXRlclRoYW4oMSlcblxuICAgIGlmIChsaW5lcy5sZW5ndGggPiAxICYmIGxpbmVzWzFdKSB7XG4gICAgICBleHBlY3QobGluZXNbMV0uc3RhcnRzV2l0aChcIiAgXCIpKS50b0JlKHRydWUpXG4gICAgfVxuICB9KVxufSlcbiJdfQ==