__tests__/ConvertFrom-FunctionDefinition.tests.ps1

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

Describe 'Convert To Function Spec' -Tags ConvertToFunctionSpec {

    BeforeAll {
        function New-User {}
        function Get-User {}
        function Update-User {}
        function Remove-User {}
    }

    It 'Test if it ConvertFrom-FunctionDefinition exists' {
        $actual = Get-Command ConvertFrom-FunctionDefinition -ErrorAction SilentlyContinue

        $actual | Should -Not -BeNullOrEmpty
    }

    It 'Test ConvertFrom-Definition has correct parameters' {
        $actual = Get-Command ConvertFrom-FunctionDefinition -ErrorAction SilentlyContinue

        $actual.Parameters.Keys | Should -Be @('FunctionInfo')

        $actual.Parameters['FunctionInfo'].ParameterType.Name | Should -Be 'CommandInfo[]'
    }

    It 'Test ConvertFrom-FunctionDefinition returns a function spec' {

        $functionInfo = @('New-User') | ForEach-Object { Get-Command $_ }
        
        $actual = ConvertFrom-FunctionDefinition $functionInfo
        $actual | Should -Not -BeNullOrEmpty
        $actual.GetType().Name | Should -Be 'OrderedDictionary'

        $actual.Keys.Count | Should -Be 3
     
        $actual["name"] | Should -BeExactly 'New-User'
        $actual["description"] | Should -BeExactly 'not supplied'
        
        $actual["parameters"].Keys.Count | Should -Be 3

        $actual["parameters"]["type"] | Should -BeExactly 'object'
        $actual["parameters"]["properties"].Keys.Count | Should -Be 0

        $actual["parameters"]["required"].GetType().Name | Should -Be 'Object[]'
        $actual["parameters"]["required"].Count | Should -Be 0
    }

    It 'Test handles mutiple functions' {
        $functionInfo = 'New-User', 'Get-User', 'Update-User', 'Remove-User' | ForEach-Object { Get-Command $_ }

        $actual = ConvertFrom-FunctionDefinition $functionInfo
        $actual | Should -Not -BeNullOrEmpty
        $actual.GetType().Name | Should -Be 'Object[]'

        $actual.Keys.Count | Should -Be 12

        $actual[0]["name"] | Should -BeExactly 'New-User'
        $actual[0].Keys.Count | Should -Be 3

        $actual[1]["name"] | Should -BeExactly 'Get-User'
        $actual[0].Keys.Count | Should -Be 3
        
        $actual[2]["name"] | Should -BeExactly 'Update-User'
        $actual[0].Keys.Count | Should -Be 3
        
        $actual[3]["name"] | Should -BeExactly 'Remove-User'
        $actual[0].Keys.Count | Should -Be 3
    }    
}