Tests/VSAModule.JsonBody.Tests.ps1

BeforeAll {
    $script:ModuleRoot = Split-Path -Path (Split-Path -Parent $PSCommandPath)
    Import-Module (Join-Path $script:ModuleRoot 'VSAModule.psd1') -Force
    # Contains a double quote, a backslash, and a newline - exactly what naive string
    # interpolation into a JSON literal corrupts.
    $script:TrickyValue = "line1`nline2 with `"quotes`" and a \backslash"
}

Describe "Hand-rolled JSON replaced with ConvertTo-Json (T-6.8 / F-40, F-43)" {

    It "New-VSANotification produces valid, round-tripping JSON" {
        InModuleScope VSAModule -Parameters @{ TrickyValue = $script:TrickyValue } {
            param($TrickyValue)
            $script:body = $null
            Mock Invoke-VSARestMethod { $script:body = $Body }
            New-VSANotification -Title $TrickyValue -Text $TrickyValue | Out-Null
            $obj = $script:body | ConvertFrom-Json
            $obj.Title | Should -Be $TrickyValue
            $obj.Body | Should -Be $TrickyValue
        }
    }

    It "New-VSAAgentInstallLink produces valid, round-tripping JSON" {
        InModuleScope VSAModule -Parameters @{ TrickyValue = $script:TrickyValue } {
            param($TrickyValue)
            $script:body = $null
            Mock Invoke-VSARestMethod { $script:body = $Body }
            New-VSAAgentInstallLink -PartitionId 1 -MachineGroupName $TrickyValue | Out-Null
            $obj = $script:body | ConvertFrom-Json
            $obj.MachineGroupName | Should -Be $TrickyValue
        }
    }

    It "Rename-VSAMachineGroup produces valid, round-tripping JSON" {
        InModuleScope VSAModule -Parameters @{ TrickyValue = $script:TrickyValue } {
            param($TrickyValue)
            $script:body = $null
            Mock Invoke-VSARestMethod { $script:body = $Body }
            Rename-VSAMachineGroup -MachineGroupId 100 -MachineGroupName $TrickyValue -Confirm:$false | Out-Null
            $obj = $script:body | ConvertFrom-Json
            $obj.MachineGroupName | Should -Be $TrickyValue
        }
    }

    It "Update-VSAAgentProfile produces valid, round-tripping JSON" {
        InModuleScope VSAModule -Parameters @{ TrickyValue = $script:TrickyValue } {
            param($TrickyValue)
            $script:body = $null
            Mock Invoke-VSARestMethod { $script:body = $Body }
            Update-VSAAgentProfile -AgentId 100 -AdminEmail $TrickyValue -UserName $TrickyValue -UserEmail $TrickyValue -UserPhone $TrickyValue -Notes $TrickyValue -ShowToolTip 1 | Out-Null
            $obj = $script:body | ConvertFrom-Json
            $obj.Notes | Should -Be $TrickyValue
        }
    }

    It "Update-VSAWarrantyExpiration produces valid, round-tripping JSON" {
        InModuleScope VSAModule -Parameters @{ TrickyValue = $script:TrickyValue } {
            param($TrickyValue)
            $script:body = $null
            Mock Invoke-VSARestMethod { $script:body = $Body }
            Update-VSAWarrantyExpiration -AgentID 100 -PurchaseDate $TrickyValue -WarrantyExpireDate $TrickyValue | Out-Null
            $obj = $script:body | ConvertFrom-Json
            $obj.PurchaseDate | Should -Be $TrickyValue
        }
    }

    It "New-VSAAgentNote produces valid, round-tripping JSON with exactly one transport call (T-6.10)" {
        InModuleScope VSAModule -Parameters @{ TrickyValue = $script:TrickyValue } {
            param($TrickyValue)
            $script:body = $null
            $script:calls = 0
            Mock Invoke-VSARestMethod { $script:calls++; $script:body = $Body }
            New-VSAAgentNote -AgentId 100 -Note $TrickyValue | Out-Null
            $script:calls | Should -Be 1
            ($script:body | ConvertFrom-Json) | Should -Be $TrickyValue
        }
    }

    It "Update-VSAAgentNote produces valid, round-tripping JSON with exactly one transport call (T-6.10)" {
        InModuleScope VSAModule -Parameters @{ TrickyValue = $script:TrickyValue } {
            param($TrickyValue)
            $script:body = $null
            $script:calls = 0
            Mock Invoke-VSARestMethod { $script:calls++; $script:body = $Body }
            Update-VSAAgentNote -NoteId 5 -Note $TrickyValue | Out-Null
            $script:calls | Should -Be 1
            $obj = $script:body | ConvertFrom-Json
            $obj.'5' | Should -Be $TrickyValue
        }
    }

    It "Update-VSAAgentTempDir produces valid JSON for a path with regex-special characters" {
        InModuleScope VSAModule {
            $script:body = $null
            Mock Invoke-VSARestMethod { $script:body = $Body }
            $trickyPath = 'C:\Program Files (x86)\Temp+Dir[1]'
            Update-VSAAgentTempDir -AgentId 100 -TempDir $trickyPath | Out-Null
            $arr = $script:body | ConvertFrom-Json
            $arr[0].value | Should -Be $trickyPath
        }
    }

    It "Get-VSACustomExtensionFSItem makes exactly one transport call (T-6.10)" {
        InModuleScope VSAModule {
            $script:calls = 0
            Mock Invoke-VSARestMethod { $script:calls++ }
            Get-VSACustomExtensionFSItem -AgentId 100 | Out-Null
            $script:calls | Should -Be 1
        }
    }

    It "Remove-VSACustomExtensionFolder makes exactly one transport call (T-6.10)" {
        InModuleScope VSAModule {
            $script:calls = 0
            Mock Invoke-VSARestMethod { $script:calls++ }
            Remove-VSACustomExtensionFolder -AgentId 100 -Folder 'SomeFolder' | Out-Null
            $script:calls | Should -Be 1
        }
    }

    It "New-VSACustomField produces valid JSON with exactly one transport call (T-6.10)" {
        InModuleScope VSAModule -Parameters @{ TrickyValue = $script:TrickyValue } {
            param($TrickyValue)
            $script:body = $null
            $script:calls = 0
            Mock Invoke-VSARestMethod { $script:calls++; $script:body = $Body }
            New-VSACustomField -FieldName $TrickyValue -Confirm:$false | Out-Null
            $script:calls | Should -Be 1
            $arr = $script:body | ConvertFrom-Json
            ($arr | Where-Object key -eq 'FieldName').value | Should -Be $TrickyValue
        }
    }
}