Merge all changes

This commit is contained in:
StellaOps Bot
2026-01-08 08:54:27 +02:00
parent 589de352c2
commit 110591d6bf
381 changed files with 2237 additions and 1939 deletions

View File

@@ -89,7 +89,7 @@ public class VerdictAttestationIntegrationTests
NullLogger<VerdictAttestationService>.Instance);
// Act
var verdictId = await service.AttestVerdictAsync(trace, CancellationToken.None);
var verdictId = await service.AttestVerdictAsync(trace, TestContext.Current.CancellationToken);
// Assert
verdictId.Should().NotBeNullOrEmpty();
@@ -155,7 +155,7 @@ public class VerdictAttestationIntegrationTests
NullLogger<VerdictAttestationService>.Instance);
// Act
var verdictId = await service.AttestVerdictAsync(trace, CancellationToken.None);
var verdictId = await service.AttestVerdictAsync(trace, TestContext.Current.CancellationToken);
// Assert - Service returns null on failure
verdictId.Should().BeNull();
@@ -200,7 +200,7 @@ public class VerdictAttestationIntegrationTests
NullLogger<VerdictAttestationService>.Instance);
// Act
var verdictId = await service.AttestVerdictAsync(trace, CancellationToken.None);
var verdictId = await service.AttestVerdictAsync(trace, TestContext.Current.CancellationToken);
// Assert - Service returns null on timeout/failure
verdictId.Should().BeNull();

View File

@@ -330,7 +330,7 @@ public sealed class BudgetEnforcementIntegrationTests
ReleaseId = "jan-release",
RiskPoints = 50,
ConsumedAt = DateTimeOffset.UtcNow
}, CancellationToken.None);
}, TestContext.Current.CancellationToken);
await _ledger.GetBudgetAsync(serviceId, window2);
await _store.AddEntryAsync(new BudgetEntry
@@ -341,7 +341,7 @@ public sealed class BudgetEnforcementIntegrationTests
ReleaseId = "feb-release",
RiskPoints = 30,
ConsumedAt = DateTimeOffset.UtcNow
}, CancellationToken.None);
}, TestContext.Current.CancellationToken);
// Act
var historyW1 = await _ledger.GetHistoryAsync(serviceId, window1);

View File

@@ -149,7 +149,7 @@ public sealed class IncrementalOrchestratorTests
"tenant1", "ADV-001", "CVE-001", ["pkg:npm/test"],
"test", timeProvider.GetUtcNow(), timeProvider.GetUtcNow()));
var result = await orchestrator.ProcessAsync(CancellationToken.None);
var result = await orchestrator.ProcessAsync(TestContext.Current.CancellationToken);
result.TotalEventsRead.Should().Be(1);
result.BatchesProcessed.Should().Be(1);
@@ -173,11 +173,11 @@ public sealed class IncrementalOrchestratorTests
"test", timeProvider.GetUtcNow(), timeProvider.GetUtcNow());
// Mark as already seen
await idempotencyStore.MarkSeenAsync(evt.EventId, timeProvider.GetUtcNow(), CancellationToken.None);
await idempotencyStore.MarkSeenAsync(evt.EventId, timeProvider.GetUtcNow(), TestContext.Current.CancellationToken);
eventSource.Enqueue(evt);
var result = await orchestrator.ProcessAsync(CancellationToken.None);
var result = await orchestrator.ProcessAsync(TestContext.Current.CancellationToken);
result.TotalEventsRead.Should().Be(1);
result.EventsSkippedDuplicate.Should().Be(1);
@@ -208,7 +208,7 @@ public sealed class IncrementalOrchestratorTests
eventSource.Enqueue(evt);
var result = await orchestrator.ProcessAsync(CancellationToken.None);
var result = await orchestrator.ProcessAsync(TestContext.Current.CancellationToken);
result.TotalEventsRead.Should().Be(1);
result.EventsSkippedOld.Should().Be(1);
@@ -235,7 +235,7 @@ public sealed class IncrementalOrchestratorTests
"tenant2", "ADV-002", "CVE-002", [], "test",
timeProvider.GetUtcNow(), timeProvider.GetUtcNow()));
var result = await orchestrator.ProcessAsync(CancellationToken.None);
var result = await orchestrator.ProcessAsync(TestContext.Current.CancellationToken);
result.BatchesProcessed.Should().Be(2); // One per tenant
submitter.SubmittedBatches.Select(b => b.TenantId).Should()
@@ -266,7 +266,7 @@ public sealed class IncrementalOrchestratorTests
timeProvider.GetUtcNow(), timeProvider.GetUtcNow(),
priority: PolicyChangePriority.Emergency));
await orchestrator.ProcessAsync(CancellationToken.None);
await orchestrator.ProcessAsync(TestContext.Current.CancellationToken);
// Emergency should be processed first (separate batch due to priority)
submitter.SubmittedBatches.Should().HaveCount(2);

