finish secrets finding work and audit remarks work save
This commit is contained in:
@@ -1,5 +1,6 @@
|
||||
using System.Text.Json;
|
||||
using FluentAssertions;
|
||||
using Microsoft.Extensions.Time.Testing;
|
||||
using StellaOps.Scanner.Sources.Domain;
|
||||
using Xunit;
|
||||
|
||||
@@ -7,6 +8,13 @@ namespace StellaOps.Scanner.Sources.Tests.Domain;
|
||||
|
||||
public class SbomSourceTests
|
||||
{
|
||||
private readonly FakeTimeProvider _timeProvider;
|
||||
|
||||
public SbomSourceTests()
|
||||
{
|
||||
_timeProvider = new FakeTimeProvider(new DateTimeOffset(2025, 1, 15, 10, 0, 0, TimeSpan.Zero));
|
||||
}
|
||||
|
||||
private static readonly JsonDocument SampleConfig = JsonDocument.Parse("""
|
||||
{
|
||||
"registryType": "Harbor",
|
||||
@@ -23,14 +31,15 @@ public class SbomSourceTests
|
||||
name: "test-source",
|
||||
sourceType: SbomSourceType.Zastava,
|
||||
configuration: SampleConfig,
|
||||
createdBy: "user-1");
|
||||
createdBy: "user-1",
|
||||
timeProvider: _timeProvider);
|
||||
|
||||
// Assert
|
||||
source.SourceId.Should().NotBeEmpty();
|
||||
source.TenantId.Should().Be("tenant-1");
|
||||
source.Name.Should().Be("test-source");
|
||||
source.SourceType.Should().Be(SbomSourceType.Zastava);
|
||||
source.Status.Should().Be(SbomSourceStatus.Draft);
|
||||
source.Status.Should().Be(SbomSourceStatus.Pending);
|
||||
source.CreatedBy.Should().Be("user-1");
|
||||
source.Paused.Should().BeFalse();
|
||||
source.ConsecutiveFailures.Should().Be(0);
|
||||
@@ -46,16 +55,17 @@ public class SbomSourceTests
|
||||
sourceType: SbomSourceType.Docker,
|
||||
configuration: SampleConfig,
|
||||
createdBy: "user-1",
|
||||
timeProvider: _timeProvider,
|
||||
cronSchedule: "0 * * * *"); // Every hour
|
||||
|
||||
// Assert
|
||||
source.CronSchedule.Should().Be("0 * * * *");
|
||||
source.NextScheduledRun.Should().NotBeNull();
|
||||
source.NextScheduledRun.Should().BeAfter(DateTimeOffset.UtcNow);
|
||||
source.NextScheduledRun.Should().BeAfter(_timeProvider.GetUtcNow());
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Create_WithZastavaType_GeneratesWebhookEndpointAndSecret()
|
||||
public void Create_WithZastavaType_GeneratesWebhookEndpoint()
|
||||
{
|
||||
// Arrange & Act
|
||||
var source = SbomSource.Create(
|
||||
@@ -63,16 +73,16 @@ public class SbomSourceTests
|
||||
name: "webhook-source",
|
||||
sourceType: SbomSourceType.Zastava,
|
||||
configuration: SampleConfig,
|
||||
createdBy: "user-1");
|
||||
createdBy: "user-1",
|
||||
timeProvider: _timeProvider);
|
||||
|
||||
// Assert
|
||||
source.WebhookEndpoint.Should().NotBeNullOrEmpty();
|
||||
source.WebhookSecret.Should().NotBeNullOrEmpty();
|
||||
source.WebhookSecret!.Length.Should().BeGreaterOrEqualTo(32);
|
||||
source.WebhookSecretRef.Should().NotBeNullOrEmpty();
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Activate_FromDraft_ChangesStatusToActive()
|
||||
public void Activate_FromPending_ChangesStatusToActive()
|
||||
{
|
||||
// Arrange
|
||||
var source = SbomSource.Create(
|
||||
@@ -80,10 +90,11 @@ public class SbomSourceTests
|
||||
name: "test-source",
|
||||
sourceType: SbomSourceType.Docker,
|
||||
configuration: SampleConfig,
|
||||
createdBy: "user-1");
|
||||
createdBy: "user-1",
|
||||
timeProvider: _timeProvider);
|
||||
|
||||
// Act
|
||||
source.Activate("activator");
|
||||
source.Activate("activator", _timeProvider);
|
||||
|
||||
// Assert
|
||||
source.Status.Should().Be(SbomSourceStatus.Active);
|
||||
@@ -99,11 +110,12 @@ public class SbomSourceTests
|
||||
name: "test-source",
|
||||
sourceType: SbomSourceType.Docker,
|
||||
configuration: SampleConfig,
|
||||
createdBy: "user-1");
|
||||
source.Activate("activator");
|
||||
createdBy: "user-1",
|
||||
timeProvider: _timeProvider);
|
||||
source.Activate("activator", _timeProvider);
|
||||
|
||||
// Act
|
||||
source.Pause("Maintenance window", "TICKET-123", "operator");
|
||||
source.Pause("Maintenance window", "TICKET-123", "operator", _timeProvider);
|
||||
|
||||
// Assert
|
||||
source.Paused.Should().BeTrue();
|
||||
@@ -121,12 +133,13 @@ public class SbomSourceTests
|
||||
name: "test-source",
|
||||
sourceType: SbomSourceType.Docker,
|
||||
configuration: SampleConfig,
|
||||
createdBy: "user-1");
|
||||
source.Activate("activator");
|
||||
source.Pause("Maintenance", null, "operator");
|
||||
createdBy: "user-1",
|
||||
timeProvider: _timeProvider);
|
||||
source.Activate("activator", _timeProvider);
|
||||
source.Pause("Maintenance", null, "operator", _timeProvider);
|
||||
|
||||
// Act
|
||||
source.Resume("operator");
|
||||
source.Resume("operator", _timeProvider);
|
||||
|
||||
// Assert
|
||||
source.Paused.Should().BeFalse();
|
||||
@@ -143,16 +156,18 @@ public class SbomSourceTests
|
||||
name: "test-source",
|
||||
sourceType: SbomSourceType.Docker,
|
||||
configuration: SampleConfig,
|
||||
createdBy: "user-1");
|
||||
source.Activate("activator");
|
||||
createdBy: "user-1",
|
||||
timeProvider: _timeProvider);
|
||||
source.Activate("activator", _timeProvider);
|
||||
|
||||
// Simulate some failures
|
||||
source.RecordFailedRun("Error 1");
|
||||
source.RecordFailedRun("Error 2");
|
||||
var runAt = _timeProvider.GetUtcNow();
|
||||
source.RecordFailedRun(runAt, "Error 1", _timeProvider);
|
||||
source.RecordFailedRun(runAt, "Error 2", _timeProvider);
|
||||
source.ConsecutiveFailures.Should().Be(2);
|
||||
|
||||
// Act
|
||||
source.RecordSuccessfulRun();
|
||||
source.RecordSuccessfulRun(runAt, _timeProvider);
|
||||
|
||||
// Assert
|
||||
source.ConsecutiveFailures.Should().Be(0);
|
||||
@@ -169,13 +184,15 @@ public class SbomSourceTests
|
||||
name: "test-source",
|
||||
sourceType: SbomSourceType.Docker,
|
||||
configuration: SampleConfig,
|
||||
createdBy: "user-1");
|
||||
source.Activate("activator");
|
||||
createdBy: "user-1",
|
||||
timeProvider: _timeProvider);
|
||||
source.Activate("activator", _timeProvider);
|
||||
|
||||
// Act - fail 5 times (threshold is 5)
|
||||
// Act - fail multiple times
|
||||
var runAt = _timeProvider.GetUtcNow();
|
||||
for (var i = 0; i < 5; i++)
|
||||
{
|
||||
source.RecordFailedRun($"Error {i + 1}");
|
||||
source.RecordFailedRun(runAt, $"Error {i + 1}", _timeProvider);
|
||||
}
|
||||
|
||||
// Assert
|
||||
@@ -192,12 +209,13 @@ public class SbomSourceTests
|
||||
name: "test-source",
|
||||
sourceType: SbomSourceType.Docker,
|
||||
configuration: SampleConfig,
|
||||
createdBy: "user-1");
|
||||
createdBy: "user-1",
|
||||
timeProvider: _timeProvider);
|
||||
source.MaxScansPerHour = 10;
|
||||
source.Activate("activator");
|
||||
source.Activate("activator", _timeProvider);
|
||||
|
||||
// Act
|
||||
var isLimited = source.IsRateLimited();
|
||||
var isLimited = source.IsRateLimited(_timeProvider);
|
||||
|
||||
// Assert
|
||||
isLimited.Should().BeFalse();
|
||||
@@ -212,7 +230,8 @@ public class SbomSourceTests
|
||||
name: "test-source",
|
||||
sourceType: SbomSourceType.Docker,
|
||||
configuration: SampleConfig,
|
||||
createdBy: "user-1");
|
||||
createdBy: "user-1",
|
||||
timeProvider: _timeProvider);
|
||||
|
||||
var newConfig = JsonDocument.Parse("""
|
||||
{
|
||||
@@ -222,7 +241,7 @@ public class SbomSourceTests
|
||||
""");
|
||||
|
||||
// Act
|
||||
source.UpdateConfiguration(newConfig, "updater");
|
||||
source.UpdateConfiguration(newConfig, "updater", _timeProvider);
|
||||
|
||||
// Assert
|
||||
source.Configuration.RootElement.GetProperty("registryType").GetString()
|
||||
|
||||
Reference in New Issue
Block a user