fix tests. new product advisories enhancements

This commit is contained in:
master
2026-01-25 19:11:36 +02:00
parent c70e83719e
commit 6e687b523a
504 changed files with 40610 additions and 3785 deletions

View File

@@ -20,12 +20,16 @@ public sealed class GraphSnapshotBuilder
var nodes = batch.Nodes;
var edges = batch.Edges;
var nodesById = nodes.ToImmutableDictionary(
node => node["id"]!.GetValue<string>(),
node => node,
StringComparer.Ordinal);
var nodesById = nodes
.GroupBy(node => node["id"]!.GetValue<string>(), StringComparer.Ordinal)
.ToImmutableDictionary(
g => g.Key,
g => g.First(),
StringComparer.Ordinal);
var artifactNodeId = ResolveArtifactNodeId(sbomSnapshot, nodes);
var artifactNodeId = nodes.Length > 0
? ResolveArtifactNodeId(sbomSnapshot, nodes)
: string.Empty;
var snapshotId = ComputeSnapshotId(tenant, sbomSnapshot.ArtifactDigest, sbomSnapshot.SbomDigest);
var derivedSbomDigests = sbomSnapshot.BaseArtifacts
@@ -308,6 +312,15 @@ public sealed class GraphSnapshotBuilder
var kind = kindNode.GetValue<string>();
if (!edge.TryGetPropertyValue("canonical_key", out var canonicalKeyNode) || canonicalKeyNode is null)
{
// Fallback to simple source/target properties when canonical_key is absent
if (edge.TryGetPropertyValue("source", out var fallbackSource) && fallbackSource is not null &&
edge.TryGetPropertyValue("target", out var fallbackTarget) && fallbackTarget is not null)
{
sourceNodeId = fallbackSource.GetValue<string>();
targetNodeId = fallbackTarget.GetValue<string>();
return nodesById.ContainsKey(sourceNodeId) && nodesById.ContainsKey(targetNodeId);
}
sourceNodeId = string.Empty;
targetNodeId = string.Empty;
return false;
@@ -355,6 +368,10 @@ public sealed class GraphSnapshotBuilder
artifactNodeByDigest.TryGetValue(builtTargetDigest.GetValue<string>(), out target);
}
break;
case "SBOM_VERSION_OF":
source = canonicalKey.TryGetPropertyValue("sbom_node_id", out var sbomSource) ? sbomSource?.GetValue<string>() : null;
target = canonicalKey.TryGetPropertyValue("artifact_node_id", out var sbomTarget) ? sbomTarget?.GetValue<string>() : null;
break;
case "DEPENDS_ON":
source = canonicalKey.TryGetPropertyValue("component_node_id", out var dependsSource) ? dependsSource?.GetValue<string>() : null;
if (canonicalKey.TryGetPropertyValue("dependency_node_id", out var dependsTargetNode) && dependsTargetNode is not null)

View File

@@ -37,7 +37,10 @@ public sealed class GraphInspectorTransformer
foreach (var component in snapshot.Components)
{
var componentNode = GetOrCreateComponentNode(snapshot, componentNodes, component, component.Provenance);
nodes.Add(componentNode);
if (!nodes.Any(n => n["id"]!.GetValue<string>() == componentNode["id"]!.GetValue<string>()))
{
nodes.Add(componentNode);
}
foreach (var relationship in component.Relationships ?? Array.Empty<GraphInspectorRelationship>())
{
@@ -56,7 +59,10 @@ public sealed class GraphInspectorTransformer
},
relationship.Provenance);
nodes.Add(targetNode);
if (!nodes.Any(n => n["id"]!.GetValue<string>() == targetNode["id"]!.GetValue<string>()))
{
nodes.Add(targetNode);
}
var edge = CreateRelationshipEdge(snapshot, componentNode, targetNode, relationship);
edges.Add(edge);
@@ -112,7 +118,10 @@ public sealed class GraphInspectorTransformer
new GraphInspectorComponent { Purl = targetPurl },
provenanceOverride: null);
componentNodes[key] = targetNode;
nodes.Add(targetNode);
if (!nodes.Any(n => n["id"]!.GetValue<string>() == targetNode["id"]!.GetValue<string>()))
{
nodes.Add(targetNode);
}
}
var orderedNodes = nodes