View File

@@ -48,7 +48,7 @@ public sealed class PolicyProfileNotificationServiceTests
profile,
"alice@example.com",
"abc123hash",
CancellationToken.None);
TestContext.Current.CancellationToken);
// Assert
Assert.Single(_publisher.PublishedEvents);
@@ -76,7 +76,7 @@ public sealed class PolicyProfileNotificationServiceTests
profile,
"alice@example.com",
"abc123hash",
CancellationToken.None);
TestContext.Current.CancellationToken);
// Assert
Assert.Single(_publisher.PublishedEvents);
@@ -97,7 +97,7 @@ public sealed class PolicyProfileNotificationServiceTests
"alice@example.com",
"Deprecated in favor of v2.0.0",
"abc123hash",
CancellationToken.None);
TestContext.Current.CancellationToken);
// Assert
Assert.Single(_publisher.PublishedEvents);
@@ -119,7 +119,7 @@ public sealed class PolicyProfileNotificationServiceTests
"alice@example.com",
"Increased high/critical thresholds",
"abc123hash",
CancellationToken.None);
TestContext.Current.CancellationToken);
// Assert
Assert.Single(_publisher.PublishedEvents);
@@ -143,7 +143,7 @@ public sealed class PolicyProfileNotificationServiceTests
"suppress",
"False positive confirmed by security team",
"abc123hash",
CancellationToken.None);
TestContext.Current.CancellationToken);
// Assert
Assert.Single(_publisher.PublishedEvents);
@@ -167,7 +167,7 @@ public sealed class PolicyProfileNotificationServiceTests
"alice@example.com",
"override-001",
"abc123hash",
CancellationToken.None);
TestContext.Current.CancellationToken);
// Assert
Assert.Single(_publisher.PublishedEvents);
@@ -190,7 +190,7 @@ public sealed class PolicyProfileNotificationServiceTests
highImpactCount: 5,
completedAt: _timeProvider.GetUtcNow(),
"abc123hash",
CancellationToken.None);
TestContext.Current.CancellationToken);
// Assert
Assert.Single(_publisher.PublishedEvents);
@@ -224,7 +224,7 @@ public sealed class PolicyProfileNotificationServiceTests
lifecycleEvent,
profile,
"abc123hash",
CancellationToken.None);
TestContext.Current.CancellationToken);
// Assert
Assert.Single(_publisher.PublishedEvents);
@@ -254,7 +254,7 @@ public sealed class PolicyProfileNotificationServiceTests
lifecycleEvent,
profile,
"abc123hash",
CancellationToken.None);
TestContext.Current.CancellationToken);
// Assert
Assert.Single(_publisher.PublishedEvents);
@@ -283,7 +283,7 @@ public sealed class PolicyProfileNotificationServiceTests
lifecycleEvent,
profile: null,
"abc123hash",
CancellationToken.None);
TestContext.Current.CancellationToken);
// Assert
Assert.Single(_publisher.PublishedEvents);
@@ -311,7 +311,7 @@ public sealed class PolicyProfileNotificationServiceTests
profile,
"alice@example.com",
"abc123hash",
CancellationToken.None);
TestContext.Current.CancellationToken);
// Assert
Assert.Empty(_publisher.PublishedEvents);
@@ -336,7 +336,7 @@ public sealed class PolicyProfileNotificationServiceTests
profile,
"alice@example.com",
"abc123hash",
CancellationToken.None);
TestContext.Current.CancellationToken);
// Assert - no exception thrown
Assert.True(true);

View File

