Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions requirements.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -436,6 +436,7 @@ sections:
- Program_Run_WithEnforcementAndUnsatisfiedRequirements_Fails
- Program_Run_WithEnforcementAndNoTests_Fails
- Program_Run_WithEnforcementAndFailedTests_Fails
- ReqStream_EnforcementMode

- title: Platform Support
requirements:
Expand All @@ -451,6 +452,7 @@ sections:
- "windows@ReqStream_TraceMatrix"
- "windows@ReqStream_ReportExport"
- "windows@ReqStream_TagsFiltering"
- "windows@ReqStream_EnforcementMode"

- id: PLT-002
title: The tool shall run on Linux operating systems.
Expand All @@ -464,6 +466,7 @@ sections:
- "ubuntu@ReqStream_TraceMatrix"
- "ubuntu@ReqStream_ReportExport"
- "ubuntu@ReqStream_TagsFiltering"
- "ubuntu@ReqStream_EnforcementMode"

- id: PLT-004
title: The tool shall support .NET 8.0 runtime.
Expand All @@ -476,6 +479,7 @@ sections:
- "dotnet8.x@ReqStream_TraceMatrix"
- "dotnet8.x@ReqStream_ReportExport"
- "dotnet8.x@ReqStream_TagsFiltering"
- "dotnet8.x@ReqStream_EnforcementMode"

- id: PLT-005
title: The tool shall support .NET 9.0 runtime.
Expand All @@ -489,6 +493,7 @@ sections:
- "dotnet9.x@ReqStream_TraceMatrix"
- "dotnet9.x@ReqStream_ReportExport"
- "dotnet9.x@ReqStream_TagsFiltering"
- "dotnet9.x@ReqStream_EnforcementMode"

- id: PLT-006
title: The tool shall support .NET 10.0 runtime.
Expand All @@ -502,3 +507,4 @@ sections:
- "dotnet10.x@ReqStream_TraceMatrix"
- "dotnet10.x@ReqStream_ReportExport"
- "dotnet10.x@ReqStream_TagsFiltering"
- "dotnet10.x@ReqStream_EnforcementMode"
101 changes: 101 additions & 0 deletions src/DemaConsulting.ReqStream/Validation.cs
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,7 @@
RunTraceMatrixTest(context, testResults);
RunReportExportTest(context, testResults);
RunTagsFilteringTest(context, testResults);
RunEnforcementModeTest(context, testResults);

