Tests/Private/GetHttpRequestWithCookie.Tests.ps1

BeforeAll {
    . (Resolve-Path "$PSScriptRoot/../../Private/GetHttpRequestWithCookie.ps1");
}

Describe "GetHttpRequestWithCookie" {
    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 Invoke-WebRequest -Verifiable -MockWith {

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

        # Act
        $result = GetHttpRequestWithCookie -defaultHostName $defaultHostName -url $url -instanceGuid $instanceGuid `
            -requestTimeOut (New-TimeSpan -Seconds 10);

        # Assert
        $result.StatusCode | Should -Be "200";

    }

    It "GetUrl NoInstanceGuid Returns OK" {

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

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

        # Act
        $result = GetHttpRequestWithCookie -defaultHostName $defaultHostName -url $url `
            -requestTimeOut (New-TimeSpan -Seconds 10);

        # Assert
        $result.StatusCode | Should -Be "200";

    }

    It "GetUrl NoInstanceGuid NoParameter Fails" {

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

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

        # Assert
        $noUrl | Should -Throw "Cannot bind argument to parameter 'url' because it is an empty string.";
        $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.";

    }

    It "GetUrl RequestTimeOutInvalid Fails" {

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

        # Act
        $getRequest = { 
            GetHttpRequestWithCookie -defaultHostName $defaultHostName -url $url `
                -requestTimeOut (New-TimeSpan -Seconds 0);
        };

        # Assert
        $getRequest | Should -Throw "requestTimeOut requires to be at least 1 second or more.";

    }

    It "GetNotFoundUrl Returns 404" {

        # Assing
        $instanceGuid ="59d1c5f2-73cd-4eec-98d7-3c595f7e0df6";
        $defaultHostName = "someHostName.tld";
        $url = "https://someHostName.tld/somePage/";
        $webException = [HttpException]::new();
        $webException.Message = "Page not found";
        $webException.ResponseMessage = "Not found";
        $webException.ResponseCode = 404;

        Mock -CommandName Invoke-WebRequest -Verifiable -MockWith {
            throw $webException;
        };

        # Act
        $getRequest = { 
            GetHttpRequestWithCookie -defaultHostName $defaultHostName -url $url -instanceGuid $instanceGuid `
                -requestTimeOut (New-TimeSpan -Seconds 10);
        };

        # Assert
        try { $getRequest }
        catch{ $_.Message | Should -Be $webException.Message }
    }

    It "GetUrl Returns 500" {

        # Assing
        $instanceGuid ="59d1c5f2-73cd-4eec-98d7-3c595f7e0df6";
        $defaultHostName = "someHostName.tld";
        $url = "https://someHostName.tld/somePage/";
        $webException = [HttpException]::new();
        $webException.Message = "An unexpected error occured";
        $webException.ResponseMessage = "Server Error";
        $webException.ResponseCode = 500;

        Mock -CommandName Invoke-WebRequest -Verifiable -MockWith {
            throw $webException;
        };

        # Act
        $getRequest = { 
            GetHttpRequestWithCookie -defaultHostName $defaultHostName -url $url -instanceGuid $instanceGuid `
                -requestTimeOut (New-TimeSpan -Seconds 10);
        };

        # Assert
        try { $getRequest }
        catch{ $_.Message | Should -Be $webException.Message }
    }

    It "GetTimedOutUrl throws exception" {

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

        Mock -CommandName Invoke-WebRequest -Verifiable -MockWith {
            throw [System.Exception]::new("The operation has timed out");
        };

        # Act
        $getUrls = { 
            GetHttpRequestWithCookie -defaultHostName $defaultHostName -url $url -instanceGuid $instanceGuid `
                -requestTimeOut (New-TimeSpan -Seconds 1);
        };

        # Assert Throws
        $getUrls | Should -Throw "The operation has timed out";
    }
}