@@ -26,7 +26,7 @@ public sealed class PolicyBundleServiceTests
var services = CreateServices();
var request = new PolicyBundleRequest(new PolicyDslPayload("stella-dsl@1", BaselineDsl), SigningKeyId: "test-key");
var response = await services.BundleService.CompileAndStoreAsync("pack-1", 1, request, CancellationToken.None);
var response = await services.BundleService.CompileAndStoreAsync("pack-1", 1, request, TestContext.Current.CancellationToken);
Assert.True(response.Success);
Assert.NotNull(response.Digest);
@@ -41,7 +41,7 @@ public sealed class PolicyBundleServiceTests
var services = CreateServices();
var request = new PolicyBundleRequest(new PolicyDslPayload("unknown", "policy bad"), SigningKeyId: null);
var response = await services.BundleService.CompileAndStoreAsync("pack-1", 1, request, CancellationToken.None);
var response = await services.BundleService.CompileAndStoreAsync("pack-1", 1, request, TestContext.Current.CancellationToken);
Assert.False(response.Success);
Assert.Null(response.Digest);
@@ -55,7 +55,7 @@ public sealed class PolicyBundleServiceTests
var services = CreateServices();
var request = new PolicyBundleRequest(new PolicyDslPayload("stella-dsl@1", BaselineDsl), SigningKeyId: "test-key");
var response = await services.BundleService.CompileAndStoreAsync("pack-1", 1, request, CancellationToken.None);
var response = await services.BundleService.CompileAndStoreAsync("pack-1", 1, request, TestContext.Current.CancellationToken);
Assert.True(response.Success);
Assert.NotNull(response.AocMetadata);
@@ -83,13 +83,13 @@ public sealed class PolicyBundleServiceTests
SigningKeyId: "test-key",
Provenance: provenance);
var response = await services.BundleService.CompileAndStoreAsync("pack-1", 1, request, CancellationToken.None);
var response = await services.BundleService.CompileAndStoreAsync("pack-1", 1, request, TestContext.Current.CancellationToken);
Assert.True(response.Success);
Assert.NotNull(response.AocMetadata);
// Verify bundle record has provenance stored
var bundle = await services.Repository.GetBundleAsync("pack-1", 1, CancellationToken.None);
var bundle = await services.Repository.GetBundleAsync("pack-1", 1, TestContext.Current.CancellationToken);
Assert.NotNull(bundle);
Assert.NotNull(bundle!.AocMetadata);
Assert.NotNull(bundle.AocMetadata!.Provenance);
@@ -107,7 +107,7 @@ public sealed class PolicyBundleServiceTests
var services = CreateServices();
var request = new PolicyBundleRequest(new PolicyDslPayload("unknown", "policy bad"), SigningKeyId: null);
var response = await services.BundleService.CompileAndStoreAsync("pack-1", 1, request, CancellationToken.None);
var response = await services.BundleService.CompileAndStoreAsync("pack-1", 1, request, TestContext.Current.CancellationToken);
Assert.False(response.Success);
Assert.Null(response.AocMetadata);
@@ -121,8 +121,8 @@ public sealed class PolicyBundleServiceTests
var request1 = new PolicyBundleRequest(new PolicyDslPayload("stella-dsl@1", BaselineDsl), SigningKeyId: "test-key");
var request2 = new PolicyBundleRequest(new PolicyDslPayload("stella-dsl@1", BaselineDsl), SigningKeyId: "test-key");
var response1 = await services.BundleService.CompileAndStoreAsync("pack-1", 1, request1, CancellationToken.None);
var response2 = await services.BundleService.CompileAndStoreAsync("pack-2", 1, request2, CancellationToken.None);
var response1 = await services.BundleService.CompileAndStoreAsync("pack-1", 1, request1, TestContext.Current.CancellationToken);
var response2 = await services.BundleService.CompileAndStoreAsync("pack-2", 1, request2, TestContext.Current.CancellationToken);
Assert.NotNull(response1.AocMetadata);
Assert.NotNull(response2.AocMetadata);

View File

