save progress

This commit is contained in:
StellaOps Bot
2026-01-03 11:02:24 +02:00
parent ca578801fd
commit 83c37243e0
446 changed files with 22798 additions and 4031 deletions

View File

@@ -67,7 +67,14 @@ public class PoEPipelineTests : IDisposable
.ReturnsAsync(new Dictionary<string, Subgraph?> { ["CVE-2021-44228"] = subgraph });
_emitterMock
.Setup(x => x.EmitPoEAsync(It.IsAny<Subgraph>(), It.IsAny<ProofMetadata>(), It.IsAny<string>(), It.IsAny<string>(), It.IsAny<CancellationToken>()))
.Setup(x => x.EmitPoEAsync(
It.IsAny<Subgraph>(),
It.IsAny<ProofMetadata>(),
It.IsAny<string>(),
It.IsAny<string>(),
It.IsAny<PoEEvidenceRefs>(),
It.IsAny<PoEEmissionOptions>(),
It.IsAny<CancellationToken>()))
.ReturnsAsync(poeBytes);
_emitterMock

View File

@@ -5,6 +5,7 @@
// Description: Model S1 idempotency tests for Scanner scan results storage
// -----------------------------------------------------------------------------
using Dapper;
using FluentAssertions;
using Microsoft.Extensions.Logging.Abstractions;
using Microsoft.Extensions.Options;
@@ -64,6 +65,8 @@ public sealed class ScanResultIdempotencyTests : IAsyncLifetime
// Arrange
var manifest1 = CreateManifest("sha256:manifest1");
var manifest2 = CreateManifest("sha256:manifest1"); // Same hash
await EnsureScanAsync(manifest1.ScanId);
await EnsureScanAsync(manifest2.ScanId);
// Act
var saved1 = await _manifestRepository.SaveAsync(manifest1);
@@ -94,6 +97,7 @@ public sealed class ScanResultIdempotencyTests : IAsyncLifetime
{
// Arrange
var manifest = CreateManifest("sha256:consistent");
await EnsureScanAsync(manifest.ScanId);
await _manifestRepository.SaveAsync(manifest);
// Act - Query same hash multiple times
@@ -121,6 +125,7 @@ public sealed class ScanResultIdempotencyTests : IAsyncLifetime
// Arrange
var scanId = Guid.NewGuid();
var manifest = CreateManifest("sha256:byscan", scanId);
await EnsureScanAsync(scanId);
await _manifestRepository.SaveAsync(manifest);
// Act - Query same scan ID multiple times
@@ -144,6 +149,7 @@ public sealed class ScanResultIdempotencyTests : IAsyncLifetime
{
// Arrange
var manifest = CreateManifest("sha256:complete");
await EnsureScanAsync(manifest.ScanId);
var saved = await _manifestRepository.SaveAsync(manifest);
var completedAt1 = DateTimeOffset.UtcNow;
@@ -191,6 +197,7 @@ public sealed class ScanResultIdempotencyTests : IAsyncLifetime
// Act
foreach (var manifest in manifests)
{
await EnsureScanAsync(manifest.ScanId);
await _manifestRepository.SaveAsync(manifest);
}
@@ -210,6 +217,7 @@ public sealed class ScanResultIdempotencyTests : IAsyncLifetime
var scanId = Guid.NewGuid();
var manifest1 = CreateManifest("sha256:retry1", scanId);
var manifest2 = CreateManifest("sha256:retry2", scanId);
await EnsureScanAsync(scanId);
// Act
await _manifestRepository.SaveAsync(manifest1);
@@ -233,6 +241,19 @@ public sealed class ScanResultIdempotencyTests : IAsyncLifetime
ManifestContent = """{"version": "1.0", "scanner": "stellaops"}""",
ScannerVersion = "1.0.0"
};
private async Task EnsureScanAsync(Guid scanId)
{
var schemaName = _dataSource.SchemaName ?? ScannerDataSource.DefaultSchema;
var sql = $"""
INSERT INTO {schemaName}.scans (scan_id)
VALUES (@ScanId)
ON CONFLICT DO NOTHING
""";
await using var connection = await _dataSource.OpenSystemConnectionAsync();
await connection.ExecuteAsync(sql, new { ScanId = scanId });
}
}

View File

@@ -267,23 +267,40 @@ public sealed class ScannerMigrationTests : IAsyncLifetime
private static IEnumerable<string> GetMigrationFiles()
{
var assembly = typeof(ScannerStorageOptions).Assembly;
var resourceNames = assembly.GetManifestResourceNames()
.Where(n => n.Contains("Migrations") && n.EndsWith(".sql"))
.OrderBy(n => n);
var root = ResolveRepoRoot();
var migrationsPath = Path.Combine(
root,
"src",
"Scanner",
"__Libraries",
"StellaOps.Scanner.Storage",
"Postgres",
"Migrations");
return resourceNames;
return Directory.Exists(migrationsPath)
? Directory.GetFiles(migrationsPath, "*.sql").OrderBy(f => f)
: Enumerable.Empty<string>();
}
private static string GetMigrationContent(string resourceName)
private static string GetMigrationContent(string migrationPath)
{
var assembly = typeof(ScannerStorageOptions).Assembly;
using var stream = assembly.GetManifestResourceStream(resourceName);
if (stream == null)
return string.Empty;
return File.Exists(migrationPath)
? File.ReadAllText(migrationPath)
: string.Empty;
}
using var reader = new StreamReader(stream);
return reader.ReadToEnd();
private static string ResolveRepoRoot()
{
var baseDir = AppContext.BaseDirectory;
return Path.GetFullPath(Path.Combine(
baseDir,
"..",
"..",
"..",
"..",
"..",
"..",
".."));
}
}

