Tests/Stage.tests.ps1

Import-Module Cidney -Force

function ThrowError()
{
    Throw 'Error'
}

#region Pipeline configurations
Pipeline: '1 Stage' {
    Stage: 'Stage One' {
       Write-Output "$Stagename"
    }    
}

Pipeline: '2 Stages' {
    Stage: 'Stage One' {
        Write-Output "$Stagename"
    }    
    Stage: 'Stage Two' {
        Write-Output "$Stagename"
    }    
}

Pipeline: '2 Stages with error' {
    Stage: 'Stage One' {
        Write-Output " $Stagename"
        ThrowError
    }    
    Stage: 'Stage Two' {
        Write-Output "$Stagename"
    }    
} 

Pipeline: 'Statements before Stage' {
    $a = 'abc'
    $b = 123

    Write-Output $a$b

    Stage: 'Stage One' {
        Write-Output "$Stagename"
    }    
}

Pipeline: 'Statements after Stage' {
    Stage: 'Stage One' {
        Write-Output "$Stagename"
    }    

    $a = 'abc'
    $b = 123

    Write-Output $a$b
}

Pipeline: 'Stage Context' {
    Stage: One {
        $context
    }
}

Pipeline: 'Stage CidneyShowProgressPreference' {
    Stage: One {
        $CidneyShowProgressPreference
    }
}

Pipeline: 'Stage CidneyPipelineCount' {
    Stage: One {
        $CidneyPipelineCount
    }
}

Pipeline: 'Stage CidneyPipelineFunctions' {
    Stage: One {
        $CidneyPipelineFunctions
    }
}

Pipeline: 'Stage CidneyPipelineCount 2 Pipelines' {
    Stage: One {
        Invoke-Cidney 'Stage CidneyPipelineCount'
    }
}

Pipeline: '3 Stage CidneyPipelineCount 2 Pipelines' { # After Stage One there are 2 pipelines at this scope
    Stage: One { #Another pipeline but at the stage scope its still 1
        Invoke-Cidney 'Stage CidneyPipelineCount'
    }
    Stage: Two { #Only 1 pipeline in the stage scope
        $CidneyPipelineCount
    }
    Stage: Three { #Still Only 1 pipeline in the stage scope
        $CidneyPipelineCount
    }
}

Pipeline: 'Embedded Pipeline in Stage' {
    Stage: 'A' {
        Pipeline: A { Write-Output "$PipelineName"} -invoke
        Pipeline: B { Write-Output "$PipelineName"} -invoke
        Pipeline: C { Write-Output "$PipelineName"} -invoke
    }
}

Pipeline: 'Invoking Pipeline in Stage' {
    Stage: 'A' {
        Invoke-Cidney '1 Stage'
    }
}

Pipeline: 'Invoking Multiple Pipelines in Stage' {
    Stage: 'A' {
        Invoke-Cidney '1 Stage'
        Invoke-Cidney '2 Stages'
    }
}

Pipeline: 'Embedded Stage in Stage' {
    Stage: 'A' {
        Stage: 'B' { Write-Output 'B'}
    }
}

Pipeline: 'Stage with Variable outside stage' {
    $Stage_A = 'A'
    Stage: One {
        Write-Output "$Stage_A"
    }
}

Pipeline: 'Stage with Variable inside stage' {
    Stage: One {
        $Stage_B = 'B'
        Write-Output "$Stage_B"
    }
}
#endregion