@@ -13,10 +13,10 @@ public class PolicyPackRepositoryTests
[Fact]
public async Task ActivateRevision_WithSingleApprover_ActivatesImmediately()
{
await repository.CreateAsync("pack-1", "Pack", CancellationToken.None);
await repository.UpsertRevisionAsync("pack-1", 1, requiresTwoPersonApproval: false, PolicyRevisionStatus.Approved, CancellationToken.None);
await repository.CreateAsync("pack-1", "Pack", TestContext.Current.CancellationToken);
await repository.UpsertRevisionAsync("pack-1", 1, requiresTwoPersonApproval: false, PolicyRevisionStatus.Approved, TestContext.Current.CancellationToken);
var result = await repository.RecordActivationAsync("pack-1", 1, "alice", DateTimeOffset.UtcNow, null, CancellationToken.None);
var result = await repository.RecordActivationAsync("pack-1", 1, "alice", DateTimeOffset.UtcNow, null, TestContext.Current.CancellationToken);
Assert.Equal(PolicyActivationResultStatus.Activated, result.Status);
Assert.NotNull(result.Revision);
@@ -28,18 +28,18 @@ public class PolicyPackRepositoryTests
[Fact]
public async Task ActivateRevision_WithTwoPersonRequirement_ReturnsPendingUntilSecondApproval()
{
await repository.CreateAsync("pack-2", "Pack", CancellationToken.None);
await repository.UpsertRevisionAsync("pack-2", 1, requiresTwoPersonApproval: true, PolicyRevisionStatus.Approved, CancellationToken.None);
await repository.CreateAsync("pack-2", "Pack", TestContext.Current.CancellationToken);
await repository.UpsertRevisionAsync("pack-2", 1, requiresTwoPersonApproval: true, PolicyRevisionStatus.Approved, TestContext.Current.CancellationToken);
var first = await repository.RecordActivationAsync("pack-2", 1, "alice", DateTimeOffset.UtcNow, null, CancellationToken.None);
var first = await repository.RecordActivationAsync("pack-2", 1, "alice", DateTimeOffset.UtcNow, null, TestContext.Current.CancellationToken);
Assert.Equal(PolicyActivationResultStatus.PendingSecondApproval, first.Status);
Assert.Equal(PolicyRevisionStatus.Approved, first.Revision!.Status);
Assert.Single(first.Revision.Approvals);
var duplicate = await repository.RecordActivationAsync("pack-2", 1, "alice", DateTimeOffset.UtcNow, null, CancellationToken.None);
var duplicate = await repository.RecordActivationAsync("pack-2", 1, "alice", DateTimeOffset.UtcNow, null, TestContext.Current.CancellationToken);
Assert.Equal(PolicyActivationResultStatus.DuplicateApproval, duplicate.Status);
var second = await repository.RecordActivationAsync("pack-2", 1, "bob", DateTimeOffset.UtcNow, null, CancellationToken.None);
var second = await repository.RecordActivationAsync("pack-2", 1, "bob", DateTimeOffset.UtcNow, null, TestContext.Current.CancellationToken);
Assert.Equal(PolicyActivationResultStatus.Activated, second.Status);
Assert.Equal(PolicyRevisionStatus.Active, second.Revision!.Status);
Assert.Equal(2, second.Revision.Approvals.Length);

View File

@@ -48,7 +48,7 @@ public sealed class PolicyRuntimeEvaluationServiceTests
var request = CreateRequest("pack-1", 1, severity: "Critical");
var response = await harness.Service.EvaluateAsync(request, CancellationToken.None);
var response = await harness.Service.EvaluateAsync(request, TestContext.Current.CancellationToken);
Assert.Equal("pack-1", response.PackId);
Assert.Equal(1, response.Version);
@@ -67,11 +67,11 @@ public sealed class PolicyRuntimeEvaluationServiceTests
var request = CreateRequest("pack-1", 1, severity: "High");
// First call - cache miss
var response1 = await harness.Service.EvaluateAsync(request, CancellationToken.None);
var response1 = await harness.Service.EvaluateAsync(request, TestContext.Current.CancellationToken);
Assert.False(response1.Cached);
// Second call - cache hit
var response2 = await harness.Service.EvaluateAsync(request, CancellationToken.None);
var response2 = await harness.Service.EvaluateAsync(request, TestContext.Current.CancellationToken);
Assert.True(response2.Cached);
Assert.Equal(CacheSource.InMemory, response2.CacheSource);
Assert.Equal(response1.Status, response2.Status);
@@ -88,12 +88,12 @@ public sealed class PolicyRuntimeEvaluationServiceTests
var request = CreateRequest("pack-1", 1, severity: "Medium");
// First call
var response1 = await harness.Service.EvaluateAsync(request, CancellationToken.None);
var response1 = await harness.Service.EvaluateAsync(request, TestContext.Current.CancellationToken);
Assert.False(response1.Cached);
// Second call with bypass
var bypassRequest = request with { BypassCache = true };
var response2 = await harness.Service.EvaluateAsync(bypassRequest, CancellationToken.None);
var response2 = await harness.Service.EvaluateAsync(bypassRequest, TestContext.Current.CancellationToken);
Assert.False(response2.Cached);
}
@@ -105,7 +105,7 @@ public sealed class PolicyRuntimeEvaluationServiceTests
var request = CreateRequest("non-existent", 1, severity: "Low");
await Assert.ThrowsAsync<InvalidOperationException>(
() => harness.Service.EvaluateAsync(request, CancellationToken.None));
() => harness.Service.EvaluateAsync(request, TestContext.Current.CancellationToken));
}
[Trait("Category", TestCategories.Unit)]
@@ -117,13 +117,13 @@ public sealed class PolicyRuntimeEvaluationServiceTests
var request = CreateRequest("pack-1", 1, severity: "High");
var response1 = await harness.Service.EvaluateAsync(request, CancellationToken.None);
var response1 = await harness.Service.EvaluateAsync(request, TestContext.Current.CancellationToken);
// Create a new harness with fresh cache
var harness2 = CreateHarness();
await harness2.StoreTestPolicyAsync("pack-1", 1, TestPolicy);
var response2 = await harness2.Service.EvaluateAsync(request, CancellationToken.None);
var response2 = await harness2.Service.EvaluateAsync(request, TestContext.Current.CancellationToken);
// Same inputs should produce same correlation ID
Assert.Equal(response1.CorrelationId, response2.CorrelationId);
@@ -143,7 +143,7 @@ public sealed class PolicyRuntimeEvaluationServiceTests
CreateRequest("pack-1", 1, severity: "Medium", subjectPurl: "pkg:npm/axios@1.0.0"),
};
var responses = await harness.Service.EvaluateBatchAsync(requests, CancellationToken.None);
var responses = await harness.Service.EvaluateBatchAsync(requests, TestContext.Current.CancellationToken);
Assert.Equal(3, responses.Count);
}
@@ -157,7 +157,7 @@ public sealed class PolicyRuntimeEvaluationServiceTests
// Pre-populate cache
var request = CreateRequest("pack-1", 1, severity: "Critical");
await harness.Service.EvaluateAsync(request, CancellationToken.None);
await harness.Service.EvaluateAsync(request, TestContext.Current.CancellationToken);
var requests = new[]
{
@@ -165,7 +165,7 @@ public sealed class PolicyRuntimeEvaluationServiceTests
CreateRequest("pack-1", 1, severity: "High"), // New
};
var responses = await harness.Service.EvaluateBatchAsync(requests, CancellationToken.None);
var responses = await harness.Service.EvaluateBatchAsync(requests, TestContext.Current.CancellationToken);
Assert.Equal(2, responses.Count);
Assert.Contains(responses, r => r.Cached);
@@ -182,8 +182,8 @@ public sealed class PolicyRuntimeEvaluationServiceTests
var request1 = CreateRequest("pack-1", 1, severity: "High");
var request2 = CreateRequest("pack-1", 1, severity: "Critical");
var response1 = await harness.Service.EvaluateAsync(request1, CancellationToken.None);
var response2 = await harness.Service.EvaluateAsync(request2, CancellationToken.None);
var response1 = await harness.Service.EvaluateAsync(request1, TestContext.Current.CancellationToken);
var response2 = await harness.Service.EvaluateAsync(request2, TestContext.Current.CancellationToken);
// Both should be cache misses (different severity = different context)
Assert.False(response1.Cached);
@@ -233,11 +233,11 @@ public sealed class PolicyRuntimeEvaluationServiceTests
Metadata = new Dictionary<string, object?>()
};
await harness.ReachabilityStore.SaveAsync(fact, CancellationToken.None);
await harness.ReachabilityStore.SaveAsync(fact, TestContext.Current.CancellationToken);
var request = CreateRequest("pack-2", 1, severity: "Low");
var response = await harness.Service.EvaluateAsync(request, CancellationToken.None);
var response = await harness.Service.EvaluateAsync(request, TestContext.Current.CancellationToken);
Assert.Equal("warn", response.Status);
}
@@ -289,10 +289,10 @@ public sealed class PolicyRuntimeEvaluationServiceTests
Metadata = new Dictionary<string, object?>()
};
await harness.ReachabilityStore.SaveAsync(fact, CancellationToken.None);
await harness.ReachabilityStore.SaveAsync(fact, TestContext.Current.CancellationToken);
var request = CreateRequest("pack-3", 1, severity: "Low");
var response = await harness.Service.EvaluateAsync(request, CancellationToken.None);
var response = await harness.Service.EvaluateAsync(request, TestContext.Current.CancellationToken);
Assert.Equal("under_investigation", response.Status);
}
@@ -344,10 +344,10 @@ public sealed class PolicyRuntimeEvaluationServiceTests
Metadata = new Dictionary<string, object?>()
};
await harness.ReachabilityStore.SaveAsync(fact, CancellationToken.None);
await harness.ReachabilityStore.SaveAsync(fact, TestContext.Current.CancellationToken);
var request = CreateRequest("pack-4", 1, severity: "Low");
var response = await harness.Service.EvaluateAsync(request, CancellationToken.None);
var response = await harness.Service.EvaluateAsync(request, TestContext.Current.CancellationToken);
Assert.Equal("under_investigation", response.Status);
}
@@ -399,10 +399,10 @@ public sealed class PolicyRuntimeEvaluationServiceTests
Metadata = new Dictionary<string, object?>()
};
await harness.ReachabilityStore.SaveAsync(fact, CancellationToken.None);
await harness.ReachabilityStore.SaveAsync(fact, TestContext.Current.CancellationToken);
var request = CreateRequest("pack-5", 1, severity: "Low");
var response = await harness.Service.EvaluateAsync(request, CancellationToken.None);
var response = await harness.Service.EvaluateAsync(request, TestContext.Current.CancellationToken);
Assert.Equal("not_affected", response.Status);
}
@@ -489,7 +489,7 @@ public sealed class PolicyRuntimeEvaluationServiceTests
{
var bundleService = new PolicyBundleService(CompilationService, Repository, TimeProvider.System);
var request = new PolicyBundleRequest(new PolicyDslPayload("stella-dsl@1", dsl), SigningKeyId: null);
await bundleService.CompileAndStoreAsync(packId, version, request, CancellationToken.None);
await bundleService.CompileAndStoreAsync(packId, version, request, TestContext.Current.CancellationToken);
}
}

