DoCli/Objects/CLI/CLIFunctions/Management/Tests/AddTest.psm1

using namespace DoFramework.CLI;
using namespace DoFramework.Mappers;
using namespace DoFramework.Domain;
using namespace DoFramework.Environment;
using namespace DoFramework.FileSystem;
using namespace DoFramework.Services;
using namespace DoFramework.Data;
using namespace DoFramework.Validators;
using namespace DoFramework.Testing;
using namespace System.Collections.Generic;

<#
.SYNOPSIS
Class for adding tests within the DoFramework environment.

.DESCRIPTION
The AddTest class and its derived classes are designed to add new tests within
the DoFramework environment. They handle the setup of parameters, environment
checks, and creation of test descriptors.
#>

class AddTest : CLIFunction[DescriptorManagementDictionaryValidator] {
    <#
    .SYNOPSIS
    Initializes a new instance of the AddTest class.

    .DESCRIPTION
    Constructor for the AddTest class, which sets up the base name
    for the command based on the provided function name.
    #>

    AddTest() : base("Add-Test") {}

    [void] AppendValues([Dictionary[string, object]] $params) {}

    <#
    .SYNOPSIS
    Invokes the process of adding a test.

    .DESCRIPTION
    The InvokeInternal method sets up parameters, checks the environment, maps the test
    descriptor, validates it, and creates the test descriptor if valid.
    #>

    [void] InvokeInternal([Dictionary[string, object]] $params, [IServiceContainer] $serviceContainer) {
        $this.AppendValues($params);
        
        [ServiceContainerExtensions]::AddParameters($serviceContainer, $params);
        [ServiceContainerExtensions]::CheckEnvironment($serviceContainer);

        [IMapper[string, TestDescriptor]] $mapper = $serviceContainer.GetService[IMapper[string, TestDescriptor]]();

        [CLIFunctionParameters] $cliParams = $serviceContainer.GetService([CLIFunctionParameters]);
    
        if ($cliParams.ParseSwitch("forProcess")) { 
            $params["testType"] = [TestType]::Process;
            $params["PathPrefix"] = "Processes";
        }

        if ($cliParams.ParseSwitch("forModule")) { 
            $params["testType"] = [TestType]::Module;
            $params["PathPrefix"] = "Modules";
        }

        [TestDescriptor] $descriptor = $mapper.Map("$($params["PathPrefix"])$([DoFramework.Environment.Environment]::Separator)$($params["name"]).ps1");
    
        $descriptor.TestType = $params["testType"];

        [TestDescriptorCreatorValidator] $validator = $serviceContainer.GetService[TestDescriptorCreatorValidator]();
        
        [IValidationResult] $result = $validator.Validate($descriptor);

        if ($result.IsValid) {
            $serviceContainer.GetService[IDescriptorFileCreator[TestDescriptor]]().Create($descriptor);

            $serviceContainer.GetService[IDataCreator[TestDescriptor]]().Create($descriptor);
        }
        else {
            [IValidationErrorWriter] $errorWriter = $serviceContainer.GetService[IValidationErrorWriter]();

            $errorWriter.Write($result);
        }
    }
}