UNPKG

@dpkit/ckan

Version:

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

101 lines 15.6 kB
import { describe, expect, it } from "vitest"; import ckanPackageFixture from "../fixtures/ckan-package.json" with { type: "json" }; import { normalizeCkanPackage } from "./normalize.js"; describe("normalizeCkanPackage", () => { it("normalizes a CKAN package to a Frictionless Data Package", () => { // Arrange const ckanPackage = ckanPackageFixture; // Act const result = normalizeCkanPackage(ckanPackage); // Assert // Basic metadata expect(result.name).toEqual(ckanPackage.name); expect(result.title).toEqual(ckanPackage.title); expect(result.description).toEqual(ckanPackage.notes); expect(result.version).toEqual(ckanPackage.version); expect(result.created).toEqual(ckanPackage.metadata_created); // License expect(result.licenses).toHaveLength(1); if (result.licenses && result.licenses.length > 0 && result.licenses[0]) { const license = result.licenses[0]; if (ckanPackage.license_id) expect(license.name).toEqual(ckanPackage.license_id); if (ckanPackage.license_title) expect(license.title).toEqual(ckanPackage.license_title); if (ckanPackage.license_url) expect(license.path).toEqual(ckanPackage.license_url); } // Contributors expect(result.contributors).toHaveLength(2); // Author if (result.contributors) { const author = result.contributors.find(c => c.role === "author"); expect(author).toBeTruthy(); if (author) { expect(author.title).toEqual(ckanPackage.author); expect(author.email).toEqual(ckanPackage.author_email); } // Maintainer const maintainer = result.contributors.find(c => c.role === "maintainer"); expect(maintainer).toBeTruthy(); if (maintainer) { expect(maintainer.title).toEqual(ckanPackage.maintainer); expect(maintainer.email).toEqual(ckanPackage.maintainer_email); } } // Keywords expect(result.keywords).toHaveLength(ckanPackage.tags.length); expect(result.keywords).toEqual(ckanPackage.tags.map(tag => tag.name)); // Resources expect(result.resources).toHaveLength(ckanPackage.resources.length); // Verify first resource const firstCkanResource = ckanPackage.resources[0]; const firstResource = result.resources[0]; // Ensure resources exist before testing them expect(firstCkanResource).toBeDefined(); expect(firstResource).toBeDefined(); if (firstResource && firstCkanResource) { expect(firstResource.path).toEqual(firstCkanResource.url); // Name is slugified expect(firstResource.name).toMatch(/^sample[-_]linked[-_]csv$/); expect(firstResource.description).toEqual(firstCkanResource.description); expect(firstResource.format).toEqual(firstCkanResource.format?.toLowerCase()); expect(firstResource.mediatype).toEqual(firstCkanResource.mimetype); } }); it("handles empty resources array", () => { // Arrange const ckanPackage = { ...ckanPackageFixture, resources: [], }; // Act const result = normalizeCkanPackage(ckanPackage); // Assert expect(result.resources).toEqual([]); }); it("handles undefined optional properties", () => { // Arrange const ckanPackage = { resources: [], tags: [], // Only required properties }; // Act // @ts-ignore const result = normalizeCkanPackage(ckanPackage); // Assert expect(result.name).toBeUndefined(); expect(result.title).toBeUndefined(); expect(result.description).toBeUndefined(); expect(result.version).toBeUndefined(); expect(result.created).toBeUndefined(); expect(result.licenses).toBeUndefined(); expect(result.contributors).toBeUndefined(); expect(result.keywords).toBeUndefined(); expect(result.resources).toEqual([]); }); }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm9ybWFsaXplLnNwZWMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9wYWNrYWdlL3Byb2Nlc3Mvbm9ybWFsaXplLnNwZWMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLE1BQU0sUUFBUSxDQUFBO0FBRTdDLE9BQU8sa0JBQWtCLE1BQU0sK0JBQStCLENBQUM7SUFDN0QsSUFBSSxFQUFFLE1BQU07Q0FDYixDQUFBO0FBQ0QsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sZ0JBQWdCLENBQUE7QUFFckQsUUFBUSxDQUFDLHNCQUFzQixFQUFFLEdBQUcsRUFBRTtJQUNwQyxFQUFFLENBQUMsMERBQTBELEVBQUUsR0FBRyxFQUFFO1FBQ2xFLFVBQVU7UUFDVixNQUFNLFdBQVcsR0FBRyxrQkFBaUMsQ0FBQTtRQUVyRCxNQUFNO1FBQ04sTUFBTSxNQUFNLEdBQUcsb0JBQW9CLENBQUMsV0FBVyxDQUFDLENBQUE7UUFFaEQsU0FBUztRQUNULGlCQUFpQjtRQUNqQixNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUE7UUFDN0MsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFBO1FBQy9DLE1BQU0sQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQTtRQUNyRCxNQUFNLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUE7UUFDbkQsTUFBTSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLGdCQUFnQixDQUFDLENBQUE7UUFFNUQsVUFBVTtR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QUF1QyxFQUFFLEdBQUcsRUFBRTtRQUMvQyxVQUFVO1FBQ1YsTUFBTSxXQUFXLEdBQXlCO1lBQ3hDLFNBQVMsRUFBRSxFQUFFO1lBQ2IsSUFBSSxFQUFFLEVBQUU7WUFDUiwyQkFBMkI7U0FDNUIsQ0FBQTtRQUVELE1BQU07UUFDTixhQUFhO1FBQ2IsTUFBTSxNQUFNLEdBQUcsb0JBQW9CLENBQUMsV0FBVyxDQUFDLENBQUE7UUFFaEQsU0FBUztRQUNULE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsYUFBYSxFQUFFLENBQUE7UUFDbkMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxhQUFhLEVBQUUsQ0FBQTtRQUNwQyxNQUFNLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDLGFBQWEsRUFBRSxDQUFBO1FBQzFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsYUFBYSxFQUFFLENBQUE7UUFDdEMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxhQUFhLEVBQUUsQ0FBQTtRQUN0QyxNQUFNLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLGFBQWEsRUFBRSxDQUFBO1FBQ3ZDLE1BQU0sQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUMsYUFBYSxFQUFFLENBQUE7UUFDM0MsTUFBTSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxhQUFhLEVBQUUsQ0FBQTtRQUN2QyxNQUFNLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQTtJQUN0QyxDQUFDLENBQUMsQ0FBQTtBQUNKLENBQUMsQ0FBQyxDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZGVzY3JpYmUsIGV4cGVjdCwgaXQgfSBmcm9tIFwidml0ZXN0XCJcbmltcG9ydCB0eXBlIHsgQ2thblBhY2thZ2UgfSBmcm9tIFwiLi4vUGFja2FnZS5qc1wiXG5pbXBvcnQgY2thblBhY2thZ2VGaXh0dXJlIGZyb20gXCIuLi9maXh0dXJlcy9ja2FuLXBhY2thZ2UuanNvblwiIHdpdGgge1xuICB0eXBlOiBcImpzb25cIixcbn1cbmltcG9ydCB7IG5vcm1hbGl6ZUNrYW5QYWNrYWdlIH0gZnJvbSBcIi4vbm9ybWFsaXplLmpzXCJcblxuZGVzY3JpYmUoXCJub3JtYWxpemVDa2FuUGFja2FnZVwiLCAoKSA9PiB7XG4gIGl0KFwibm9ybWFsaXplcyBhIENLQU4gcGFja2FnZSB0byBhIEZyaWN0aW9ubGVzcyBEYXRhIFBhY2thZ2VcIiwgKCkgPT4ge1xuICAgIC8vIEFycmFuZ2VcbiAgICBjb25zdCBja2FuUGFja2FnZSA9IGNrYW5QYWNrYWdlRml4dHVyZSBhcyBDa2FuUGFja2FnZVxuXG4gICAgLy8gQWN0XG4gICAgY29uc3QgcmVzdWx0ID0gbm9ybWFsaXplQ2thblBhY2thZ2UoY2thblBhY2thZ2UpXG5cbiAgICAvLyBBc3NlcnRcbiAgICAvLyBCYXNpYyBtZXRhZGF0YVxuICAgIGV4cGVjdChyZXN1bHQubmFtZSkudG9FcXVhbChja2FuUGFja2FnZS5uYW1lKVxuICAgIGV4cGVjdChyZXN1bHQudGl0bGUpLnRvRXF1YWwoY2thblBhY2thZ2UudGl0bGUpXG4gICAgZXhwZWN0KHJlc3VsdC5kZXNjcmlwdGlvbikudG9FcXVhbChja2FuUGFja2FnZS5ub3RlcylcbiAgICBleHBlY3QocmVzdWx0LnZlcnNpb24pLnRvRXF1YWwoY2thblBhY2thZ2UudmVyc2lvbilcbiAgICBleHBlY3QocmVzdWx0LmNyZWF0ZWQpLnRvRXF1YWwoY2thblBhY2thZ2UubWV0YWRhdGFfY3JlYXRlZClcblxuICAgIC8vIExpY2Vuc2VcbiAgICBleHBlY3QocmVzdWx0LmxpY2Vuc2VzKS50b0hhdmVMZW5ndGgoMSlcbiAgICBpZiAocmVzdWx0LmxpY2Vuc2VzICYmIHJlc3VsdC5saWNlbnNlcy5sZW5ndGggPiAwICYmIHJlc3VsdC5saWNlbnNlc1swXSkge1xuICAgICAgY29uc3QgbGljZW5zZSA9IHJlc3VsdC5saWNlbnNlc1swXVxuICAgICAgaWYgKGNrYW5QYWNrYWdlLmxpY2Vuc2VfaWQpXG4gICAgICAgIGV4cGVjdChsaWNlbnNlLm5hbWUpLnRvRXF1YWwoY2thblBhY2thZ2UubGljZW5zZV9pZClcbiAgICAgIGlmIChja2FuUGFja2FnZS5saWNlbnNlX3RpdGxlKVxuICAgICAgICBleHBlY3QobGljZW5zZS50aXRsZSkudG9FcXVhbChja2FuUGFja2FnZS5saWNlbnNlX3RpdGxlKVxuICAgICAgaWYgKGNrYW5QYWNrYWdlLmxpY2Vuc2VfdXJsKVxuICAgICAgICBleHBlY3QobGljZW5zZS5wYXRoKS50b0VxdWFsKGNrYW5QYWNrYWdlLmxpY2Vuc2VfdXJsKVxuICAgIH1cblxuICAgIC8vIENvbnRyaWJ1dG9yc1xuICAgIGV4cGVjdChyZXN1bHQuY29udHJpYnV0b3JzKS50b0hhdmVMZW5ndGgoMilcbiAgICAvLyBBdXRob3JcbiAgICBpZiAocmVzdWx0LmNvbnRyaWJ1dG9ycykge1xuICAgICAgY29uc3QgYXV0aG9yID0gcmVzdWx0LmNvbnRyaWJ1dG9ycy5maW5kKGMgPT4gYy5yb2xlID09PSBcImF1dGhvclwiKVxuICAgICAgZXhwZWN0KGF1dGhvcikudG9CZVRydXRoeSgpXG4gICAgICBpZiAoYXV0aG9yKSB7XG4gICAgICAgIGV4cGVjdChhdXRob3IudGl0bGUpLnRvRXF1YWwoY2thblBhY2thZ2UuYXV0aG9yKVxuICAgICAgICBleHBlY3QoYXV0aG9yLmVtYWlsKS50b0VxdWFsKGNrYW5QYWNrYWdlLmF1dGhvcl9lbWFpbClcbiAgICAgIH1cblxuICAgICAgLy8gTWFpbnRhaW5lclxuICAgICAgY29uc3QgbWFpbnRhaW5lciA9IHJlc3VsdC5jb250cmlidXRvcnMuZmluZChjID0+IGMucm9sZSA9PT0gXCJtYWludGFpbmVyXCIpXG4gICAgICBleHBlY3QobWFpbnRhaW5lcikudG9CZVRydXRoeSgpXG4gICAgICBpZiAobWFpbnRhaW5lcikge1xuICAgICAgICBleHBlY3QobWFpbnRhaW5lci50aXRsZSkudG9FcXVhbChja2FuUGFja2FnZS5tYWludGFpbmVyKVxuICAgICAgICBleHBlY3QobWFpbnRhaW5lci5lbWFpbCkudG9FcXVhbChja2FuUGFja2FnZS5tYWludGFpbmVyX2VtYWlsKVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEtleXdvcmRzXG4gICAgZXhwZWN0KHJlc3VsdC5rZXl3b3JkcykudG9IYXZlTGVuZ3RoKGNrYW5QYWNrYWdlLnRhZ3MubGVuZ3RoKVxuICAgIGV4cGVjdChyZXN1bHQua2V5d29yZHMpLnRvRXF1YWwoY2thblBhY2thZ2UudGFncy5tYXAodGFnID0+IHRhZy5uYW1lKSlcblxuICAgIC8vIFJlc291cmNlc1xuICAgIGV4cGVjdChyZXN1bHQucmVzb3VyY2VzKS50b0hhdmVMZW5ndGgoY2thblBhY2thZ2UucmVzb3VyY2VzLmxlbmd0aClcblxuICAgIC8vIFZlcmlmeSBmaXJzdCByZXNvdXJjZVxuICAgIGNvbnN0IGZpcnN0Q2thblJlc291cmNlID0gY2thblBhY2thZ2UucmVzb3VyY2VzWzBdXG4gICAgY29uc3QgZmlyc3RSZXNvdXJjZSA9IHJlc3VsdC5yZXNvdXJjZXNbMF1cblxuICAgIC8vIEVuc3VyZSByZXNvdXJjZXMgZXhpc3QgYmVmb3JlIHRlc3RpbmcgdGhlbVxuICAgIGV4cGVjdChmaXJzdENrYW5SZXNvdXJjZSkudG9CZURlZmluZWQoKVxuICAgIGV4cGVjdChmaXJzdFJlc291cmNlKS50b0JlRGVmaW5lZCgpXG5cbiAgICBpZiAoZmlyc3RSZXNvdXJjZSAmJiBmaXJzdENrYW5SZXNvdXJjZSkge1xuICAgICAgZXhwZWN0KGZpcnN0UmVzb3VyY2UucGF0aCkudG9FcXVhbChmaXJzdENrYW5SZXNvdXJjZS51cmwpXG4gICAgICAvLyBOYW1lIGlzIHNsdWdpZmllZFxuICAgICAgZXhwZWN0KGZpcnN0UmVzb3VyY2UubmFtZSkudG9NYXRjaCgvXnNhbXBsZVstX11saW5rZWRbLV9dY3N2JC8pXG4gICAgICBleHBlY3QoZmlyc3RSZXNvdXJjZS5kZXNjcmlwdGlvbikudG9FcXVhbChmaXJzdENrYW5SZXNvdXJjZS5kZXNjcmlwdGlvbilcbiAgICAgIGV4cGVjdChmaXJzdFJlc291cmNlLmZvcm1hdCkudG9FcXVhbChcbiAgICAgICAgZmlyc3RDa2FuUmVzb3VyY2UuZm9ybWF0Py50b0xvd2VyQ2FzZSgpLFxuICAgICAgKVxuICAgICAgZXhwZWN0KGZpcnN0UmVzb3VyY2UubWVkaWF0eXBlKS50b0VxdWFsKGZpcnN0Q2thblJlc291cmNlLm1pbWV0eXBlKVxuICAgIH1cbiAgfSlcblxuICBpdChcImhhbmRsZXMgZW1wdHkgcmVzb3VyY2VzIGFycmF5XCIsICgpID0+IHtcbiAgICAvLyBBcnJhbmdlXG4gICAgY29uc3QgY2thblBhY2thZ2U6IENrYW5QYWNrYWdlID0ge1xuICAgICAgLi4uKGNrYW5QYWNrYWdlRml4dHVyZSBhcyBDa2FuUGFja2FnZSksXG4gICAgICByZXNvdXJjZXM6IFtdLFxuICAgIH1cblxuICAgIC8vIEFjdFxuICAgIGNvbnN0IHJlc3VsdCA9IG5vcm1hbGl6ZUNrYW5QYWNrYWdlKGNrYW5QYWNrYWdlKVxuXG4gICAgLy8gQXNzZXJ0XG4gICAgZXhwZWN0KHJlc3VsdC5yZXNvdXJjZXMpLnRvRXF1YWwoW10pXG4gIH0pXG5cbiAgaXQoXCJoYW5kbGVzIHVuZGVmaW5lZCBvcHRpb25hbCBwcm9wZXJ0aWVzXCIsICgpID0+IHtcbiAgICAvLyBBcnJhbmdlXG4gICAgY29uc3QgY2thblBhY2thZ2U6IFBhcnRpYWw8Q2thblBhY2thZ2U+ID0ge1xuICAgICAgcmVzb3VyY2VzOiBbXSxcbiAgICAgIHRhZ3M6IFtdLFxuICAgICAgLy8gT25seSByZXF1aXJlZCBwcm9wZXJ0aWVzXG4gICAgfVxuXG4gICAgLy8gQWN0XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIGNvbnN0IHJlc3VsdCA9IG5vcm1hbGl6ZUNrYW5QYWNrYWdlKGNrYW5QYWNrYWdlKVxuXG4gICAgLy8gQXNzZXJ0XG4gICAgZXhwZWN0KHJlc3VsdC5uYW1lKS50b0JlVW5kZWZpbmVkKClcbiAgICBleHBlY3QocmVzdWx0LnRpdGxlKS50b0JlVW5kZWZpbmVkKClcbiAgICBleHBlY3QocmVzdWx0LmRlc2NyaXB0aW9uKS50b0JlVW5kZWZpbmVkKClcbiAgICBleHBlY3QocmVzdWx0LnZlcnNpb24pLnRvQmVVbmRlZmluZWQoKVxuICAgIGV4cGVjdChyZXN1bHQuY3JlYXRlZCkudG9CZVVuZGVmaW5lZCgpXG4gICAgZXhwZWN0KHJlc3VsdC5saWNlbnNlcykudG9CZVVuZGVmaW5lZCgpXG4gICAgZXhwZWN0KHJlc3VsdC5jb250cmlidXRvcnMpLnRvQmVVbmRlZmluZWQoKVxuICAgIGV4cGVjdChyZXN1bHQua2V5d29yZHMpLnRvQmVVbmRlZmluZWQoKVxuICAgIGV4cGVjdChyZXN1bHQucmVzb3VyY2VzKS50b0VxdWFsKFtdKVxuICB9KVxufSlcbiJdfQ==