View File

@@ -22,13 +22,13 @@ public sealed class PolicyRuntimeEvaluatorTests
Size: 4,
CreatedAt: DateTimeOffset.UnixEpoch,
Payload: new byte[] { 1, 2, 3, 4 }.ToImmutableArray()),
CancellationToken.None);
TestContext.Current.CancellationToken);
var evaluator = new PolicyRuntimeEvaluator(repo);
var request = new PolicyEvaluationRequest("pack-1", 1, "subject-a");
var first = await evaluator.EvaluateAsync(request, CancellationToken.None);
var second = await evaluator.EvaluateAsync(request, CancellationToken.None);
var first = await evaluator.EvaluateAsync(request, TestContext.Current.CancellationToken);
var second = await evaluator.EvaluateAsync(request, TestContext.Current.CancellationToken);
Assert.Equal(first.Decision, second.Decision);
Assert.False(first.Cached);
@@ -44,6 +44,6 @@ public sealed class PolicyRuntimeEvaluatorTests
var evaluator = new PolicyRuntimeEvaluator(new InMemoryPolicyPackRepository());
var request = new PolicyEvaluationRequest("pack-x", 1, "subject-a");
await Assert.ThrowsAsync<InvalidOperationException>(() => evaluator.EvaluateAsync(request, CancellationToken.None));
await Assert.ThrowsAsync<InvalidOperationException>(() => evaluator.EvaluateAsync(request, TestContext.Current.CancellationToken));
}
}

