DoCli/Tests/Component/Invocation/RunProcessTests.ps1

using namespace DoFramework.Domain;
using namespace DoFramework.Processing;
using module "..\Common\TestContext.psm1";
using module "..\Do\Modules\TestClassModule.psm1";
using module "..\Do\Modules\TestClassModule2.psm1";

Describe 'RunProcessTests' {
    BeforeEach {
        [TestContext] $script:context = [TestContext]::new();

        $script:context.SetCurrentPathToTestProject();
    }

    AfterEach {
        $script:context.ResetCurrentPath();
    }

    it 'Runs a Process' {
        # Arrange
        [string] $processName = "TestProcess1";

        # Act
        [IContext] $context = doing run-process -name $processName -doOutput -silent;

        # Assert
        $context.Session.CurrentProcessName | Should -Be ([string]::Empty);

        $context.Session.ProcessCount | Should -Be 1;

        $context.Session.ProcessReports.Count | Should -Be 1;

        $context.Session.ProcessReports[0].ProcessResult | Should -Be ([ProcessResult]::Completed);

        $context.Session.ProcessReports[0].Name | Should -Be $processName;

        $context.Session.ProcessReports[0].Descriptor.Name | Should -Be $processName;
    }

    it 'Runs a Process with no output' {
        # Arrange
        [string] $processName = "TestProcess1";

        # Act
        [IContext] $context = doing run-process -name $processName -silent;

        # Assert
        $context | Should -Be $null;
    }

    it 'Runs a Process with no output, output var is invalid' {
        # Arrange
        [string] $processName = "TestProcess1";

        # Act
        [IContext] $context = doing run-process -name $processName -doOutput "invalid" -silent;

        # Assert
        $context | Should -Be $null;
    }
    
    it 'Runs a Process That Runs Other Processes' {
        # Arrange
        [string] $processName = "TestOrchestrator";

        # Act
        [IContext] $context = doing run-process -name $processName -doOutput -silent;

        # Assert
        $context.Get("ContextEntry") | Should -Be "some_value";

        $context.Session.CurrentProcessName | Should -Be ([string]::Empty);

        $context.Session.ProcessCount | Should -Be 4;

        $context.Session.ProcessReports.Count | Should -Be 4;

        $context.Session.ProcessReports[0].ProcessResult | Should -Be ([ProcessResult]::Completed);

        $context.Session.ProcessReports[0].Name | Should -Be "--TestProcess1";

        $context.Session.ProcessReports[0].Descriptor.Name | Should -Be "TestProcess1";

        $context.Session.ProcessReports[1].ProcessResult | Should -Be ([ProcessResult]::Completed);

        $context.Session.ProcessReports[1].Name | Should -Be "--TestProcess2";

        $context.Session.ProcessReports[1].Descriptor.Name | Should -Be "TestProcess2";

        $context.Session.ProcessReports[2].ProcessResult | Should -Be ([ProcessResult]::Completed);

        $context.Session.ProcessReports[2].Name | Should -Be "--TestProcess3";

        $context.Session.ProcessReports[2].Descriptor.Name | Should -Be "TestProcess3";

        $context.Session.ProcessReports[3].ProcessResult | Should -Be ([ProcessResult]::Completed);

        $context.Session.ProcessReports[3].Name | Should -Be $processName;

        $context.Session.ProcessReports[3].Descriptor.Name | Should -Be $processName;
    }    

    it 'Runs a Process That Runs Other Processes and Fails' {
        # Arrange
        [string] $processName = "TestOrchestrator";

        # Act
        [IContext] $context = doing run-process -name $processName -Mode "Fail" -doOutput -silent;

        # Assert
        $context.Get("ContextEntry") | Should -BeNullOrEmpty;

        $context.Session.CurrentProcessName | Should -Be ([string]::Empty);

        $context.Session.ProcessCount | Should -Be 4;

        $context.Session.ProcessReports.Count | Should -Be 4;

        $context.Session.ProcessReports[0].ProcessResult | Should -Be ([ProcessResult]::Completed);

        $context.Session.ProcessReports[0].Name | Should -Be "--TestProcess1";

        $context.Session.ProcessReports[0].Descriptor.Name | Should -Be "TestProcess1";

        $context.Session.ProcessReports[1].ProcessResult | Should -Be ([ProcessResult]::Failed);

        $context.Session.ProcessReports[1].Name | Should -Be "--TestProcess2";

        $context.Session.ProcessReports[1].Descriptor.Name | Should -Be "TestProcess2";

        $context.Session.ProcessReports[2].ProcessResult | Should -Be ([ProcessResult]::NotRun);

        $context.Session.ProcessReports[2].Name | Should -Be "--TestProcess3";

        $context.Session.ProcessReports[2].Descriptor.Name | Should -Be "TestProcess3";

        $context.Session.ProcessReports[3].ProcessResult | Should -Be ([ProcessResult]::Failed);

        $context.Session.ProcessReports[3].Name | Should -Be $processName;

        $context.Session.ProcessReports[3].Descriptor.Name | Should -Be $processName;
    }    

    it 'Runs a Process That Runs Other Processes and Fails due to being Invalid' {
        # Arrange
        [string] $processName = "TestOrchestrator";

        # Act
        [IContext] $context = doing run-process -name $processName -Mode "Invalid" -doOutput -silent;

        # Assert
        $context.Get("ContextEntry") | Should  -BeNullOrEmpty;

        $context.Session.CurrentProcessName | Should -Be ([string]::Empty);

        $context.Session.ProcessCount | Should -Be 4;

        $context.Session.ProcessReports.Count | Should -Be 4;

        $context.Session.ProcessReports[0].ProcessResult | Should -Be ([ProcessResult]::Completed);

        $context.Session.ProcessReports[0].Name | Should -Be "--TestProcess1";

        $context.Session.ProcessReports[0].Descriptor.Name | Should -Be "TestProcess1";

        $context.Session.ProcessReports[1].ProcessResult | Should -Be ([ProcessResult]::Invalidated);

        $context.Session.ProcessReports[1].Name | Should -Be "--TestProcess2";

        $context.Session.ProcessReports[1].Descriptor.Name | Should -Be "TestProcess2";

        $context.Session.ProcessReports[2].ProcessResult | Should -Be ([ProcessResult]::NotRun);

        $context.Session.ProcessReports[2].Name | Should -Be "--TestProcess3";

        $context.Session.ProcessReports[2].Descriptor.Name | Should -Be "TestProcess3";

        $context.Session.ProcessReports[3].ProcessResult | Should -Be ([ProcessResult]::Failed);

        $context.Session.ProcessReports[3].Name | Should -Be $processName;

        $context.Session.ProcessReports[3].Descriptor.Name | Should -Be $processName;
    }

    it 'Processes Can execute, register their own services which are injected' {
        # Arrange
        [string] $processName = "ServiceContainerProcess1";

        # Act
        [IContext] $context = doing run-process -name $processName -doOutput -silent;

        # Assert
        $interface = $context.Get("Interface");

        $instance = $context.Get("Instance");

        $interface | Should -Not -BeNullOrEmpty;

        $instance | Should -Not -BeNullOrEmpty;

        $interface.GetType().FullName | Should -Be ([Example].FullName);

        $instance.GetType().FullName | Should -Be ([BasicClass].FullName);

        $context.Session.CurrentProcessName | Should -Be ([string]::Empty);

        $context.Session.ProcessCount | Should -Be 2;

        $context.Session.ProcessReports.Count | Should -Be 2;

        $context.Session.ProcessReports[0].ProcessResult | Should -Be ([ProcessResult]::Completed);

        $context.Session.ProcessReports[0].Name | Should -Be "--ServiceContainerProcess2";

        $context.Session.ProcessReports[0].Descriptor.Name | Should -Be "ServiceContainerProcess2";

        $context.Session.ProcessReports[1].ProcessResult | Should -Be ([ProcessResult]::Completed);

        $context.Session.ProcessReports[1].Name | Should -Be $processName;

        $context.Session.ProcessReports[1].Descriptor.Name | Should -Be $processName;

    }
}