Files
git.stella-ops.org/src/Cli/__Tests/StellaOps.Cli.Tests/Integration/DeprecationWarningTests.cs

275 lines
8.4 KiB
C#

// -----------------------------------------------------------------------------
// DeprecationWarningTests.cs
// Sprint: SPRINT_20260118_014_CLI_evidence_remaining_consolidation (CLI-E-009)
// Description: Tests verifying that deprecated command paths produce appropriate
// deprecation warnings to guide users toward canonical paths.
// -----------------------------------------------------------------------------
using System;
using System.IO;
using Xunit;
using StellaOps.Cli.Infrastructure;
namespace StellaOps.Cli.Tests.Integration;
/// <summary>
/// Tests verifying deprecation warnings are properly generated for old command paths.
/// Ensures users are guided toward canonical command paths with clear messaging.
/// </summary>
[Trait("Category", "Integration")]
[Trait("Sprint", "SPRINT_20260118_014_CLI_evidence_remaining_consolidation")]
public class DeprecationWarningTests
{
#region Warning Message Format Tests
[Theory]
[InlineData("evidenceholds list", "evidence holds list")]
[InlineData("reachgraph list", "reachability graph list")]
[InlineData("sbomer compose", "sbom compose")]
[InlineData("keys list", "crypto keys list")]
[InlineData("doctor run", "admin doctor run")]
[InlineData("binary diff", "tools binary diff")]
[InlineData("gate evaluate", "release gate evaluate")]
[InlineData("vexgatescan", "vex gate-scan")]
public void DeprecatedPath_ShouldGenerateWarningWithCanonicalPath(string oldPath, string newPath)
{
// Arrange
var router = CommandRouter.LoadFromEmbeddedResource();
// Act
var warning = router.GetDeprecationWarning(oldPath);
// Assert
Assert.NotNull(warning);
Assert.Contains(newPath, warning);
Assert.Contains("deprecated", warning, StringComparison.OrdinalIgnoreCase);
}
[Theory]
[InlineData("evidenceholds list")]
[InlineData("reachgraph list")]
[InlineData("sbomer compose")]
[InlineData("keys list")]
[InlineData("doctor run")]
public void DeprecatedPath_ShouldIncludeRemovalVersion(string oldPath)
{
// Arrange
var router = CommandRouter.LoadFromEmbeddedResource();
// Act
var warning = router.GetDeprecationWarning(oldPath);
// Assert
Assert.NotNull(warning);
Assert.Contains("3.0", warning);
}
[Theory]
[InlineData("evidenceholds list", "Evidence commands consolidated")]
[InlineData("reachgraph list", "Reachability graph consolidated")]
[InlineData("sbomer compose", "SBOM commands consolidated")]
[InlineData("keys list", "Key management consolidated under crypto")]
[InlineData("doctor run", "Doctor consolidated under admin")]
[InlineData("binary diff", "Utility commands consolidated under tools")]
[InlineData("gate evaluate", "Gate evaluation consolidated under release")]
[InlineData("vexgatescan", "VEX gate scan consolidated")]
public void DeprecatedPath_ShouldIncludeReasonForMove(string oldPath, string expectedReason)
{
// Arrange
var router = CommandRouter.LoadFromEmbeddedResource();
// Act
var reason = router.GetDeprecationReason(oldPath);
// Assert
Assert.NotNull(reason);
Assert.Contains(expectedReason, reason, StringComparison.OrdinalIgnoreCase);
}
#endregion
#region Warning Output Tests
[Fact]
public void DeprecatedPath_ShouldWriteWarningToStderr()
{
// Arrange
var router = CommandRouter.LoadFromEmbeddedResource();
var originalError = Console.Error;
using var errorWriter = new StringWriter();
Console.SetError(errorWriter);
try
{
// Act
router.EmitDeprecationWarningIfNeeded("evidenceholds list");
var output = errorWriter.ToString();
// Assert
Assert.Contains("warning", output, StringComparison.OrdinalIgnoreCase);
Assert.Contains("evidence holds list", output);
}
finally
{
Console.SetError(originalError);
}
}
[Fact]
public void NonDeprecatedPath_ShouldNotWriteWarning()
{
// Arrange
var router = CommandRouter.LoadFromEmbeddedResource();
var originalError = Console.Error;
using var errorWriter = new StringWriter();
Console.SetError(errorWriter);
try
{
// Act
router.EmitDeprecationWarningIfNeeded("evidence holds list");
var output = errorWriter.ToString();
// Assert
Assert.Empty(output);
}
finally
{
Console.SetError(originalError);
}
}
#endregion
#region Warning Count Tests
[Fact]
public void AllDeprecatedPaths_ShouldHaveWarnings()
{
// Arrange
var router = CommandRouter.LoadFromEmbeddedResource();
var deprecatedPaths = router.GetAllDeprecatedPaths();
// Act & Assert
foreach (var path in deprecatedPaths)
{
var warning = router.GetDeprecationWarning(path);
Assert.NotNull(warning);
Assert.NotEmpty(warning);
}
}
[Fact]
public void DeprecatedPathCount_ShouldMatchExpected()
{
// Arrange
var router = CommandRouter.LoadFromEmbeddedResource();
// Act
var deprecatedPaths = router.GetAllDeprecatedPaths();
// Assert - Sprint 014 adds significant number of deprecated paths
// Sprints 011-014 combined should have 45+ deprecated paths
Assert.True(deprecatedPaths.Count >= 45,
$"Expected at least 45 deprecated paths, but found {deprecatedPaths.Count}");
}
#endregion
#region Warning Consistency Tests
[Theory]
[InlineData("evidenceholds list", "evidence holds list")]
[InlineData("EVIDENCEHOLDS LIST", "evidence holds list")]
[InlineData("EvidenceHolds List", "evidence holds list")]
public void DeprecatedPath_ShouldBeCaseInsensitive(string oldPath, string expectedNewPath)
{
// Arrange
var router = CommandRouter.LoadFromEmbeddedResource();
// Act
var resolved = router.ResolveCanonicalPath(oldPath);
// Assert
Assert.Equal(expectedNewPath, resolved);
}
[Theory]
[InlineData("evidenceholds list", "evidence holds list")]
[InlineData(" evidenceholds list ", "evidence holds list")]
public void DeprecatedPath_ShouldHandleExtraWhitespace(string oldPath, string expectedNewPath)
{
// Arrange
var router = CommandRouter.LoadFromEmbeddedResource();
// Act
var resolved = router.ResolveCanonicalPath(oldPath);
// Assert
Assert.Equal(expectedNewPath, resolved);
}
#endregion
#region Warning Suppression Tests
[Fact]
public void DeprecationWarning_ShouldRespectSuppressFlag()
{
// Arrange
var router = CommandRouter.LoadFromEmbeddedResource();
// Act
router.SuppressWarnings = true;
var originalError = Console.Error;
using var errorWriter = new StringWriter();
Console.SetError(errorWriter);
try
{
router.EmitDeprecationWarningIfNeeded("evidenceholds list");
var output = errorWriter.ToString();
// Assert
Assert.Empty(output);
}
finally
{
Console.SetError(originalError);
router.SuppressWarnings = false;
}
}
[Fact]
public void DeprecationWarning_ShouldRespectEnvironmentVariable()
{
// Arrange
var router = CommandRouter.LoadFromEmbeddedResource();
var originalValue = Environment.GetEnvironmentVariable("STELLA_SUPPRESS_DEPRECATION_WARNINGS");
try
{
// Act
Environment.SetEnvironmentVariable("STELLA_SUPPRESS_DEPRECATION_WARNINGS", "1");
var originalError = Console.Error;
using var errorWriter = new StringWriter();
Console.SetError(errorWriter);
Console.SetError(errorWriter);
router.EmitDeprecationWarningIfNeeded("evidenceholds list");
Console.SetError(originalError);
var output = errorWriter.ToString();
// Assert
Assert.Empty(output);
}
finally
{
Environment.SetEnvironmentVariable("STELLA_SUPPRESS_DEPRECATION_WARNINGS", originalValue);
}
}
#endregion
}