Add unit tests for SBOM ingestion and transformation
Some checks failed
Docs CI / lint-and-preview (push) Has been cancelled

- Implement `SbomIngestServiceCollectionExtensionsTests` to verify the SBOM ingestion pipeline exports snapshots correctly.
- Create `SbomIngestTransformerTests` to ensure the transformation produces expected nodes and edges, including deduplication of license nodes and normalization of timestamps.
- Add `SbomSnapshotExporterTests` to test the export functionality for manifest, adjacency, nodes, and edges.
- Introduce `VexOverlayTransformerTests` to validate the transformation of VEX nodes and edges.
- Set up project file for the test project with necessary dependencies and configurations.
- Include JSON fixture files for testing purposes.
This commit is contained in:
master
2025-11-04 07:49:39 +02:00
parent f72c5c513a
commit 2eb6852d34
491 changed files with 39445 additions and 3917 deletions

View File

@@ -0,0 +1,85 @@
using System.Text.Json.Nodes;
namespace StellaOps.Findings.Ledger.Domain;
public sealed record LedgerEventDraft(
string TenantId,
Guid ChainId,
long SequenceNumber,
Guid EventId,
string EventType,
string PolicyVersion,
string FindingId,
string ArtifactId,
Guid? SourceRunId,
string ActorId,
string ActorType,
DateTimeOffset OccurredAt,
DateTimeOffset RecordedAt,
JsonObject Payload,
JsonObject CanonicalEnvelope,
string? ProvidedPreviousHash);
public sealed record LedgerEventRecord(
string TenantId,
Guid ChainId,
long SequenceNumber,
Guid EventId,
string EventType,
string PolicyVersion,
string FindingId,
string ArtifactId,
Guid? SourceRunId,
string ActorId,
string ActorType,
DateTimeOffset OccurredAt,
DateTimeOffset RecordedAt,
JsonObject EventBody,
string EventHash,
string PreviousHash,
string MerkleLeafHash,
string CanonicalJson);
public sealed record LedgerChainHead(
long SequenceNumber,
string EventHash,
DateTimeOffset RecordedAt);
public enum LedgerWriteStatus
{
Success,
Idempotent,
ValidationFailed,
Conflict
}
public sealed record LedgerWriteResult(
LedgerWriteStatus Status,
LedgerEventRecord? Record,
IReadOnlyList<string> Errors,
LedgerEventRecord? ExistingRecord,
string? ConflictCode)
{
public static LedgerWriteResult ValidationFailed(params string[] errors)
=> new(LedgerWriteStatus.ValidationFailed, null, errors, null, null);
public static LedgerWriteResult Conflict(string code, params string[] errors)
=> new(LedgerWriteStatus.Conflict, null, errors, null, code);
public static LedgerWriteResult Idempotent(LedgerEventRecord record)
=> new(LedgerWriteStatus.Idempotent, record, Array.Empty<string>(), record, null);
public static LedgerWriteResult Success(LedgerEventRecord record)
=> new(LedgerWriteStatus.Success, record, Array.Empty<string>(), null, null);
}
public sealed class LedgerDuplicateEventException : Exception
{
public LedgerDuplicateEventException(Guid eventId, Exception innerException)
: base($"Ledger event {eventId} already exists.", innerException)
{
EventId = eventId;
}
public Guid EventId { get; }
}