From 8784ba7b57575e22b3b56be360f012f17fb2c706 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Nov=C3=A1k?= Date: Thu, 2 Jul 2026 00:02:37 +0200 Subject: [PATCH] SOLID refactoring: Abstract prerequisite checks into IPrerequisiteVerifier to bypass physical OS checks and fix Gitea CI/CD test run --- .agents/AGENTS.md | 2 +- src/NixWslWrapper.Cli/CliController.cs | 6 ++++-- src/NixWslWrapper.Cli/Program.cs | 2 ++ .../Interfaces/IPrerequisiteVerifier.cs | 7 +++++++ .../NixWslWrapper.Infrastructure.csproj | 4 ++++ .../Services/WslPrerequisiteVerifier.cs} | 13 +++++++------ tests/NixWslWrapper.Tests/CliTests.cs | 6 ++++-- 7 files changed, 29 insertions(+), 11 deletions(-) create mode 100644 src/NixWslWrapper.Core/Interfaces/IPrerequisiteVerifier.cs rename src/{NixWslWrapper.Cli/PrerequisiteManager.cs => NixWslWrapper.Infrastructure/Services/WslPrerequisiteVerifier.cs} (95%) diff --git a/.agents/AGENTS.md b/.agents/AGENTS.md index 2d1e86b..eff80dc 100644 --- a/.agents/AGENTS.md +++ b/.agents/AGENTS.md @@ -14,7 +14,7 @@ All future modifications to the `NixWslWrapper` solution must adhere to the foll * **SOLID Principles**: * *Single Responsibility (SRP)*: Keep execution strategies, builders, stream copiers, and CLI formatting separated. * *Open/Closed (OCP)*: If we need execution methods other than WSL (e.g. SSH, Local), implement a new strategy implementing `ICommandExecutor` rather than modifying `WslCommandExecutor`. - * *Dependency Inversion (DIP)*: Inject interfaces (`ICommandExecutor`, `IStreamCopier`) and stream abstractions (`Stream`) to facilitate seamless unit testing and mock assertions. + * *Dependency Inversion (DIP)*: Inject interfaces (`ICommandExecutor`, `IStreamCopier`, `IPrerequisiteVerifier`) and stream abstractions (`Stream`) to facilitate seamless unit testing and mock assertions without hitting physical OS or environmental components. * **Visual UI/UX Check**: * For CLI diagnostics, use `Spectre.Console` markup (`[color]...[/]`) to color-code output. Always escape literal brackets by doubling them (`[[literal-text]]`) to prevent parser errors. * Render a rich dashboard with `FigletText` and `Table` grids when administrative diagnostics are run (e.g. `--wsl-status`). diff --git a/src/NixWslWrapper.Cli/CliController.cs b/src/NixWslWrapper.Cli/CliController.cs index 0bf7db8..ba47032 100644 --- a/src/NixWslWrapper.Cli/CliController.cs +++ b/src/NixWslWrapper.Cli/CliController.cs @@ -10,10 +10,12 @@ namespace NixWslWrapper.Cli public class CliController { private readonly ICommandExecutor _commandExecutor; + private readonly IPrerequisiteVerifier _prerequisiteVerifier; - public CliController(ICommandExecutor commandExecutor) + public CliController(ICommandExecutor commandExecutor, IPrerequisiteVerifier prerequisiteVerifier) { _commandExecutor = commandExecutor ?? throw new ArgumentNullException(nameof(commandExecutor)); + _prerequisiteVerifier = prerequisiteVerifier ?? throw new ArgumentNullException(nameof(prerequisiteVerifier)); } public int Run(string[] args) @@ -38,7 +40,7 @@ namespace NixWslWrapper.Cli try { - PrerequisiteManager.EnsurePrerequisites(distro, user, profile); + _prerequisiteVerifier.EnsurePrerequisites(distro, user, profile); } catch (Exception ex) { diff --git a/src/NixWslWrapper.Cli/Program.cs b/src/NixWslWrapper.Cli/Program.cs index 4a7b7a8..d7f7862 100644 --- a/src/NixWslWrapper.Cli/Program.cs +++ b/src/NixWslWrapper.Cli/Program.cs @@ -3,6 +3,7 @@ using Microsoft.Extensions.DependencyInjection; using NixWslWrapper.Core.Interfaces; using NixWslWrapper.Infrastructure.IO; using NixWslWrapper.Infrastructure.Executors; +using NixWslWrapper.Infrastructure.Services; namespace NixWslWrapper.Cli { @@ -20,6 +21,7 @@ namespace NixWslWrapper.Cli return new ServiceCollection() .AddSingleton() .AddSingleton() + .AddSingleton() .AddSingleton() .BuildServiceProvider(); } diff --git a/src/NixWslWrapper.Core/Interfaces/IPrerequisiteVerifier.cs b/src/NixWslWrapper.Core/Interfaces/IPrerequisiteVerifier.cs new file mode 100644 index 0000000..882a600 --- /dev/null +++ b/src/NixWslWrapper.Core/Interfaces/IPrerequisiteVerifier.cs @@ -0,0 +1,7 @@ +namespace NixWslWrapper.Core.Interfaces +{ + public interface IPrerequisiteVerifier + { + void EnsurePrerequisites(string distro, string user, string profilePath); + } +} diff --git a/src/NixWslWrapper.Infrastructure/NixWslWrapper.Infrastructure.csproj b/src/NixWslWrapper.Infrastructure/NixWslWrapper.Infrastructure.csproj index dddc94d..b01e568 100644 --- a/src/NixWslWrapper.Infrastructure/NixWslWrapper.Infrastructure.csproj +++ b/src/NixWslWrapper.Infrastructure/NixWslWrapper.Infrastructure.csproj @@ -4,6 +4,10 @@ + + + + net10.0 enable diff --git a/src/NixWslWrapper.Cli/PrerequisiteManager.cs b/src/NixWslWrapper.Infrastructure/Services/WslPrerequisiteVerifier.cs similarity index 95% rename from src/NixWslWrapper.Cli/PrerequisiteManager.cs rename to src/NixWslWrapper.Infrastructure/Services/WslPrerequisiteVerifier.cs index 69ee8e6..9a3d5f9 100644 --- a/src/NixWslWrapper.Cli/PrerequisiteManager.cs +++ b/src/NixWslWrapper.Infrastructure/Services/WslPrerequisiteVerifier.cs @@ -2,20 +2,21 @@ using System; using System.Diagnostics; using System.IO; using System.Linq; +using NixWslWrapper.Core.Interfaces; using Spectre.Console; -namespace NixWslWrapper.Cli +namespace NixWslWrapper.Infrastructure.Services { - public class PrerequisiteManager + public class WslPrerequisiteVerifier : IPrerequisiteVerifier { - public static void EnsurePrerequisites(string distro, string user, string profilePath) + public void EnsurePrerequisites(string distro, string user, string profilePath) { EnsurePathRegistered(); EnsureWslAndDistro(distro); EnsureNix(distro, user, profilePath); } - private static void EnsurePathRegistered() + private void EnsurePathRegistered() { try { @@ -55,7 +56,7 @@ namespace NixWslWrapper.Cli } } - private static void EnsureWslAndDistro(string distro) + private void EnsureWslAndDistro(string distro) { // 1. Check if wsl.exe exists bool wslExists = false; @@ -146,7 +147,7 @@ namespace NixWslWrapper.Cli } } - private static void EnsureNix(string distro, string user, string profilePath) + private void EnsureNix(string distro, string user, string profilePath) { bool nixInstalled = false; try diff --git a/tests/NixWslWrapper.Tests/CliTests.cs b/tests/NixWslWrapper.Tests/CliTests.cs index 2890f08..cd2030e 100644 --- a/tests/NixWslWrapper.Tests/CliTests.cs +++ b/tests/NixWslWrapper.Tests/CliTests.cs @@ -13,12 +13,13 @@ namespace NixWslWrapper.Tests public void CliController_ForwardArguments_ShouldReturnExecutorExitCode() { var mockExecutor = new Mock(); + var mockVerifier = new Mock(); var expectedResult = new ExecutionResult(42); mockExecutor .Setup(m => m.Execute(It.IsAny(), It.IsAny())) .Returns(expectedResult); - var controller = new CliController(mockExecutor.Object); + var controller = new CliController(mockExecutor.Object, mockVerifier.Object); string[] cliArgs = new[] { "run", "nixpkgs#hello" }; int exitCode = controller.Run(cliArgs); @@ -34,7 +35,8 @@ namespace NixWslWrapper.Tests public void CliController_HelpMenuFlag_ShouldReturnZeroImmediately() { var mockExecutor = new Mock(); - var controller = new CliController(mockExecutor.Object); + var mockVerifier = new Mock(); + var controller = new CliController(mockExecutor.Object, mockVerifier.Object); string[] cliArgs = new[] { "--wsl-help" }; int exitCode = controller.Run(cliArgs);