audit notes work completed, test fixes work (95% done), new sprints, new data sources setup and configuration
This commit is contained in:
@@ -0,0 +1,208 @@
|
||||
using StellaOps.SbomService.Lineage.Domain;
|
||||
using Xunit;
|
||||
|
||||
namespace StellaOps.SbomService.Lineage.Tests.Domain;
|
||||
|
||||
/// <summary>
|
||||
/// Tests for lineage domain models.
|
||||
/// </summary>
|
||||
public sealed class LineageModelsTests
|
||||
{
|
||||
[Fact]
|
||||
public void LineageNode_RequiredProperties_MustBeSet()
|
||||
{
|
||||
var node = new LineageNode(
|
||||
ArtifactDigest: "sha256:abc123",
|
||||
SbomVersionId: Guid.NewGuid(),
|
||||
SequenceNumber: 1,
|
||||
CreatedAt: DateTimeOffset.UtcNow,
|
||||
Metadata: null);
|
||||
|
||||
Assert.Equal("sha256:abc123", node.ArtifactDigest);
|
||||
Assert.Equal(1, node.SequenceNumber);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void LineageNode_WithMetadata_ContainsLabels()
|
||||
{
|
||||
var metadata = new LineageNodeMetadata(
|
||||
ImageReference: "myregistry.io/app:v1",
|
||||
Repository: "myorg/app",
|
||||
Tag: "v1.0.0",
|
||||
CommitSha: "abc123def456",
|
||||
Labels: new Dictionary<string, string> { ["env"] = "prod" });
|
||||
|
||||
var node = new LineageNode(
|
||||
ArtifactDigest: "sha256:metadata",
|
||||
SbomVersionId: null,
|
||||
SequenceNumber: 2,
|
||||
CreatedAt: DateTimeOffset.UtcNow,
|
||||
Metadata: metadata);
|
||||
|
||||
Assert.NotNull(node.Metadata);
|
||||
Assert.Equal("myregistry.io/app:v1", node.Metadata.ImageReference);
|
||||
Assert.Equal("prod", node.Metadata.Labels!["env"]);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void LineageEdge_RequiredProperties_MustBeSet()
|
||||
{
|
||||
var edge = new LineageEdge(
|
||||
Id: Guid.NewGuid(),
|
||||
ParentDigest: "sha256:parent",
|
||||
ChildDigest: "sha256:child",
|
||||
Relationship: LineageRelationship.Parent,
|
||||
TenantId: Guid.NewGuid(),
|
||||
CreatedAt: DateTimeOffset.UtcNow);
|
||||
|
||||
Assert.Equal("sha256:parent", edge.ParentDigest);
|
||||
Assert.Equal("sha256:child", edge.ChildDigest);
|
||||
Assert.Equal(LineageRelationship.Parent, edge.Relationship);
|
||||
}
|
||||
|
||||
[Theory]
|
||||
[InlineData(LineageRelationship.Parent)]
|
||||
[InlineData(LineageRelationship.Build)]
|
||||
[InlineData(LineageRelationship.Base)]
|
||||
public void LineageRelationship_AllValues_AreValid(LineageRelationship relationship)
|
||||
{
|
||||
var edge = new LineageEdge(
|
||||
Id: Guid.NewGuid(),
|
||||
ParentDigest: "sha256:p",
|
||||
ChildDigest: "sha256:c",
|
||||
Relationship: relationship,
|
||||
TenantId: Guid.NewGuid(),
|
||||
CreatedAt: DateTimeOffset.UtcNow);
|
||||
|
||||
Assert.Equal(relationship, edge.Relationship);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void LineageGraph_ContainsNodesAndEdges()
|
||||
{
|
||||
var nodes = new List<LineageNode>
|
||||
{
|
||||
new("sha256:root", null, 1, DateTimeOffset.UtcNow, null),
|
||||
new("sha256:child", null, 2, DateTimeOffset.UtcNow, null)
|
||||
};
|
||||
|
||||
var edges = new List<LineageEdge>
|
||||
{
|
||||
new(Guid.NewGuid(), "sha256:root", "sha256:child", LineageRelationship.Parent, Guid.NewGuid(), DateTimeOffset.UtcNow)
|
||||
};
|
||||
|
||||
var graph = new LineageGraph(nodes, edges);
|
||||
|
||||
Assert.Equal(2, graph.Nodes.Count);
|
||||
Assert.Single(graph.Edges);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void VexDelta_RequiredProperties_MustBeSet()
|
||||
{
|
||||
var delta = new VexDelta(
|
||||
Id: Guid.NewGuid(),
|
||||
TenantId: Guid.NewGuid(),
|
||||
FromArtifactDigest: "sha256:from",
|
||||
ToArtifactDigest: "sha256:to",
|
||||
Cve: "CVE-2026-0001",
|
||||
FromStatus: VexStatus.Affected,
|
||||
ToStatus: VexStatus.Fixed,
|
||||
Rationale: new VexDeltaRationale("Patched", ["commit:abc"], null),
|
||||
ReplayHash: "blake3:replay",
|
||||
AttestationDigest: "sha256:attest",
|
||||
CreatedAt: DateTimeOffset.UtcNow);
|
||||
|
||||
Assert.Equal("CVE-2026-0001", delta.Cve);
|
||||
Assert.Equal(VexStatus.Affected, delta.FromStatus);
|
||||
Assert.Equal(VexStatus.Fixed, delta.ToStatus);
|
||||
}
|
||||
|
||||
[Theory]
|
||||
[InlineData(VexStatus.Unknown)]
|
||||
[InlineData(VexStatus.UnderInvestigation)]
|
||||
[InlineData(VexStatus.Affected)]
|
||||
[InlineData(VexStatus.NotAffected)]
|
||||
[InlineData(VexStatus.Fixed)]
|
||||
public void VexStatus_AllValues_AreValid(VexStatus status)
|
||||
{
|
||||
var delta = new VexDelta(
|
||||
Id: Guid.NewGuid(),
|
||||
TenantId: Guid.NewGuid(),
|
||||
FromArtifactDigest: "sha256:f",
|
||||
ToArtifactDigest: "sha256:t",
|
||||
Cve: "CVE-2026-0002",
|
||||
FromStatus: status,
|
||||
ToStatus: status,
|
||||
Rationale: new VexDeltaRationale("test", [], null),
|
||||
ReplayHash: "blake3:test",
|
||||
AttestationDigest: null,
|
||||
CreatedAt: DateTimeOffset.UtcNow);
|
||||
|
||||
Assert.Equal(status, delta.FromStatus);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void VexDeltaRationale_WithEvidencePointers_ContainsEvidence()
|
||||
{
|
||||
var rationale = new VexDeltaRationale(
|
||||
Reason: "Vulnerability patched in upstream",
|
||||
EvidencePointers: [
|
||||
"commit:abc123",
|
||||
"advisory:DSA-1234",
|
||||
"proof:blake3:xyz"
|
||||
],
|
||||
Metadata: new Dictionary<string, string>
|
||||
{
|
||||
["confidence"] = "0.95",
|
||||
["source"] = "oval"
|
||||
});
|
||||
|
||||
Assert.Equal(3, rationale.EvidencePointers.Count);
|
||||
Assert.Contains("commit:abc123", rationale.EvidencePointers);
|
||||
Assert.Equal("0.95", rationale.Metadata!["confidence"]);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void SbomVerdictLink_RequiredProperties_MustBeSet()
|
||||
{
|
||||
var link = new SbomVerdictLink(
|
||||
SbomVersionId: Guid.NewGuid(),
|
||||
Cve: "CVE-2026-0003",
|
||||
ConsensusProjectionId: Guid.NewGuid(),
|
||||
VerdictStatus: VexStatus.NotAffected,
|
||||
ConfidenceScore: 0.92m,
|
||||
TenantId: Guid.NewGuid(),
|
||||
LinkedAt: DateTimeOffset.UtcNow);
|
||||
|
||||
Assert.Equal("CVE-2026-0003", link.Cve);
|
||||
Assert.Equal(VexStatus.NotAffected, link.VerdictStatus);
|
||||
Assert.Equal(0.92m, link.ConfidenceScore);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void LineageQueryOptions_DefaultValues_AreSet()
|
||||
{
|
||||
var options = new LineageQueryOptions();
|
||||
|
||||
Assert.Equal(10, options.MaxDepth);
|
||||
Assert.True(options.IncludeVerdicts);
|
||||
Assert.True(options.IncludeBadges);
|
||||
Assert.False(options.IncludeReachability);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void LineageQueryOptions_CanBeCustomized()
|
||||
{
|
||||
var options = new LineageQueryOptions(
|
||||
MaxDepth: 5,
|
||||
IncludeVerdicts: false,
|
||||
IncludeBadges: false,
|
||||
IncludeReachability: true);
|
||||
|
||||
Assert.Equal(5, options.MaxDepth);
|
||||
Assert.False(options.IncludeVerdicts);
|
||||
Assert.False(options.IncludeBadges);
|
||||
Assert.True(options.IncludeReachability);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,31 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
<PropertyGroup>
|
||||
<TargetFramework>net10.0</TargetFramework>
|
||||
<Nullable>enable</Nullable>
|
||||
<ImplicitUsings>enable</ImplicitUsings>
|
||||
<LangVersion>preview</LangVersion>
|
||||
<TreatWarningsAsErrors>true</TreatWarningsAsErrors>
|
||||
<IsPackable>false</IsPackable>
|
||||
<OutputType>Exe</OutputType>
|
||||
<UseXunitV3>true</UseXunitV3>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<Using Include="Xunit" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="Microsoft.Extensions.Caching.Abstractions" />
|
||||
<PackageReference Include="Microsoft.Extensions.Logging.Abstractions" />
|
||||
<PackageReference Include="Moq" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\..\__Libraries\StellaOps.SbomService.Lineage\StellaOps.SbomService.Lineage.csproj" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<Content Include="xunit.runner.json" CopyToOutputDirectory="PreserveNewest" />
|
||||
</ItemGroup>
|
||||
</Project>
|
||||
@@ -0,0 +1,7 @@
|
||||
{
|
||||
"$schema": "https://xunit.net/schema/current/xunit.runner.schema.json",
|
||||
"diagnosticMessages": true,
|
||||
"parallelizeAssembly": true,
|
||||
"parallelizeTestCollections": true,
|
||||
"maxParallelThreads": -1
|
||||
}
|
||||
Reference in New Issue
Block a user