Public/Tests/New-StatusCakeHelperTest.ps1

<#
.SYNOPSIS
    Create a StatusCake test check
.DESCRIPTION
    Creates a new StatusCake Test using the supplied parameters. Only parameters which have been supplied values are set
    and the defaults for a particular test type are used otherwise.
.PARAMETER APICredential
    Credentials to access StatusCake API
.PARAMETER TestName
    Name of the Test to be displayed in StatusCake
.PARAMETER TestURL
    Test location, either an IP (for TCP and Ping) or a fully qualified URL for other TestTypes
.PARAMETER CheckRate
    The interval in seconds between checks. Default is 300 seconds. Valid values are between 0 and 24000 seconds
.PARAMETER TestType
    The type of test to create. Valid options are "HTTP","TCP","PING","DNS"
.PARAMETER BasicUser
    A Basic Auth User account to use to login for a HTTP check
.PARAMETER BasicPass
    If BasicUser is set then this should be the password for the BasicUser for a HTTP check
.PARAMETER Branding
    Set to 0 to use branding (default) or 1 to disable public reporting branding
.PARAMETER Confirmation
    Number of confirmation servers to use must be between 0 and 10
.PARAMETER ContactGroup
    An array of contact group IDs to be assigned to the check
.PARAMETER CustomHeader
    Custom HTTP header for the test, must be supplied as as hashtable
.PARAMETER DNSIP
    DNS Tests only. IP to compare against WebsiteURL value.
.PARAMETER DNSServer
    DNS Tests only. Hostname or IP of DNS server to use.
.PARAMETER DoNotFind
    If the value for the FindString parameter should be found to trigger a alert. 1 = will trigger if FindString found
.PARAMETER EnableSSLWarning
    HTTP Tests only. If enabled, tests will send warnings if the SSL certificate is about to expire.
.PARAMETER FinalEndpoint
    Use to specify the expected Final URL in the testing process
.PARAMETER FindString
    A string that should either be found or not found.
.PARAMETER FollowRedirect
    HTTP Tests only. If enabled, our tests will follow redirects and logo the status of the final page.
.PARAMETER LogoImage
    A URL to a image to use for public reporting
.PARAMETER NodeLocations
    Test locations to use separated by commas. Test location servercodes are required
.PARAMETER Paused
    The state of the test should be after it is created. 0 for unpaused, 1 for paused
.PARAMETER PingURL
    A URL to ping if a site goes down
.PARAMETER Port
    The port to use on a TCP test
.PARAMETER PostRaw
    Use to populate the RAW POST data field on the test
.PARAMETER Public
    Set 1 to enable public reporting, 0 to disable
.PARAMETER RealBrowser
    Use 1 to TURN OFF real browser testing
.PARAMETER StatusCodes
    Comma Separated List of StatusCodes to Trigger Error on (on Update will replace, so send full list each time)
.PARAMETER Tags
    Array of tags to assign to a test
.PARAMETER Timeout
    Time in seconds before a test times out. Valid values are between 5 and 100 seconds
.PARAMETER TriggerRate
    How many minutes to wait before sending an alert. Valid values are between 0 and 60 minutes
.PARAMETER UseJar
    Set to 1 to enable the Cookie Jar. Required for some redirects.
.PARAMETER UserAgent
    Use to populate the test with a custom user agent
.PARAMETER Virus
    Enable virus checking or not. 0 to disable and 1 to enable
.PARAMETER WebsiteHost
    Used internally by StatusCake. Company which hosts the site being tested.
.EXAMPLE
    C:\PS>New-StatusCakeHelperTest -TestName "Example" -TestURL "http://www.example.com" -TestType HTTP -CheckRate 300
    Create a HTTP test called "Example" with URL http://www.example.com checking every 300 seconds
#>

