Public/Tests/Copy-StatusCakeHelperTest.ps1


<#
.Synopsis
   Copies the settings of a StatusCake test check
.EXAMPLE
   Copy-StatusCakeHelperTest -TestName "Example" -NewTestName "Example - Copy"
.INPUTS
    Username - Username associated with the API key
    ApiKey - APIKey to access the StatusCake API

    TestName - Name of the Test to be copied
    TestID - ID of the Test to be copied
    TestURL - If supplied the URL will be used instead of the URL on the original
    NewTestName - Name of the test copy
    Paused - If supplied sets the state of the test should be after it is copied.
.FUNCTIONALITY
   Creates a copy of a test. Supply the TestURL or Paused parameter to override the original values in the source test.
#>

function Copy-StatusCakeHelperTest
{
    [CmdletBinding(PositionalBinding=$false,SupportsShouldProcess=$true)]    
    Param(
        [Parameter(ParameterSetName='CopyByName')]
        [Parameter(ParameterSetName='CopyById')]
        [ValidateNotNullOrEmpty()]
        $Username = (Get-StatusCakeHelperAPIAuth).Username,

        [Parameter(ParameterSetName='CopyByName')]
        [Parameter(ParameterSetName='CopyById')]
        [ValidateNotNullOrEmpty()]        
        $ApiKey = (Get-StatusCakeHelperAPIAuth).GetNetworkCredential().password,

        [Parameter(ParameterSetName='CopyById',Mandatory=$true)]
        [ValidatePattern('^\d{1,}$')]           
        $TestID,

        [Parameter(ParameterSetName='CopyByName',Mandatory=$true)]       
        [ValidateNotNullOrEmpty()] 
        $TestName,

        [Parameter(ParameterSetName='CopyByName')]
        [Parameter(ParameterSetName='CopyById')]
        [ValidatePattern('^((http|https):\/\/)?([a-zA-Z0-9\-]+(\.[a-zA-Z]+)+.*)$|^(?!^.*,$)((([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]))*$')]       
        $TestURL,

        [Parameter(ParameterSetName='CopyByName',Mandatory=$true)]
        [Parameter(ParameterSetName='CopyById',Mandatory=$true)]           
        [ValidateNotNullOrEmpty()]
        $NewTestName,

        [Parameter(ParameterSetName='CopyByName')]
        [Parameter(ParameterSetName='CopyById')]
        [ValidateRange(0,1)]         
        $Paused
    )
    $statusCakeFunctionAuth = @{"Username"=$Username;"Apikey"=$ApiKey}    

    if($TestName)
    {   #If copying by name check if resource with that name exists
        if( $pscmdlet.ShouldProcess("StatusCake API", "Retrieve StatusCake Tests"))
        {      
            $testCheck = Get-StatusCakeHelperTest @statusCakeFunctionAuth -TestName $TestName
            if(!$testCheck)
            {
                Write-Error "No Test with Specified Name Exists [$TestName]"
                Return $null 
            }
            elseif($testCheck.GetType().Name -eq 'Object[]')
            {
                Write-Error "Multiple Tests with the same name [$TestName] [$($testCheck.TestID)]"
                Return $null          
            }            
            $TestID = $testCheck.TestID
        }
    }
    elseif($TestID)
    {   #If copying by ID verify that a resource with the Id already exists
        if( $pscmdlet.ShouldProcess("StatusCake API", "Retrieve StatusCake Tests"))
        {      
            $testCheck = Get-StatusCakeHelperTest @statusCakeFunctionAuth -TestID $TestID
            if(!$testCheck)
            {
                Write-Error "No Test with Specified ID Exists [$TestID]"
                Return $null 
            }            
            $TestID = $testCheck.TestID
        }
    }

    if( $pscmdlet.ShouldProcess("StatusCake API", "Retrieve Detailed StatusCake Test Data"))
    { 
        $sourceItemDetails = Get-StatusCakeHelperDetailedTestData @statusCakeFunctionAuth -TestID $TestID
    }

    $ParameterList = (Get-Command -Name New-StatusCakeHelperTest).Parameters

    if(!$TestURL)
    {
        $TestURL = $sourceItemDetails.URI
    }

    $psParams = @{
        "TestName" = $NewTestName
        "TestURL" = $TestURL
    }

    $paramsToUse = $sourceItemDetails | Get-Member | Select-Object Name
    $paramsToUse = Compare-Object $paramsToUse.Name @($ParameterList.keys) -IncludeEqual -ExcludeDifferent
    $paramsToUse = $paramsToUse | Select-Object -ExpandProperty InputObject     

    foreach ($key in $paramsToUse)
    {
        $value = $sourceItemDetails.$key
        if($key -eq "Paused" -and $Paused -eq 0 -or $Paused)
        {
            $psParams.Add($key,$Paused)
        }
        elseif($value -or $value -eq 0)
        {        
            $psParams.Add($key,$value)                  
        }
    }     

    if( $pscmdlet.ShouldProcess("StatusCake API", "Create StatusCake Test"))
    { 
        $result = New-StatusCakeHelperTest @statusCakeFunctionAuth @psParams
    }
    Return $result
}