// Calculate totals
var totalTests = testResults.Results.Count;
Expand Down Expand Up @@ -127,7 +128,7 @@
{
// Run the program with requirements file (using relative pattern)
int exitCode;
using (var testContext = Context.Create(["--silent", "--log", "requirements-test.log", "--requirements", "*.yaml"]))

Check warning on line 131 in src/DemaConsulting.ReqStream/Validation.cs

View workflow job for this annotation

GitHub Actions / Build / Build ubuntu-latest

Define a constant instead of using this literal '--requirements' 6 times.

Check warning on line 131 in src/DemaConsulting.ReqStream/Validation.cs

View workflow job for this annotation

GitHub Actions / Build / Build ubuntu-latest

Define a constant instead of using this literal '--log' 4 times.

Check warning on line 131 in src/DemaConsulting.ReqStream/Validation.cs

View workflow job for this annotation

GitHub Actions / Build / Build ubuntu-latest

Define a constant instead of using this literal '--silent' 6 times.

Check warning on line 131 in src/DemaConsulting.ReqStream/Validation.cs

View workflow job for this annotation

GitHub Actions / Build / Build ubuntu-latest

Define a constant instead of using this literal '--requirements' 6 times.

Check warning on line 131 in src/DemaConsulting.ReqStream/Validation.cs

View workflow job for this annotation

GitHub Actions / Build / Build ubuntu-latest

Define a constant instead of using this literal '--log' 4 times.

Check warning on line 131 in src/DemaConsulting.ReqStream/Validation.cs

View workflow job for this annotation

GitHub Actions / Build / Build ubuntu-latest

Define a constant instead of using this literal '--silent' 6 times.

Check warning on line 131 in src/DemaConsulting.ReqStream/Validation.cs

View workflow job for this annotation

GitHub Actions / Build / Build windows-latest

Define a constant instead of using this literal '--requirements' 6 times.

Check warning on line 131 in src/DemaConsulting.ReqStream/Validation.cs

View workflow job for this annotation

GitHub Actions / Build / Build windows-latest

Define a constant instead of using this literal '--log' 4 times.

Check warning on line 131 in src/DemaConsulting.ReqStream/Validation.cs

View workflow job for this annotation

GitHub Actions / Build / Build windows-latest

Define a constant instead of using this literal '--silent' 6 times.

Check warning on line 131 in src/DemaConsulting.ReqStream/Validation.cs

View workflow job for this annotation

GitHub Actions / Build / Build windows-latest

Define a constant instead of using this literal '--requirements' 6 times.

Check warning on line 131 in src/DemaConsulting.ReqStream/Validation.cs

View workflow job for this annotation

GitHub Actions / Build / Build windows-latest

Define a constant instead of using this literal '--log' 4 times.

Check warning on line 131 in src/DemaConsulting.ReqStream/Validation.cs

View workflow job for this annotation

GitHub Actions / Build / Build windows-latest

Define a constant instead of using this literal '--silent' 6 times.
{
Program.Run(testContext);
exitCode = testContext.ExitCode;
Expand Down Expand Up @@ -396,6 +397,106 @@
FinalizeTestResult(test, startTime, testResults);
}

/// <summary>
/// Runs a test for enforcement mode functionality.
/// </summary>
/// <param name="context">The context for output.</param>
/// <param name="testResults">The test results collection.</param>
private static void RunEnforcementModeTest(Context context, DemaConsulting.TestResults.TestResults testResults)
{
var startTime = DateTime.UtcNow;
var test = CreateTestResult("ReqStream_EnforcementMode");

try
{
using var tempDir = new TemporaryDirectory();

// Create a requirements file with a requirement linked to a test
var reqFile = Path.Combine(tempDir.DirectoryPath, "enforce-requirements.yaml");
var reqYaml = @"sections:
- title: Enforce Test
requirements:
- id: ENF-001
title: Enforcement requirement
tests:
- Test_Enforce_Validation
";
File.WriteAllText(reqFile, reqYaml);

// Create a TRX file with a passing test
var trxFile = Path.Combine(tempDir.DirectoryPath, "test-results.trx");
var testData = new DemaConsulting.TestResults.TestResults { Name = "EnforceTests" };
testData.Results.Add(new DemaConsulting.TestResults.TestResult
{
Name = "Test_Enforce_Validation",
ClassName = "EnforceTests",
CodeBase = "Tests.dll",
Outcome = DemaConsulting.TestResults.TestOutcome.Passed,
Duration = TimeSpan.FromSeconds(1)
});
File.WriteAllText(trxFile, TrxSerializer.Serialize(testData));

using (new DirectorySwitch(tempDir.DirectoryPath))
{
// Verify that --enforce succeeds when all requirements are satisfied
int exitCode;
using (var testContext = Context.Create(["--silent", "--requirements", "*-requirements.yaml",
"--tests", "*.trx", "--enforce"]))
{
Program.Run(testContext);
exitCode = testContext.ExitCode;
}

if (exitCode != 0)
{
test.Outcome = DemaConsulting.TestResults.TestOutcome.Failed;
test.ErrorMessage = $"Enforcement with satisfied requirements should succeed, but exited with code {exitCode}";
context.WriteError($"✗ Enforcement Mode Test - FAILED: {test.ErrorMessage}");
}
else
{
// Create an unsatisfied requirements file for the second check
var unsatisfiedReqFile = Path.Combine(tempDir.DirectoryPath, "unsatisfied-requirements.yaml");
var unsatisfiedYaml = @"sections:
- title: Unsatisfied Test
requirements:
- id: UNS-001
title: Unsatisfied requirement
tests:
- Test_NonExistent
";
File.WriteAllText(unsatisfiedReqFile, unsatisfiedYaml);

// Verify that --enforce fails when requirements are not satisfied
using (var testContext = Context.Create(["--silent", "--requirements", "unsatisfied-requirements.yaml",
"--tests", "*.trx", "--enforce"]))
{
Program.Run(testContext);
exitCode = testContext.ExitCode;
}

if (exitCode == 0)
{
test.Outcome = DemaConsulting.TestResults.TestOutcome.Failed;
test.ErrorMessage = "Enforcement with unsatisfied requirements should fail, but succeeded";
context.WriteError($"✗ Enforcement Mode Test - FAILED: {test.ErrorMessage}");
}
else
{
test.Outcome = DemaConsulting.TestResults.TestOutcome.Passed;
context.WriteLine("✓ Enforcement Mode Test - PASSED");
}
}
}
}
catch (Exception ex)
{
HandleTestException(test, context, "Enforcement Mode Test", ex);
}

FinalizeTestResult(test, startTime, testResults);
}

/// <summary>
/// Writes test results to a file in TRX or JUnit format.
/// </summary>
Expand Down
5 changes: 3 additions & 2 deletions test/DemaConsulting.ReqStream.Tests/ProgramTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -130,8 +130,9 @@ public void Program_Run_WithValidateFlag_RunsValidation()
Assert.Contains("Trace Matrix Test - PASSED", logContent);
Assert.Contains("Report Export Test - PASSED", logContent);
Assert.Contains("Tags Filtering Test - PASSED", logContent);
Assert.Contains("Total Tests: 4", logContent);
Assert.Contains("Passed: 4", logContent);
Assert.Contains("Enforcement Mode Test - PASSED", logContent);
Assert.Contains("Total Tests: 5", logContent);
Assert.Contains("Passed: 5", logContent);
Assert.Contains("Failed: 0", logContent);
}

Expand Down
Loading