function New-StatusCakeHelperTest
{
    [CmdletBinding(PositionalBinding=$false,SupportsShouldProcess=$true)]
    Param(
        [ValidateNotNullOrEmpty()]
        [System.Management.Automation.PSCredential] $APICredential = (Get-StatusCakeHelperAPIAuth),

        [Parameter(Mandatory=$true)]
        [Alias('WebsiteName')]
        [ValidateNotNullOrEmpty()]
        [string]$TestName,

        [Parameter(Mandatory=$true)]
        [Alias('WebsiteURL')]
        [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]))*$')]
        [string]$TestURL,

        [Parameter(Mandatory=$true)]
        [ValidateRange(0,24000)]
        [int]$CheckRate=300,

        [Parameter(Mandatory=$true)]
        [ValidateSet("HTTP","TCP","PING","DNS")]
        [String]$TestType="HTTP",

        #Optional parameters

        [string]$BasicUser,

        [securestring]$BasicPass,

        [boolean]$Branding,

        [ValidateRange(0,10)]
        [int]$Confirmation,

        [int[]]$ContactGroup,

        [hashtable]$CustomHeader,

        [ValidatePattern('^(?!^.*,$)((([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]))*$')]
        [string]$DNSIP,

        [ValidatePattern('([a-zA-Z0-9\-]{2,}\.[a-zA-Z\-]{2,})(\.[a-zA-Z\-]{2,})?(\.[a-zA-Z\-]{2,})?|^(?!^.*,$)((([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]))*$')]
        [string]$DNSServer,

        [boolean]$DoNotFind,

        [Alias("EnableSSLAlert")]
        [boolean]$EnableSSLWarning,

        [ValidatePattern('^((http|https):\/\/)([a-zA-Z0-9\-]+(\.[a-zA-Z]+)+.*)$|^(?!^.*,$)')]
        [string]$FinalEndpoint,

        [string]$FindString,

        [boolean]$FollowRedirect,

        [ValidatePattern('^((http|https):\/\/)([a-zA-Z0-9\-]+(\.[a-zA-Z]+)+.*)$|^(?!^.*,$)')]
        [String]$LogoImage,

        [ValidateScript({
            if(!($_ | Test-StatusCakeHelperNodeLocation)){
                Throw "Node Location Server code invalid [$_]"
            }
            else{$true}
        })]
        [string[]]$NodeLocations,

        [boolean]$Paused,

        [ValidatePattern('^((http|https):\/\/)([a-zA-Z0-9\-]+(\.[a-zA-Z]+)+.*)$|^(?!^.*,$)')]
        [string]$PingURL,

        [ValidateRange(1,65535)]
        [int]$Port,

        [string]$PostRaw,

        [boolean]$Public,

        [boolean]$RealBrowser,

        [ValidateScript({
            if(!($_ | Test-StatusCakeHelperStatusCode)){
                Throw "HTTP Status Code invalid [$_]"
            }
            else{$true}
        })]
        [int[]]$StatusCodes,

        [Alias('TestTags')]
        [string[]]$Tags,

        [ValidateRange(5,100)]
        [int]$Timeout,

        [ValidateRange(0,60)]
        [int]$TriggerRate,

        [boolean]$UseJar,

        [string]$UserAgent,

        [boolean]$Virus,

        [string]$WebsiteHost
    )

    if( $pscmdlet.ShouldProcess("StatusCake API", "Retrieve StatusCake Tests") )
    {
        $testCheck = Get-StatusCakeHelperTest -APICredential $APICredential -TestName $TestName
        if($testCheck)
        {
            Write-Error "Test with specified name already exists [$TestName] [$($testCheck.TestID)]"
            Return $null
        }
    }

    $convertTestURL = $false
    switch($TestType)
    {
        "DNS"{
            If(!$DNSIP)
            {
                Write-Error "No DNSIP supplied for DNS test type"
                Return $null
            }
            $convertTestURL = $true
        }
        "PING"{$convertTestURL = $true}
        "TCP"{
            If(!$Port)
            {
                Write-Error "No Port supplied for TCP test type"
                Return $null
            }
            $convertTestURL = $true
        }
        Default{}
    }

    #Certain test types require only the domain name so remove protocol if it is part of the TestURL
    if($convertTestURL -and $TestURL)
    {
        $TestURL = $TestURL | ConvertTo-StatusCakeHelperDomainName
    }

    $allParameterValues = $MyInvocation | Get-StatusCakeHelperParameterValue -BoundParameters $PSBoundParameters
    $statusCakeAPIParams = $allParameterValues | Get-StatusCakeHelperAPIParameter -InvocationInfo $MyInvocation
    $statusCakeAPIParams = $statusCakeAPIParams | ConvertTo-StatusCakeHelperAPIParameter

    $requestParams = @{
        uri = "https://app.statuscake.com/API/Tests/Update"
        Headers = @{"Username"=$APICredential.Username;"API"=$APICredential.GetNetworkCredential().password}
        UseBasicParsing = $true
        method = "Put"
        ContentType = "application/x-www-form-urlencoded"
        body = $statusCakeAPIParams
    }

    if( $pscmdlet.ShouldProcess("StatusCake API", "Add StatusCake Test") )
    {
        $response = Invoke-RestMethod @requestParams
        $requestParams=@{}
        $statusCakeAPIParams=@{}
        if($response.Success -ne "True")
        {
            Write-Error "$($response.Message) [$($response.Issues)]"
            Return $null
        }
        $statusCakeTestDetail = Get-StatusCakeHelperTestDetail -APICredential $APICredential -TestID $response.InsertID
        Return $statusCakeTestDetail
    }
}