Refactor code structure and optimize performance across multiple modules

This commit is contained in:
StellaOps Bot
2025-12-26 20:03:22 +02:00
parent c786faae84
commit f10d83c444
1385 changed files with 69732 additions and 10280 deletions

View File

@@ -3,6 +3,7 @@ using StellaOps.Signals.Models;
using StellaOps.Signals.Parsing;
using Xunit;
using StellaOps.TestKit;
namespace StellaOps.Signals.Reachability.Tests;
/// <summary>
@@ -13,7 +14,8 @@ public class CallgraphSchemaMigratorTests
{
#region EnsureV1 - Schema Version Tests
[Fact]
[Trait("Category", TestCategories.Unit)]
[Fact]
public void EnsureV1_SetsSchemaToV1_WhenNotSet()
{
// Arrange
@@ -29,7 +31,8 @@ public class CallgraphSchemaMigratorTests
result.Schema.Should().Be(CallgraphSchemaVersions.V1);
}
[Fact]
[Trait("Category", TestCategories.Unit)]
[Fact]
public void EnsureV1_PreservesV1Schema_WhenAlreadySet()
{
// Arrange
@@ -45,7 +48,8 @@ public class CallgraphSchemaMigratorTests
result.Schema.Should().Be(CallgraphSchemaVersions.V1);
}
[Fact]
[Trait("Category", TestCategories.Unit)]
[Fact]
public void EnsureV1_UpdatesLegacySchema_ToV1()
{
// Arrange
@@ -65,7 +69,8 @@ public class CallgraphSchemaMigratorTests
#region EnsureV1 - Language Parsing Tests
[Theory]
[Trait("Category", TestCategories.Unit)]
[Theory]
[InlineData("dotnet", CallgraphLanguage.DotNet)]
[InlineData(".net", CallgraphLanguage.DotNet)]
[InlineData("csharp", CallgraphLanguage.DotNet)]
@@ -102,7 +107,8 @@ public class CallgraphSchemaMigratorTests
result.LanguageType.Should().Be(expected);
}
[Fact]
[Trait("Category", TestCategories.Unit)]
[Fact]
public void EnsureV1_PreservesLanguageType_WhenAlreadySet()
{
// Arrange
@@ -123,7 +129,8 @@ public class CallgraphSchemaMigratorTests
#region EnsureV1 - Node Visibility Inference Tests
[Fact]
[Trait("Category", TestCategories.Unit)]
[Fact]
public void EnsureV1_InfersPublicVisibility_ForStandardNames()
{
// Arrange
@@ -143,7 +150,8 @@ public class CallgraphSchemaMigratorTests
.Which.Visibility.Should().Be(SymbolVisibility.Public);
}
[Fact]
[Trait("Category", TestCategories.Unit)]
[Fact]
public void EnsureV1_InfersPrivateVisibility_ForUnderscorePrefixed()
{
// Arrange
@@ -163,7 +171,8 @@ public class CallgraphSchemaMigratorTests
.Which.Visibility.Should().Be(SymbolVisibility.Private);
}
[Fact]
[Trait("Category", TestCategories.Unit)]
[Fact]
public void EnsureV1_InfersPrivateVisibility_ForAngleBracketNames()
{
// Arrange
@@ -183,7 +192,8 @@ public class CallgraphSchemaMigratorTests
.Which.Visibility.Should().Be(SymbolVisibility.Private);
}
[Fact]
[Trait("Category", TestCategories.Unit)]
[Fact]
public void EnsureV1_InfersInternalVisibility_ForInternalNamespace()
{
// Arrange
@@ -203,7 +213,8 @@ public class CallgraphSchemaMigratorTests
.Which.Visibility.Should().Be(SymbolVisibility.Internal);
}
[Fact]
[Trait("Category", TestCategories.Unit)]
[Fact]
public void EnsureV1_PreservesVisibility_WhenAlreadySet()
{
// Arrange
@@ -227,7 +238,8 @@ public class CallgraphSchemaMigratorTests
#region EnsureV1 - Symbol Key Building Tests
[Fact]
[Trait("Category", TestCategories.Unit)]
[Fact]
public void EnsureV1_BuildsSymbolKey_FromNamespaceAndName()
{
// Arrange
@@ -247,7 +259,8 @@ public class CallgraphSchemaMigratorTests
.Which.SymbolKey.Should().Be("MyApp.Services.ProcessOrder");
}
[Fact]
[Trait("Category", TestCategories.Unit)]
[Fact]
public void EnsureV1_BuildsSymbolKey_FromNameOnly_WhenNoNamespace()
{
// Arrange
@@ -267,7 +280,8 @@ public class CallgraphSchemaMigratorTests
.Which.SymbolKey.Should().Be("GlobalMethod");
}
[Fact]
[Trait("Category", TestCategories.Unit)]
[Fact]
public void EnsureV1_PreservesSymbolKey_WhenAlreadySet()
{
// Arrange
@@ -291,7 +305,8 @@ public class CallgraphSchemaMigratorTests
#region EnsureV1 - Entrypoint Candidate Detection Tests
[Theory]
[Trait("Category", TestCategories.Unit)]
[Theory]
[InlineData("Main")]
[InlineData("main")]
[InlineData("MAIN")]
@@ -314,7 +329,8 @@ public class CallgraphSchemaMigratorTests
.Which.IsEntrypointCandidate.Should().BeTrue();
}
[Theory]
[Trait("Category", TestCategories.Unit)]
[Theory]
[InlineData("OrdersController")]
[InlineData("UserController")]
public void EnsureV1_DetectsEntrypointCandidate_ForControllerNames(string name)
@@ -336,7 +352,8 @@ public class CallgraphSchemaMigratorTests
.Which.IsEntrypointCandidate.Should().BeTrue();
}
[Theory]
[Trait("Category", TestCategories.Unit)]
[Theory]
[InlineData("RequestHandler")]
[InlineData("EventHandler")]
public void EnsureV1_DetectsEntrypointCandidate_ForHandlerNames(string name)
@@ -358,7 +375,8 @@ public class CallgraphSchemaMigratorTests
.Which.IsEntrypointCandidate.Should().BeTrue();
}
[Theory]
[Trait("Category", TestCategories.Unit)]
[Theory]
[InlineData(".cctor")]
[InlineData("ModuleInitializer")]
public void EnsureV1_DetectsEntrypointCandidate_ForModuleInitializers(string name)
@@ -384,7 +402,8 @@ public class CallgraphSchemaMigratorTests
#region EnsureV1 - Edge Reason Inference Tests
[Theory]
[Trait("Category", TestCategories.Unit)]
[Theory]
[InlineData("call", EdgeReason.DirectCall)]
[InlineData("direct", EdgeReason.DirectCall)]
[InlineData("virtual", EdgeReason.VirtualCall)]
@@ -422,7 +441,8 @@ public class CallgraphSchemaMigratorTests
.Which.Reason.Should().Be(expected);
}
[Fact]
[Trait("Category", TestCategories.Unit)]
[Fact]
public void EnsureV1_InfersRuntimeMinted_ForRuntimeKind()
{
// Arrange
@@ -442,7 +462,8 @@ public class CallgraphSchemaMigratorTests
.Which.Reason.Should().Be(EdgeReason.RuntimeMinted);
}
[Fact]
[Trait("Category", TestCategories.Unit)]
[Fact]
public void EnsureV1_InfersDynamicImport_ForHeuristicKind()
{
// Arrange
@@ -462,7 +483,8 @@ public class CallgraphSchemaMigratorTests
.Which.Reason.Should().Be(EdgeReason.DynamicImport);
}
[Fact]
[Trait("Category", TestCategories.Unit)]
[Fact]
public void EnsureV1_PreservesEdgeReason_WhenAlreadySet()
{
// Arrange
@@ -486,7 +508,8 @@ public class CallgraphSchemaMigratorTests
#region EnsureV1 - Entrypoint Inference Tests
[Fact]
[Trait("Category", TestCategories.Unit)]
[Fact]
public void EnsureV1_InfersEntrypoints_FromEntrypointCandidateNodes()
{
// Arrange
@@ -509,7 +532,8 @@ public class CallgraphSchemaMigratorTests
.Which.NodeId.Should().Be("main");
}
[Fact]
[Trait("Category", TestCategories.Unit)]
[Fact]
public void EnsureV1_InfersEntrypoints_FromExplicitRoots()
{
// Arrange
@@ -535,7 +559,8 @@ public class CallgraphSchemaMigratorTests
.Which.NodeId.Should().Be("init");
}
[Fact]
[Trait("Category", TestCategories.Unit)]
[Fact]
public void EnsureV1_PreservesEntrypoints_WhenAlreadyPresent()
{
// Arrange
@@ -567,7 +592,8 @@ public class CallgraphSchemaMigratorTests
#region EnsureV1 - Ordering Tests
[Fact]
[Trait("Category", TestCategories.Unit)]
[Fact]
public void EnsureV1_SortsNodes_ByIdAlphabetically()
{
// Arrange
@@ -588,7 +614,8 @@ public class CallgraphSchemaMigratorTests
result.Nodes.Select(n => n.Id).Should().BeInAscendingOrder();
}
[Fact]
[Trait("Category", TestCategories.Unit)]
[Fact]
public void EnsureV1_SortsEdges_BySourceThenTargetThenTypeThenOffset()
{
// Arrange
@@ -613,7 +640,8 @@ public class CallgraphSchemaMigratorTests
sortedEdges[0].Type.Should().Be("call");
}
[Fact]
[Trait("Category", TestCategories.Unit)]
[Fact]
public void EnsureV1_SortsEntrypoints_ByPhaseThenOrder()
{
// Arrange
@@ -641,14 +669,16 @@ public class CallgraphSchemaMigratorTests
#region EnsureV1 - Null Handling Tests
[Fact]
[Trait("Category", TestCategories.Unit)]
[Fact]
public void EnsureV1_ThrowsArgumentNullException_ForNullDocument()
{
// Act & Assert
Assert.Throws<ArgumentNullException>(() => CallgraphSchemaMigrator.EnsureV1(null!));
}
[Fact]
[Trait("Category", TestCategories.Unit)]
[Fact]
public void EnsureV1_HandlesEmptyNodes_Gracefully()
{
// Arrange
@@ -664,7 +694,8 @@ public class CallgraphSchemaMigratorTests
result.Nodes.Should().BeEmpty();
}
[Fact]
[Trait("Category", TestCategories.Unit)]
[Fact]
public void EnsureV1_HandlesEmptyEdges_Gracefully()
{
// Arrange
@@ -684,7 +715,8 @@ public class CallgraphSchemaMigratorTests
#region Framework Inference Tests
[Fact]
[Trait("Category", TestCategories.Unit)]
[Fact]
public void EnsureV1_InfersAspNetCoreFramework_ForDotNetController()
{
// Arrange
@@ -706,7 +738,8 @@ public class CallgraphSchemaMigratorTests
.Which.Framework.Should().Be(EntrypointFramework.AspNetCore);
}
[Fact]
[Trait("Category", TestCategories.Unit)]
[Fact]
public void EnsureV1_InfersSpringFramework_ForJavaController()
{
// Arrange

View File

@@ -9,6 +9,7 @@ using StellaOps.Signals.Models;
using StellaOps.Signals.Parsing;
using Xunit;
using StellaOps.TestKit;
namespace StellaOps.Signals.Reachability.Tests;
/// <summary>
@@ -45,7 +46,8 @@ public sealed class CallgraphSchemaV1DeterminismTests
}
}
[Theory]
[Trait("Category", TestCategories.Unit)]
[Theory]
[MemberData(nameof(GoldenFixtures))]
public void GoldenFixture_DeserializesWithoutError(string fixtureName)
{
@@ -57,7 +59,8 @@ public sealed class CallgraphSchemaV1DeterminismTests
document!.Id.Should().NotBeNullOrEmpty();
}
[Theory]
[Trait("Category", TestCategories.Unit)]
[Theory]
[MemberData(nameof(GoldenFixtures))]
public void GoldenFixture_NodesHaveRequiredFields(string fixtureName)
{
@@ -71,7 +74,8 @@ public sealed class CallgraphSchemaV1DeterminismTests
}
}
[Theory]
[Trait("Category", TestCategories.Unit)]
[Theory]
[MemberData(nameof(GoldenFixtures))]
public void GoldenFixture_EdgesReferenceValidNodes(string fixtureName)
{
@@ -87,7 +91,8 @@ public sealed class CallgraphSchemaV1DeterminismTests
}
}
[Theory]
[Trait("Category", TestCategories.Unit)]
[Theory]
[MemberData(nameof(GoldenFixtures))]
public void GoldenFixture_EntrypointsReferenceValidNodes(string fixtureName)
{
@@ -102,7 +107,8 @@ public sealed class CallgraphSchemaV1DeterminismTests
}
}
[Fact]
[Trait("Category", TestCategories.Unit)]
[Fact]
public void DotNetFixture_HasCorrectLanguageEnum()
{
var json = File.ReadAllText(Path.Combine(FixtureRoot, "dotnet-aspnetcore-minimal.json"));
@@ -111,7 +117,8 @@ public sealed class CallgraphSchemaV1DeterminismTests
document.LanguageType.Should().Be(CallgraphLanguage.DotNet);
}
[Fact]
[Trait("Category", TestCategories.Unit)]
[Fact]
public void JavaFixture_HasCorrectLanguageEnum()
{
var json = File.ReadAllText(Path.Combine(FixtureRoot, "java-spring-boot.json"));
@@ -120,7 +127,8 @@ public sealed class CallgraphSchemaV1DeterminismTests
document.LanguageType.Should().Be(CallgraphLanguage.Java);
}
[Fact]
[Trait("Category", TestCategories.Unit)]
[Fact]
public void NodeFixture_HasCorrectLanguageEnum()
{
var json = File.ReadAllText(Path.Combine(FixtureRoot, "node-express-api.json"));
@@ -129,7 +137,8 @@ public sealed class CallgraphSchemaV1DeterminismTests
document.LanguageType.Should().Be(CallgraphLanguage.Node);
}
[Fact]
[Trait("Category", TestCategories.Unit)]
[Fact]
public void GoFixture_HasCorrectLanguageEnum()
{
var json = File.ReadAllText(Path.Combine(FixtureRoot, "go-gin-api.json"));
@@ -138,7 +147,8 @@ public sealed class CallgraphSchemaV1DeterminismTests
document.LanguageType.Should().Be(CallgraphLanguage.Go);
}
[Fact]
[Trait("Category", TestCategories.Unit)]
[Fact]
public void AllEdgeReasonsFixture_ContainsAllEdgeReasons()
{
var json = File.ReadAllText(Path.Combine(FixtureRoot, "all-edge-reasons.json"));
@@ -153,7 +163,8 @@ public sealed class CallgraphSchemaV1DeterminismTests
}
}
[Fact]
[Trait("Category", TestCategories.Unit)]
[Fact]
public void AllEdgeReasonsFixture_ContainsAllEdgeKinds()
{
var json = File.ReadAllText(Path.Combine(FixtureRoot, "all-edge-reasons.json"));
@@ -168,7 +179,8 @@ public sealed class CallgraphSchemaV1DeterminismTests
}
}
[Fact]
[Trait("Category", TestCategories.Unit)]
[Fact]
public void AllVisibilityFixture_ContainsAllVisibilityLevels()
{
var json = File.ReadAllText(Path.Combine(FixtureRoot, "all-visibility-levels.json"));
@@ -183,7 +195,8 @@ public sealed class CallgraphSchemaV1DeterminismTests
}
}
[Fact]
[Trait("Category", TestCategories.Unit)]
[Fact]
public void LegacyFixture_HasNoSchemaField()
{
var json = File.ReadAllText(Path.Combine(FixtureRoot, "legacy-no-schema.json"));
@@ -193,7 +206,8 @@ public sealed class CallgraphSchemaV1DeterminismTests
document.Schema.Should().Be(CallgraphSchemaVersions.V1);
}
[Fact]
[Trait("Category", TestCategories.Unit)]
[Fact]
public void LegacyFixture_MigratesToV1Schema()
{
var json = File.ReadAllText(Path.Combine(FixtureRoot, "legacy-no-schema.json"));
@@ -208,7 +222,8 @@ public sealed class CallgraphSchemaV1DeterminismTests
migrated.Edges.Should().AllSatisfy(e => Enum.IsDefined(e.Reason).Should().BeTrue());
}
[Theory]
[Trait("Category", TestCategories.Unit)]
[Theory]
[InlineData("dotnet-aspnetcore-minimal")]
[InlineData("java-spring-boot")]
[InlineData("node-express-api")]
@@ -227,7 +242,8 @@ public sealed class CallgraphSchemaV1DeterminismTests
migrated2.Entrypoints.Should().HaveCount(migrated1.Entrypoints.Count);
}
[Fact]
[Trait("Category", TestCategories.Unit)]
[Fact]
public void EdgeReason_SerializesAsCamelCaseString()
{
var edge = new CallgraphEdge
@@ -243,7 +259,8 @@ public sealed class CallgraphSchemaV1DeterminismTests
json.Should().Contain("\"reason\": \"directCall\"");
}
[Fact]
[Trait("Category", TestCategories.Unit)]
[Fact]
public void SymbolVisibility_SerializesAsCamelCaseString()
{
var node = new CallgraphNode
@@ -259,7 +276,8 @@ public sealed class CallgraphSchemaV1DeterminismTests
json.Should().Contain("\"visibility\": \"public\"");
}
[Fact]
[Trait("Category", TestCategories.Unit)]
[Fact]
public void EntrypointKind_SerializesAsCamelCaseString()
{
var entrypoint = new CallgraphEntrypoint
@@ -275,7 +293,8 @@ public sealed class CallgraphSchemaV1DeterminismTests
json.Should().Contain("\"framework\": \"aspNetCore\"");
}
[Theory]
[Trait("Category", TestCategories.Unit)]
[Theory]
[MemberData(nameof(GoldenFixtures))]
public void GoldenFixture_NodesSortedById(string fixtureName)
{
@@ -288,7 +307,8 @@ public sealed class CallgraphSchemaV1DeterminismTests
nodeIds.Should().Equal(sortedIds, $"Nodes in {fixtureName} should be sorted by Id for determinism");
}
[Theory]
[Trait("Category", TestCategories.Unit)]
[Theory]
[MemberData(nameof(GoldenFixtures))]
public void GoldenFixture_EntrypointsSortedByOrder(string fixtureName)
{
@@ -301,7 +321,8 @@ public sealed class CallgraphSchemaV1DeterminismTests
orders.Should().Equal(sortedOrders, $"Entrypoints in {fixtureName} should be sorted by Order for determinism");
}
[Fact]
[Trait("Category", TestCategories.Unit)]
[Fact]
public void DotNetFixture_HasCorrectAspNetCoreEntrypoints()
{
var json = File.ReadAllText(Path.Combine(FixtureRoot, "dotnet-aspnetcore-minimal.json"));
@@ -311,7 +332,8 @@ public sealed class CallgraphSchemaV1DeterminismTests
document.Entrypoints.Should().Contain(e => e.Kind == EntrypointKind.Http && e.Route == "/weatherforecast");
}
[Fact]
[Trait("Category", TestCategories.Unit)]
[Fact]
public void JavaFixture_HasCorrectSpringEntrypoints()
{
var json = File.ReadAllText(Path.Combine(FixtureRoot, "java-spring-boot.json"));
@@ -321,7 +343,8 @@ public sealed class CallgraphSchemaV1DeterminismTests
document.Entrypoints.Should().Contain(e => e.Kind == EntrypointKind.Http && e.Route == "/owners/{ownerId}");
}
[Fact]
[Trait("Category", TestCategories.Unit)]
[Fact]
public void GoFixture_HasModuleInitEntrypoint()
{
var json = File.ReadAllText(Path.Combine(FixtureRoot, "go-gin-api.json"));
@@ -330,7 +353,8 @@ public sealed class CallgraphSchemaV1DeterminismTests
document.Entrypoints.Should().Contain(e => e.Kind == EntrypointKind.ModuleInit && e.Phase == EntrypointPhase.ModuleInit);
}
[Fact]
[Trait("Category", TestCategories.Unit)]
[Fact]
public void AllEdgeReasonsFixture_ReflectionEdgeIsUnresolved()
{
var json = File.ReadAllText(Path.Combine(FixtureRoot, "all-edge-reasons.json"));
@@ -341,7 +365,8 @@ public sealed class CallgraphSchemaV1DeterminismTests
reflectionEdge.Weight.Should().BeLessThan(1.0, "Reflection edges should have lower confidence");
}
[Fact]
[Trait("Category", TestCategories.Unit)]
[Fact]
public void AllEdgeReasonsFixture_DiBindingHasProvenance()
{
var json = File.ReadAllText(Path.Combine(FixtureRoot, "all-edge-reasons.json"));
@@ -351,7 +376,8 @@ public sealed class CallgraphSchemaV1DeterminismTests
diEdge.Provenance.Should().NotBeNullOrEmpty("DI binding edges should include provenance");
}
[Fact]
[Trait("Category", TestCategories.Unit)]
[Fact]
public void Artifacts_HaveRequiredFields()
{
var json = File.ReadAllText(Path.Combine(FixtureRoot, "dotnet-aspnetcore-minimal.json"));
@@ -366,7 +392,8 @@ public sealed class CallgraphSchemaV1DeterminismTests
}
}
[Fact]
[Trait("Category", TestCategories.Unit)]
[Fact]
public void Metadata_HasRequiredToolInfo()
{
var json = File.ReadAllText(Path.Combine(FixtureRoot, "dotnet-aspnetcore-minimal.json"));

View File

@@ -41,7 +41,8 @@ public sealed class ReachabilityScoringTests
}
}
[Theory]
[Trait("Category", TestCategories.Unit)]
[Theory]
[MemberData(nameof(CaseVariants))]
public async Task RecomputedFactsMatchTruthFixtures(string caseId, string variant)
{
@@ -142,6 +143,7 @@ public sealed class ReachabilityScoringTests
}
using var doc = JsonDocument.Parse(line);
using StellaOps.TestKit;
if (doc.RootElement.TryGetProperty("sid", out var sidProp))
{
runtimeHits.Add(sidProp.GetString()!);

View File

@@ -10,6 +10,7 @@ using StellaOps.Signals.Persistence;
using StellaOps.Signals.Services;
using Xunit;
using StellaOps.TestKit;
namespace StellaOps.Signals.Reachability.Tests;
public sealed class RuntimeFactsIngestionServiceTests
@@ -34,7 +35,8 @@ public sealed class RuntimeFactsIngestionServiceTests
NullLogger<RuntimeFactsIngestionService>.Instance);
}
[Fact]
[Trait("Category", TestCategories.Unit)]
[Fact]
public async Task IngestAsync_InsertsAggregatedFacts()
{
var request = new RuntimeFactsIngestRequest
@@ -89,7 +91,8 @@ public sealed class RuntimeFactsIngestionServiceTests
repository.LastUpsert!.Metadata.Should().ContainKey("source");
}
[Fact]
[Trait("Category", TestCategories.Unit)]
[Fact]
public async Task IngestAsync_MergesExistingDocument()
{
var existing = new ReachabilityFactDocument
@@ -128,7 +131,8 @@ public sealed class RuntimeFactsIngestionServiceTests
repository.LastUpsert!.RuntimeFacts![1].Metadata.Should().ContainKey("thread").WhoseValue.Should().Be("main");
}
[Theory]
[Trait("Category", TestCategories.Unit)]
[Theory]
[InlineData(null)]
[InlineData("")]
public async Task IngestAsync_ValidatesCallgraphId(string? callgraphId)