View File

@@ -35,7 +35,7 @@ public sealed class PolicyWorkerServiceTests
await jobStore.SaveAsync(job);
var result = await service.ExecuteAsync(new WorkerRunRequest(job.JobId), CancellationToken.None);
var result = await service.ExecuteAsync(new WorkerRunRequest(job.JobId), TestContext.Current.CancellationToken);
Assert.Equal(job.JobId, result.JobId);
Assert.Equal("worker-stub", result.WorkerId);

View File

@@ -22,7 +22,7 @@ public sealed class ExceptionLifecycleServiceTests
options,
NullLogger<ExceptionLifecycleService>.Instance);
await service.ProcessOnceAsync(CancellationToken.None);
await service.ProcessOnceAsync(TestContext.Current.CancellationToken);
repository.ExpiredTenants.Should().BeEmpty();
}
@@ -42,7 +42,7 @@ public sealed class ExceptionLifecycleServiceTests
Reason = "test-fixture",
ExpiresAt = new DateTimeOffset(2000, 1, 1, 0, 0, 0, TimeSpan.Zero),
CreatedAt = new DateTimeOffset(2025, 12, 1, 0, 0, 0, TimeSpan.Zero)
}, CancellationToken.None);
}, TestContext.Current.CancellationToken);
var configured = new PolicyEngineOptions();
configured.ResourceServer.RequiredTenants.Add("tenant-b");
@@ -52,9 +52,9 @@ public sealed class ExceptionLifecycleServiceTests
Microsoft.Extensions.Options.Options.Create(configured),
NullLogger<ExceptionLifecycleService>.Instance);
await service.ProcessOnceAsync(CancellationToken.None);
await service.ProcessOnceAsync(TestContext.Current.CancellationToken);
var updated = await repo.GetByIdAsync("tenant-b", id, CancellationToken.None);
var updated = await repo.GetByIdAsync("tenant-b", id, TestContext.Current.CancellationToken);
updated!.Status.Should().Be(ExceptionStatus.Expired);
updated.RevokedAt.Should().NotBeNull();
}