View File

@@ -121,8 +121,9 @@ public sealed class SbomUploadEndpointsTests
var repoRoot = Path.GetFullPath(Path.Combine(baseDirectory, "..", "..", "..", "..", ".."));
var path = Path.Combine(
repoRoot,
"tests",
"src",
"AirGap",
"__Tests",
"StellaOps.AirGap.Importer.Tests",
"Reconciliation",
"Fixtures",

View File

@@ -9,6 +9,7 @@ using Microsoft.Extensions.DependencyInjection.Extensions;
using StellaOps.Infrastructure.Postgres.Testing;
using StellaOps.Scanner.Storage;
using StellaOps.Scanner.Surface.Validation;
using StellaOps.Scanner.Triage;
using StellaOps.Scanner.WebService.Diagnostics;
namespace StellaOps.Scanner.WebService.Tests;
@@ -168,5 +169,11 @@ public sealed class ScannerApplicationFactory : WebApplicationFactory<ServiceSta
protected override System.Reflection.Assembly? GetMigrationAssembly() => typeof(ScannerStorageOptions).Assembly;
protected override string GetModuleName() => "Scanner.Storage.WebService.Tests";
public override async ValueTask InitializeAsync()
{
await base.InitializeAsync();
await Fixture.RunMigrationsFromAssemblyAsync<TriageDbContext>("Scanner.Triage.WebService.Tests");
}
}
}

View File

@@ -117,7 +117,14 @@ public class PoEGenerationStageExecutorTests : IDisposable
.ReturnsAsync(new Dictionary<string, PoESubgraph?> { ["CVE-2021-44228"] = subgraph });
_emitterMock
.Setup(x => x.EmitPoEAsync(It.IsAny<PoESubgraph>(), It.IsAny<ProofMetadata>(), It.IsAny<string>(), It.IsAny<string>(), It.IsAny<CancellationToken>()))
.Setup(x => x.EmitPoEAsync(
It.IsAny<PoESubgraph>(),
It.IsAny<ProofMetadata>(),
It.IsAny<string>(),
It.IsAny<string>(),
It.IsAny<PoEEvidenceRefs>(),
It.IsAny<PoEEmissionOptions>(),
It.IsAny<CancellationToken>()))
.ReturnsAsync(poeBytes);
_emitterMock
@@ -171,7 +178,14 @@ public class PoEGenerationStageExecutorTests : IDisposable
.ReturnsAsync(new Dictionary<string, PoESubgraph?> { ["CVE-2021-44228"] = subgraph });
_emitterMock
.Setup(x => x.EmitPoEAsync(It.IsAny<PoESubgraph>(), It.IsAny<ProofMetadata>(), It.IsAny<string>(), It.IsAny<string>(), It.IsAny<CancellationToken>()))
.Setup(x => x.EmitPoEAsync(
It.IsAny<PoESubgraph>(),
It.IsAny<ProofMetadata>(),
It.IsAny<string>(),
It.IsAny<string>(),
It.IsAny<PoEEvidenceRefs>(),
It.IsAny<PoEEmissionOptions>(),
It.IsAny<CancellationToken>()))
.ReturnsAsync(poeBytes);
_emitterMock
@@ -225,7 +239,14 @@ public class PoEGenerationStageExecutorTests : IDisposable
});
_emitterMock
.Setup(x => x.EmitPoEAsync(It.IsAny<PoESubgraph>(), It.IsAny<ProofMetadata>(), It.IsAny<string>(), It.IsAny<string>(), It.IsAny<CancellationToken>()))
.Setup(x => x.EmitPoEAsync(
It.IsAny<PoESubgraph>(),
It.IsAny<ProofMetadata>(),
It.IsAny<string>(),
It.IsAny<string>(),
It.IsAny<PoEEvidenceRefs>(),
It.IsAny<PoEEmissionOptions>(),
It.IsAny<CancellationToken>()))
.ReturnsAsync(poeBytes);
_emitterMock
@@ -272,7 +293,14 @@ public class PoEGenerationStageExecutorTests : IDisposable
.ReturnsAsync(new Dictionary<string, PoESubgraph?> { ["CVE-2021-44228"] = subgraph });
_emitterMock
.Setup(x => x.EmitPoEAsync(It.IsAny<PoESubgraph>(), It.IsAny<ProofMetadata>(), It.IsAny<string>(), It.IsAny<string>(), It.IsAny<CancellationToken>()))
.Setup(x => x.EmitPoEAsync(
It.IsAny<PoESubgraph>(),
It.IsAny<ProofMetadata>(),
It.IsAny<string>(),
It.IsAny<string>(),
It.IsAny<PoEEvidenceRefs>(),
It.IsAny<PoEEmissionOptions>(),
It.IsAny<CancellationToken>()))
.ReturnsAsync(poeBytes);
_emitterMock

View File

@@ -91,7 +91,14 @@ public class PoEOrchestratorDirectTests : IDisposable
_output.WriteLine("Setting up emitter mocks...");
_emitterMock
.Setup(x => x.EmitPoEAsync(It.IsAny<PoESubgraph>(), It.IsAny<ProofMetadata>(), It.IsAny<string>(), It.IsAny<string>(), It.IsAny<CancellationToken>()))
.Setup(x => x.EmitPoEAsync(
It.IsAny<PoESubgraph>(),
It.IsAny<ProofMetadata>(),
It.IsAny<string>(),
It.IsAny<string>(),
It.IsAny<PoEEvidenceRefs>(),
It.IsAny<PoEEmissionOptions>(),
It.IsAny<CancellationToken>()))
.ReturnsAsync(poeBytes)
.Verifiable();