View File

@@ -11,7 +11,8 @@ namespace StellaOps.Signals.Reachability.Tests;
public sealed class RuntimeFactsNdjsonReaderTests
{
[Fact]
[Trait("Category", TestCategories.Unit)]
[Fact]
public async Task ReadAsync_ParsesLines()
{
var ndjson = """
@@ -29,7 +30,8 @@ public sealed class RuntimeFactsNdjsonReaderTests
events[1].LoaderBase.Should().Be("0x1000");
}
[Fact]
[Trait("Category", TestCategories.Unit)]
[Fact]
public async Task ReadAsync_HandlesGzip()
{
var ndjson = """
@@ -40,6 +42,7 @@ public sealed class RuntimeFactsNdjsonReaderTests
await using (var writer = new StreamWriter(gzip, Encoding.UTF8, leaveOpen: true))
{
await writer.WriteAsync(ndjson);
using StellaOps.TestKit;
}
compressed.Position = 0;

View File

@@ -7,13 +7,15 @@ using StellaOps.Signals.Hosting;
using StellaOps.Signals.Options;
using Xunit;
using StellaOps.TestKit;
namespace StellaOps.Signals.Reachability.Tests;
public sealed class SignalsSealedModeMonitorTests : IDisposable
{
private readonly string tempDir = Path.Combine(Path.GetTempPath(), $"signals-sealed-tests-{Guid.NewGuid():N}");
[Fact]
[Trait("Category", TestCategories.Unit)]
[Fact]
public void IsCompliant_WhenEnforcementDisabled_ReturnsTrue()
{
var options = new SignalsOptions();
@@ -24,7 +26,8 @@ public sealed class SignalsSealedModeMonitorTests : IDisposable
monitor.IsCompliant(out _).Should().BeTrue();
}
[Fact]
[Trait("Category", TestCategories.Unit)]
[Fact]
public void IsCompliant_WhenEvidenceMissing_ReturnsFalse()
{
var options = CreateEnforcedOptions();
@@ -36,7 +39,8 @@ public sealed class SignalsSealedModeMonitorTests : IDisposable
reason.Should().Contain("not found");
}
[Fact]
[Trait("Category", TestCategories.Unit)]
[Fact]
public void IsCompliant_WhenEvidenceFresh_ReturnsTrue()
{
var evidencePath = CreateEvidenceFile(TimeSpan.Zero);
@@ -48,7 +52,8 @@ public sealed class SignalsSealedModeMonitorTests : IDisposable
monitor.IsCompliant(out _).Should().BeTrue();
}
[Fact]
[Trait("Category", TestCategories.Unit)]
[Fact]
public void IsCompliant_WhenEvidenceStale_ReturnsFalse()
{
var evidencePath = CreateEvidenceFile(TimeSpan.FromHours(7));