View File

@@ -33,7 +33,7 @@ public sealed class RecheckEvidenceMigrationTests : IAsyncLifetime
[Fact]
public async Task Migration_CreatesRecheckAndEvidenceTables()
{
await using var connection = await _dataSource.OpenConnectionAsync("default", "reader", CancellationToken.None);
await using var connection = await _dataSource.OpenConnectionAsync("default", "reader", TestContext.Current.CancellationToken);
await AssertTableExistsAsync(connection, "policy.recheck_policies");
await AssertTableExistsAsync(connection, "policy.evidence_hooks");

View File

@@ -32,7 +32,7 @@ public sealed class BudgetLedgerTests
public async Task GetBudget_ReturnsExistingBudget()
{
var existing = CreateBudget("existing-service", consumed: 50);
await _store.CreateAsync(existing, CancellationToken.None);
await _store.CreateAsync(existing, TestContext.Current.CancellationToken);
var budget = await _ledger.GetBudgetAsync("existing-service", _currentWindow);
@@ -43,7 +43,7 @@ public sealed class BudgetLedgerTests
public async Task Consume_DeductsBudget()
{
var initial = CreateBudget("test-service", consumed: 50);
await _store.CreateAsync(initial, CancellationToken.None);
await _store.CreateAsync(initial, TestContext.Current.CancellationToken);
var result = await _ledger.ConsumeAsync("test-service", 20, "release-1");
@@ -58,7 +58,7 @@ public sealed class BudgetLedgerTests
public async Task Consume_FailsWhenInsufficientBudget()
{
var initial = CreateBudget("test-service", consumed: 190);
await _store.CreateAsync(initial, CancellationToken.None);
await _store.CreateAsync(initial, TestContext.Current.CancellationToken);
var result = await _ledger.ConsumeAsync("test-service", 20, "release-1");

View File

@@ -148,7 +148,7 @@ public sealed class PolicyBinderTests
Strict = true,
};
var exitCode = await cli.RunAsync(options, CancellationToken.None);
var exitCode = await cli.RunAsync(options, TestContext.Current.CancellationToken);
Assert.Equal(2, exitCode);
Assert.Contains("WARNING", output.ToString());

View File

@@ -35,7 +35,7 @@ rules:
var timeProvider = new FakeTimeProvider();
var store = new PolicySnapshotStore(snapshotRepo, auditRepo, timeProvider, null, NullLogger<PolicySnapshotStore>.Instance);
await store.SaveAsync(new PolicySnapshotContent(yaml, PolicyDocumentFormat.Yaml, "tester", null, null), CancellationToken.None);
await store.SaveAsync(new PolicySnapshotContent(yaml, PolicyDocumentFormat.Yaml, "tester", null, null), TestContext.Current.CancellationToken);
var service = new PolicyPreviewService(store, NullLogger<PolicyPreviewService>.Instance);
@@ -51,11 +51,11 @@ rules:
"sha256:abc",
findings,
baseline),
CancellationToken.None);
TestContext.Current.CancellationToken);
Assert.True(response.Success);
Assert.Equal(1, response.ChangedCount);
var diff1 = Assert.Single(response.Diffs.Where(diff => diff.Projected.FindingId == "finding-1"));
var diff1 = Assert.Single(response.Diffs, diff => diff.Projected.FindingId == "finding-1");
Assert.Equal(PolicyVerdictStatus.Pass, diff1.Baseline.Status);
Assert.Equal(PolicyVerdictStatus.Blocked, diff1.Projected.Status);
Assert.Equal("Block Critical", diff1.Projected.RuleName);
@@ -94,7 +94,7 @@ rules:
baseline,
SnapshotOverride: null,
ProposedPolicy: new PolicySnapshotContent(yaml, PolicyDocumentFormat.Yaml, "tester", null, "dev override")),
CancellationToken.None);
TestContext.Current.CancellationToken);
Assert.True(response.Success);
var diff = Assert.Single(response.Diffs);
@@ -122,7 +122,7 @@ rules:
SnapshotOverride: null,
ProposedPolicy: new PolicySnapshotContent(invalid, PolicyDocumentFormat.Yaml, null, null, null));
var response = await service.PreviewAsync(request, CancellationToken.None);
var response = await service.PreviewAsync(request, TestContext.Current.CancellationToken);
Assert.False(response.Success);
Assert.NotEmpty(response.Issues);
@@ -160,7 +160,7 @@ rules:
Assert.True(binding.Document.Rules[0].Action.Quiet);
var store = new PolicySnapshotStore(new InMemoryPolicySnapshotRepository(), new InMemoryPolicyAuditRepository(), TimeProvider.System, null, NullLogger<PolicySnapshotStore>.Instance);
await store.SaveAsync(new PolicySnapshotContent(yaml, PolicyDocumentFormat.Yaml, "tester", null, "quiet test"), CancellationToken.None);
await store.SaveAsync(new PolicySnapshotContent(yaml, PolicyDocumentFormat.Yaml, "tester", null, "quiet test"), TestContext.Current.CancellationToken);
var snapshot = await store.GetLatestAsync();
Assert.NotNull(snapshot);
Assert.True(snapshot!.Document.Rules[0].Action.Quiet);
@@ -178,7 +178,7 @@ rules:
"sha256:quiet",
findings,
baseline),
CancellationToken.None);
TestContext.Current.CancellationToken);
Assert.True(response.Success);
var verdict = Assert.Single(response.Diffs).Projected;

