tests/Public/Invoke-PSDVWebRequest.Tests.ps1

BeforeAll {
    . (Join-Path $PSScriptRoot 'PublicTestCommon.ps1')
}

Describe 'Invoke-PSDVWebRequest' {
    BeforeEach {
        Initialize-PSDVPublicTestConnection
    }

    AfterEach {
        Clear-PSDVPublicTestConnection
    }

    It 'builds a Dataverse API request, sends JSON body content, and parses a single response object' {
        Mock -CommandName Invoke-WebRequest -ModuleName Dataverse -MockWith {
            return New-PSDVPublicTestWebResponse -Payload @{ accountid = [Guid]::NewGuid(); name = 'Contoso' }
        }

        $result = Invoke-PSDVWebRequest -WebUri 'accounts' -Select 'name' -Filter "name eq 'Contoso'" -Body @{ name = 'Contoso' }

        $result.name | Should -BeExactly 'Contoso'
        Should -Invoke -CommandName Invoke-WebRequest -ModuleName Dataverse -Times 1 -Exactly
        Should -Invoke -CommandName Invoke-WebRequest -ModuleName Dataverse -Times 1 -Exactly -ParameterFilter { $Method -eq 'Post' -and $Uri -match '/accounts' -and $Headers['Content-Type'] -eq 'application/json' -and $Body -match 'Contoso' }
    }

    It 'follows OData pagination links and returns the combined collection' {
        $nextLink = 'https://example.crm.dynamics.com/api/data/v9.2/accounts?$skiptoken=next'

        Mock -CommandName Invoke-WebRequest -ModuleName Dataverse -MockWith {
            if ($Uri -eq $nextLink) {
                return New-PSDVPublicTestWebResponse -Payload @{ value = @(@{ name = 'Second' }) }
            }

            return New-PSDVPublicTestWebResponse -Payload @{ value = @(@{ name = 'First' }); '@odata.nextLink' = $nextLink }
        }

        $result = Invoke-PSDVWebRequest -WebUri 'accounts'

        @($result).Count | Should -Be 2
        @($result).name | Should -Be @('First', 'Second')
        Should -Invoke -CommandName Invoke-WebRequest -ModuleName Dataverse -Times 2 -Exactly
    }

    It 'returns the raw web response when requested' {
        Mock -CommandName Invoke-WebRequest -ModuleName Dataverse -MockWith {
            return [PSCustomObject]@{ Content = '{"ok":true}'; StatusCode = 204 }
        }

        $result = Invoke-PSDVWebRequest -WebUri 'accounts' -ReturnRawResponse

        $result.StatusCode | Should -Be 204
    }
}