Public/New-UserProvidedService.Tests.ps1

Set-StrictMode -Version Latest

BeforeAll {
    . "$PSScriptRoot\New-UserProvidedService.ps1"
    . "$PSScriptRoot\..\Private\Get-BaseHost.ps1"
    . "$PSScriptRoot\..\Private\Get-Header.ps1"
    . "$PSScriptRoot\..\Private\Invoke-Retry.ps1"
}

Describe "New-UserProvidedService" {
    BeforeAll {
        [Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSUseDeclaredVarsMoreThanAssignment', '', Justification='pester supported')]
        $TargetSpace = [PSCustomObject]@{metadata=@{guid="1"}}
        [Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSUseDeclaredVarsMoreThanAssignment', '', Justification='pester supported')]
        $TargetName="ups"
        [Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSUseDeclaredVarsMoreThanAssignment', '', Justification='pester supported')]
        $TheContent = "{'foo':'bar'}"
        [Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSUseDeclaredVarsMoreThanAssignment', '', Justification='pester supported')]
        $TargetRouteServiceUrl ="rs"
        [Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSUseDeclaredVarsMoreThanAssignment', '', Justification='pester supported')]
        $TargetSyslogDrainUrl = "sdu"
        $TargetHeader = @{}
        [Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSUseDeclaredVarsMoreThanAssignment', '', Justification='pester supported')]
        $TargetParams = @()
        Mock Invoke-Retry { & $ScriptBlock }
        Mock Get-BaseHost { "basehost" }
        Mock Get-Header { $TargetHeader }
    }
    Context "API Call" {
        It "calls proper web request" {
            Mock Invoke-WebRequest {@{StatusCode=201;Content=$TheContent}}
            New-UserProvidedService -Space $TargetSpace -Name $TargetName -Params $TargetParams -SyslogDrainUrl $TargetSyslogDrainUrl -RouteServiceUrl $TargetRouteServiceUrl #| Should MatchHashtable ($TheContent | ConvertFrom-Json)
            Should -Invoke Invoke-WebRequest
            # -ParameterFilter {
            # $MatchBody = @{
            # "credentials"=$TargetParams
            # "name"=$TargetName
            # "route_service_url"= $TargetRouteServiceUrl
            # "space_guid"=$TargetSpace.metadata.guid
            # "syslog_drain_url"=$TargetSyslogDrainUrl
            # }
            # $hashtable = @{}
            # (ConvertFrom-Json $Body).psobject.properties | ForEach-Object { $hashtable[$_.Name] = $_.Value } | Out-Null
            # $Uri -eq "basehost/v2/user_provided_service_instances" -and $Method -eq "Post" `
            # -and (Compare-HashTable $hashtable $MatchBody) -eq $null `
            # -and (Compare-HashTable $Header $TargetHeader) -eq $null
            # }
        }
    }
    Context "API return values" {
        It "returns non 201 status" {
            Mock Invoke-WebRequest {@{StatusCode=400;Content=$TheContent}}
            { New-UserProvidedService -Space $TargetSpace -Name $TargetName -Params $TargetParams -SyslogDrainUrl $TargetSyslogDrainUrl -RouteServiceUrl $TargetRouteServiceUrl }  | Should -Throw "*basehost/v2/user_provided_service_instances 400*"
        }
    }
    Context "parameters" {
        It "ensures 'Space' cannot be null" {
            {  New-UserProvidedService -Space $null -Name "x" -Params @() -SyslogDrainUrl "x" -RouteServiceUrl "x" } | Should -Throw "*Cannot validate argument on parameter 'Space'. The argument is null or empty*"
        }
        It "ensures 'Name' cannot be null" {
            {  New-UserProvidedService -Space $TargetSpace -Name $null -Params @() -SyslogDrainUrl "x" -RouteServiceUrl "x" } | Should -Throw "*Cannot validate argument on parameter 'Name'. The argument is null or empty*"
        }
        It "ensures 'Name' cannot be empty" {
            {  New-UserProvidedService -Space $TargetSpace -Name "" -Params @() -SyslogDrainUrl "x" -RouteServiceUrl "x" } | Should -Throw "*Cannot validate argument on parameter 'Name'. The argument is null or empty*"
        }
        It "supports positional" {
            Mock Invoke-WebRequest {@{StatusCode=201;Content=$TheContent}}
            New-UserProvidedService -Space $TargetSpace -Name $TargetName -Params $TargetParams -SyslogDrainUrl $TargetSyslogDrainUrl -RouteServiceUrl $TargetRouteServiceUrl
            Should -Invoke Invoke-WebRequest
        }
        It "supports 'Space' from pipeline'" {
            Mock Invoke-WebRequest {@{StatusCode=201;Content=$TheContent}}
            $TargetSpace | New-UserProvidedService -Name $TargetName -Params $TargetParams -SyslogDrainUrl $TargetSyslogDrainUrl -RouteServiceUrl $TargetRouteServiceUrl
            Should -Invoke Invoke-WebRequest
        }
   }
}