#region Tests
Describe 'Stage Tests' {
    It 'Should output Error and stop on stage One without going on to Stage Two' {
       { $result = Invoke-Cidney '2 Stages with error' } 
       $result | Should Throw
    }
    It 'Should not output Stage Two and stop on stage One without going on to Stage Two' {
       { $result = Invoke-Cidney '2 Stages with error' } 
       $result | Should not be 'Stage Two'
    }
    It 'Should output Stage One' {
        Invoke-Cidney '1 Stage' | Should be 'Stage One'
    }
    It 'Should output Stage One Stage Two' {
        Invoke-Cidney '2 Stages' | Should be 'Stage One', 'Stage Two'
    }
    Context 'Context' {
        $result = Invoke-Cidney 'Stage Context'
        It 'Stage should have a Context that is not null' {
            $result | Should not BeNullOrEmpty
        }
        It 'Stage should have a Context with 8 entries' {
            $result.Count | Should be 8
        }
    }
    Context 'CurrentStage' {
       $result = (Invoke-Cidney 'Stage Context').CurrentStage
        It 'Stage Context should have CurrentStage Entry' {
            $result | Should be 'One'
        }
    }
    Context 'Jobs' {
       $result = (Invoke-Cidney 'Stage Context').Jobs
        It 'Stage Context should have Jobs Entry' {
            $result | Should BeNullorEmpty
        }
    }
    Context 'CredentialStore' {
       $result = (Invoke-Cidney 'Stage Context').CredentialStore
        It 'Stage Context should have an empty CredentialStore Entry' {
            $result | Should BeNullorEmpty
        }
    }
    Context 'ShowProgress' {
        It '$Context.ShowProgress $False' {
            $result = (Invoke-Cidney 'Stage Context').ShowProgress
            $result | should be $false
        }

        $result = Invoke-Cidney 'Stage CidneyShowProgressPreference' -ShowProgress        
        
        It '$CidneyShowProgressPreference should be $True' {
            $result | Should be $true
        }

        $result = Invoke-Cidney 'Stage CidneyShowProgressPreference' 
        
        It '$CidneyShowProgressPreference should be $false' {
            $result | Should be $false
        }
    }
    Context 'RemoteSessions' {
        $result = (Invoke-Cidney 'Stage Context').RemoteSessions
        It 'Stage Context should have a RemoteSessions Entry' {
            $result | Should BeNullorEmpty
        }
    }
    Context 'PipelineName' {
        $result = (Invoke-Cidney 'Stage Context').PipelineName
        It 'Stage Context should have a PipelineName entry' {
            $result | Should not BeNullorEmpty
        }
        It 'Stage Context should PipelineName = Stage Context' {
            $result | Should be 'Stage Context'
        }
    }
    Context 'Modules' {
        $result = (Invoke-Cidney 'Stage Context').Modules
        It 'Stage Context should have a Modules entry' {
            $result | Should Not BeNullOrEmpty
        }
        It 'Stage Context should have Cidney in the Modules list' {
            $cidneyModule = Get-Module Cidney
            $result -contains $cidneyModule | Should be $true
        }
    }
    Context 'CurrentPath' {
        $result = (Invoke-Cidney 'Stage Context').CurrentPath
        It 'Stage Context should have a CurrentPath Entry' {
            $result | Should Not BeNullOrEmpty
        }
    }
    It 'With 1 Pipeline and 1 Stage CidneyPipelineCount should be 1' {
        Invoke-Cidney 'Stage CidneyPipelineCount' | should be 1
    }
    It 'With 2 Pipelines and 1 Stage CidneyPipelineCount should be 2' {
        Invoke-Cidney 'Stage CidneyPipelineCount 2 Pipelines' | should be 2
    }
    It 'With 2 Pipelines and 3 Stages CidneyPipelineCount should be 2, 1, 1' {
        $result = Invoke-Cidney '3 Stage CidneyPipelineCount 2 Pipelines' 
        $result | should be 2, 1, 1
    }
    It 'Should Invoke pipelines when pipelines are embedded in Stage' {
        Invoke-Cidney 'Embedded Pipeline in Stage' | should be 'a','b','c'
    }
    It 'Pipeline should have statements before stage' {
        Invoke-Cidney 'Statements before Stage' | should be 'abc123', 'Stage One'
    }
    It 'Pipeline should have statements after stage' {
        Invoke-Cidney 'Statements after Stage' | should be 'Stage One','abc123' 
    }
    It 'Pipeline with Invoke-Cidney inside a stage should work' {
        Invoke-Cidney 'Invoking Pipeline in Stage' | Should be 'Stage One'
    }
    It 'Pipeline with Multiple Invoke-Cidney calls inside a stage should work' {
        Invoke-Cidney 'Invoking Multiple Pipelines in Stage' | Should be 'Stage One', 'Stage One', 'Stage Two'
    }
    It 'Pipeline should handle stages inside stages' {
        Invoke-Cidney 'Embedded Stage in Stage' | should be 'B' 
    }
    It "Stage should have a variable Stage_A with value of 'A'" {
        $result = Invoke-Cidney 'Stage with Variable outside Stage' 
        $result | Should be 'A'
    }
    It "Stage should have a variable Stage_B with value of 'B'" {
        $result = Invoke-Cidney 'Stage with Variable Inside Stage' 
        $result | Should be 'B'
    }
    It 'Stage CidneyPipelineFunctions should be 19' {
        $result = Invoke-Cidney 'Stage CidneyPipelineFunctions' 
        $result.Count | should be 20
    }
    It 'Stage CidneyPipelineFunctions count should equal Get-CidneyPipeline' {
        $result1 = Invoke-Cidney 'Stage CidneyPipelineFunctions' 
        $result2 = Get-CidneyPipeline
        $result1.Count -eq $result2.Count | should be $true
    }}
#endregion

#region Cleanup
Get-CidneyPipeline | Remove-CidneyPipeline
#endregion