View File

@@ -29,7 +29,7 @@ rules:
var content = new PolicySnapshotContent(BasePolicyYaml, PolicyDocumentFormat.Yaml, "cli", "test", null);
var result = await store.SaveAsync(content, CancellationToken.None);
var result = await store.SaveAsync(content, TestContext.Current.CancellationToken);
Assert.True(result.Success);
Assert.True(result.Created);
@@ -59,11 +59,11 @@ rules:
var store = new PolicySnapshotStore(snapshotRepo, auditRepo, timeProvider, null, NullLogger<PolicySnapshotStore>.Instance);
var content = new PolicySnapshotContent(BasePolicyYaml, PolicyDocumentFormat.Yaml, "cli", "test", null);
var first = await store.SaveAsync(content, CancellationToken.None);
var first = await store.SaveAsync(content, TestContext.Current.CancellationToken);
Assert.True(first.Created);
timeProvider.Advance(TimeSpan.FromHours(1));
var second = await store.SaveAsync(content, CancellationToken.None);
var second = await store.SaveAsync(content, TestContext.Current.CancellationToken);
Assert.True(second.Success);
Assert.False(second.Created);
@@ -86,7 +86,7 @@ rules:
const string invalidYaml = "version: '1.0'\nrules: []";
var content = new PolicySnapshotContent(invalidYaml, PolicyDocumentFormat.Yaml, null, null, null);
var result = await store.SaveAsync(content, CancellationToken.None);
var result = await store.SaveAsync(content, TestContext.Current.CancellationToken);
Assert.False(result.Success);
Assert.False(result.Created);