Tests/Private/GetUrls.Tests.ps1

$PSScriptRoot = "$PSScriptRoot/../../";
. "$PSScriptRoot/Private/GetUrls";

Describe "GetUrls" {
    Mock -CommandName Write-Host -Verifiable -MockWith { };
    Mock -CommandName Write-Output -Verifiable -MockWith { };

    It "GetUrl Returns OK" {

        # Assing
        $instanceGuid ="59d1c5f2-73cd-4eec-98d7-3c595f7e0df6";
        $defaultHostName = "someHostName.tld";
        $url = "https://someHostName.tld/somePage/";
        Mock -CommandName GetSingleUrl -Verifiable -MockWith {

            return @{ # [Microsoft.PowerShell.Commands.BasicHtmlWebResponseObject]
                StatusCode = "200";
                StatusDescription = "OK";
            };
        };

        # Act
        GetUrls -defaultHostName $defaultHostName -urls $url -instanceGuid $instanceGuid `
            -requestTimeOut (New-TimeSpan -Seconds 10) `
            -consecutiveErrorThreshold 10 `
            -totalErrorThreshold $null;

        # Assert
        Assert-MockCalled 'Write-Host' -Exactly 1 -ParameterFilter { 
            $Object -eq "OK (200)" -and $foregroundcolor -eq "Green" } -Scope It
        
    }

    It "GetUrl NoInstanceGuid Returns OK" {

        # Assing
        $defaultHostName = "someHostName.tld";
        $url = "https://someHostName.tld/somePage/";
        Mock -CommandName GetSingleUrl -Verifiable -MockWith {

            return @{ # [Microsoft.PowerShell.Commands.BasicHtmlWebResponseObject]
                StatusCode = "200";
                StatusDescription = "OK";
            };
        };

        # Act
        GetUrls -defaultHostName $defaultHostName -urls $url `
            -requestTimeOut (New-TimeSpan -Seconds 10) `
            -consecutiveErrorThreshold 10 `
            -totalErrorThreshold $null;

        # Assert
        Assert-MockCalled 'Write-Host' -Exactly 1 -ParameterFilter { 
            $Object -eq "OK (200)" -and $foregroundcolor -eq "Green" } -Scope It

    }

    It "GetUrl NoInstanceGuid NoParameter Fails" {

        # Assing
        $defaultHostName = "someHostName.tld";
        $url = "https://someHostName.tld/somePage/";

        # Act
        $noUrl = { 
            GetUrls -defaultHostName $defaultHostName -urls $null `
                -requestTimeOut (New-TimeSpan -Seconds 10) `
                -consecutiveErrorThreshold 10 `
                -totalErrorThreshold $null; 
        };
        $noDefaultHostName = { 
            GetUrls -defaultHostName $null -urls $url `
                -requestTimeOut (New-TimeSpan -Seconds 10) `
                -consecutiveErrorThreshold 10 `
                -totalErrorThreshold $null; 
        };
        $none = { 
            GetUrls -defaultHostName $null -urls $null `
                -requestTimeOut (New-TimeSpan -Seconds 10);
                -consecutiveErrorThreshold 10 `
                -totalErrorThreshold $null; 
        };

        # Assert
        $noUrl | Should Throw "Cannot bind argument to parameter 'urls' because it is null.";
        $noDefaultHostName | Should Throw "Cannot bind argument to parameter 'defaultHostName' because it is an empty string.";
        $none | Should Throw `
            "Cannot bind argument to parameter 'defaultHostName' because it is an empty string." `
            "Cannot bind argument to parameter 'urls' because it is null.";

    }

    <# TODO: Figure out a way to test this
    TODO: figure out a way to test multiple 5xx errors with thresholds
    TODO: Also timeout
 
    It "GetNotFoundUrl Returns 404" {
 
        # Assing
        $instanceGuid ="59d1c5f2-73cd-4eec-98d7-3c595f7e0df6";
        $defaultHostName = "someHostName.tld";
        $url = "https://someHostName.tld/somePage/";
        #Mock -CommandName Write-Host -Verifiable -MockWith { } -Scope It;
        Mock -CommandName GetSingleUrl -Verifiable -MockWith {
 
            throw @{ # [System.Net.WebException]
                Response = @{
                    StatusCode = [System.Net.HttpStatusCode]::NotFound;
                    StatusDescription = "Not Found";
                };
            };
        };
 
        # Act
        GetUrls -defaultHostName $defaultHostName -urls $url -instanceGuid $instanceGuid;
 
        # # Assert
        # Assert-MockCalled 'Write-Host' -Exactly 1 -ParameterFilter {
        # $Object -eq "Not Found (404)" -and $foregroundcolor -eq "Magenta" } -Scope It
         
    }
 
    It "GetUrl Returns 500" {
 
        # Assing
        $instanceGuid ="59d1c5f2-73cd-4eec-98d7-3c595f7e0df6";
        $defaultHostName = "someHostName.tld";
        $url = "https://someHostName.tld/somePage/";
        #Mock -CommandName Write-Host -Verifiable -MockWith { } -Scope It;
        Mock -CommandName GetSingleUrl -Verifiable -MockWith {
 
            throw @{ # [System.Net.WebException]
                Response = @{
                    StatusCode = [System.Net.HttpStatusCode]::InternalServerError;
                    StatusDescription = "Internal Server Error";
                };
            };
        };
 
        # Act
        GetUrls -defaultHostName $defaultHostName -urls $url -instanceGuid $instanceGuid;
 
        # # Assert
        # Assert-MockCalled 'Write-Host' -Exactly 1 -ParameterFilter {
        # $Object -eq "Not Found (404)" -and $foregroundcolor -eq "Red" } -Scope It
         
    }
    #>

}