__tests__/Get-ChatPayload.tests.ps1

Import-Module "$PSScriptRoot\..\PowerShellAI.psd1" -Force

Describe "Get-ChatPayload" -Tag ChatPayload {

    BeforeAll {
        $script:savedKey = $env:OpenAIKey
        $env:OpenAIKey = 'sk-1234567890'
    }
    
    AfterAll {
        $env:OpenAIKey = $savedKey
    }
    
    BeforeEach {
        Clear-ChatMessages
    }

    It 'Tests Get-ChatPayload function exists' {
        $actual = Get-Command Get-ChatPayload -ErrorAction SilentlyContinue
        $actual | Should -Not -BeNullOrEmpty
    }

    It 'Tests Get-ChatPayload has initial correct data' {
        $actual = Get-ChatPayload
        $actual | Should -Not -BeNullOrEmpty

        $actual.keys.count | Should -Be 8

        $actual.model | Should -Be 'gpt-4'
        $actual.temperature | Should -Be 0.0
        $actual.max_tokens | Should -Be 256
        $actual.top_p | Should -Be 1.0
        $actual.frequency_penalty | Should -Be 0
        $actual.presence_penalty | Should -Be 0
        $actual.stop | Should -BeNullOrEmpty
        $actual.messages | Should -BeNullOrEmpty
    }

    It 'Tests Get-ChatPayload has correct data after New-ChatUserMessage' {
        New-ChatUserMessage -Content "Hello"
     
        $actual = Get-ChatPayload

        $actual.messages.count | Should -Be 1
        $actual.messages[0].role | Should -Be 'user'
        $actual.messages[0].content | Should -Be 'Hello'
    }

    It 'Tests Get-ChatPayload has correct data after New-ChatMessage' {
        New-ChatMessage -Role 'user' -Content "Hello"
     
        $actual = Get-ChatPayload

        $actual.messages.count | Should -Be 1
        $actual.messages[0].role | Should -Be 'user'
        $actual.messages[0].content | Should -Be 'Hello'
    }

    It 'Tests Get-ChatPayload has correct data after New-ChatMessage and New-ChatUserMessage' {
        New-ChatMessage -Role 'user' -Content "Hello"
        New-ChatUserMessage -Content "Hello message 2"
     
        $actual = Get-ChatPayload

        $actual.messages.count | Should -Be 2
        $actual.messages[0].role | Should -Be 'user'
        $actual.messages[0].content | Should -Be 'Hello'
        $actual.messages[1].role | Should -Be 'user'
        $actual.messages[1].content | Should -Be 'Hello message 2'
    }

    It 'Tests Get-ChatPayload has correct data after New-ChatMessage and New-ChatUserMessage and Clear-ChatMessages' {
        New-ChatMessage -Role 'user' -Content "Hello"
        New-ChatUserMessage -Content "Hello message 2"
        Clear-ChatMessages
     
        $actual = Get-ChatPayload

        $actual.messages.count | Should -Be 0
    }

    It 'Tests Get-ChatPayload has correct data after New-ChatMessage and New-ChatUserMessage and Clear-ChatMessages and New-ChatMessage' {
        New-ChatMessage -Role 'user' -Content "Hello"
        New-ChatUserMessage -Content "Hello message 2"
        Clear-ChatMessages
        New-ChatMessage -Role 'user' -Content "Hello"
     
        $actual = Get-ChatPayload

        $actual.messages.count | Should -Be 1
        $actual.messages[0].role | Should -Be 'user'
        $actual.messages[0].content | Should -Be 'Hello'
    }

    It 'Tests Get-ChatPayload after Get-GPT4Completion' {
        Mock Invoke-RestMethodWithProgress -ModuleName PowerShellAI -ParameterFilter { 
            $Params.Method -eq 'Post' -and $Params.Uri -eq (Get-OpenAIChatCompletionUri) 
        } -MockWith {
            [PSCustomObject]@{
                choices = @(
                    [PSCustomObject]@{
                        message = [PSCustomObject]@{
                            content = 'Mocked Get-GPT4Completion call'
                        }
                    }
                )
            }
        } 
        Get-GPT4Completion -Content "Hello World"

        $actual = Get-ChatPayload

        $actual.messages.count | Should -Be 2

        $actual.messages[0].role | Should -Be 'user'
        $actual.messages[0].content | Should -Be 'Hello World'

        $actual.messages[1].role | Should -Be 'assistant'
        $actual.messages[1].content | Should -Be 'Mocked Get-GPT4Completion call'
    }

    It 'Tests Get-ChatPayload as Json' {
        Mock Invoke-RestMethodWithProgress -ModuleName PowerShellAI -ParameterFilter { 
            $Params.Method -eq 'Post' -and $Params.Uri -eq (Get-OpenAIChatCompletionUri) 
        } -MockWith {
            [PSCustomObject]@{
                choices = @(
                    [PSCustomObject]@{
                        message = [PSCustomObject]@{
                            content = 'Mocked Get-GPT4Completion call'
                        }
                    }
                )
            }
        } 
        
        Get-GPT4Completion -Content "Hello World"

        $actual = Get-ChatPayload -AsJson
        $actual | Should -Not -BeNullOrEmpty

        $obj = ConvertFrom-Json $actual

        $obj.messages.count | Should -Be 2

        $obj.messages[0].role | Should -Be 'user'
        $obj.messages[0].content | Should -Be 'Hello World'

        $obj.messages[1].role | Should -Be 'assistant'
        $obj.messages[1].content | Should -Be 'Mocked Get-GPT4Completion call'
    }    
}