@cyclonedx/cdxgen
Version:
Creates CycloneDX Software Bill of Materials (SBOM) from source or container image
71 lines (65 loc) • 2.52 kB
JavaScript
import { assert, describe, it } from "poku";
import { toCycloneDxLikeBom } from "./spdxUtils.js";
const sampleSpdx = {
"@context": "https://spdx.org/rdf/3.0.1/spdx-context.jsonld",
"@graph": [
{ type: "CreationInfo", spdxId: "urn:demo#CreationInfo-main" },
{ type: "SpdxDocument", spdxId: "urn:demo#SPDXRef-DOCUMENT" },
{
type: "software_Package",
spdxId: "urn:demo#SPDXRef-app",
name: "app",
software_packageUrl: "pkg:npm/@acme/app@1.2.3",
software_packageVersion: "1.2.3",
},
{
type: "software_Package",
spdxId: "urn:demo#SPDXRef-lib",
name: "lib",
software_packageUrl: "pkg:npm/lodash@4.17.21",
software_packageVersion: "4.17.21",
},
{
type: "Relationship",
spdxId: "urn:demo#Relationship-1",
relationshipType: "dependsOn",
from: "urn:demo#SPDXRef-app",
to: ["urn:demo#SPDXRef-lib"],
},
],
};
describe("spdxUtils", () => {
it("returns non-SPDX BOMs unchanged", () => {
const cyclonedxBom = { bomFormat: "CycloneDX", components: [] };
assert.strictEqual(toCycloneDxLikeBom(cyclonedxBom), cyclonedxBom);
});
it("converts SPDX package and relationship graph into CycloneDX-like components/dependencies", () => {
const converted = toCycloneDxLikeBom(sampleSpdx);
assert.strictEqual(Array.isArray(converted.components), true);
assert.strictEqual(converted.components.length, 2);
assert.strictEqual(converted.components[0].name, "app");
assert.strictEqual(converted.components[0].version, "1.2.3");
assert.strictEqual(Array.isArray(converted.dependencies), true);
const appDependency = converted.dependencies.find(
(dep) => dep.ref === "pkg:npm/@acme/app@1.2.3",
);
assert.ok(appDependency);
assert.deepStrictEqual(appDependency.dependsOn, ["pkg:npm/lodash@4.17.21"]);
});
it("ignores invalid SPDX relationships where 'from' is not a string", () => {
const malformedSpdx = structuredClone(sampleSpdx);
malformedSpdx["@graph"].push({
type: "Relationship",
spdxId: "urn:demo#Relationship-2",
relationshipType: "dependsOn",
from: ["urn:demo#SPDXRef-app"],
to: ["urn:demo#SPDXRef-lib"],
});
const converted = toCycloneDxLikeBom(malformedSpdx);
const appDependency = converted.dependencies.find(
(dep) => dep.ref === "pkg:npm/@acme/app@1.2.3",
);
assert.ok(appDependency);
assert.deepStrictEqual(appDependency.dependsOn, ["pkg:npm/lodash@4.17.21"]);
});
});