tests/Unit/Public/Set-sqmMaxConfig.Tests.ps1

#Requires -Modules Pester
<#
.SYNOPSIS
    Unit Tests fuer Set-sqmMaxMemory und Set-sqmMaxDop (dbatools gemockt).
#>


BeforeAll {
    . "$PSScriptRoot\..\..\..\tests\TestHelpers.ps1"
    Import-sqmTestModule
}

AfterAll {
    if (Get-Module sqmSQLTool) { Remove-Module sqmSQLTool -Force }
    $env:MSSQLTOOLS_SKIP_AUTO_UPDATE = $null
}

Describe 'Set-sqmMaxMemory' {
    It 'Funktion existiert und unterstuetzt ShouldProcess' {
        $cmd = Get-Command Set-sqmMaxMemory
        $cmd | Should -Not -BeNullOrEmpty
        $cmd.Parameters.ContainsKey('WhatIf')  | Should -Be $true
        $cmd.Parameters.ContainsKey('Confirm') | Should -Be $true
    }

    Context 'Ausfuehrung (gemockt)' {
        BeforeAll {
            Mock -ModuleName sqmSQLTool Invoke-sqmLogging { }
            Mock -ModuleName sqmSQLTool Get-DbaMaxMemory { [PSCustomObject]@{ MaxValue = 4096; Total = 32768 } }
            Mock -ModuleName sqmSQLTool Set-DbaMaxMemory { [PSCustomObject]@{ MaxValue = 29491 } }
        }

        It 'Setzt unter -WhatIf nichts (Status WhatIf, kein Set-DbaMaxMemory)' {
            $r = Set-sqmMaxMemory -SqlInstance 'SQL01' -WhatIf
            $r.Status | Should -Be 'WhatIf'
            Should -Invoke -ModuleName sqmSQLTool Set-DbaMaxMemory -Times 0
        }

        It 'Setzt expliziten Wert und meldet Success' {
            $r = Set-sqmMaxMemory -SqlInstance 'SQL01' -MaxMemoryMB 29491 -Confirm:$false
            $r.Status      | Should -Be 'Success'
            $r.NewMaxMemMB | Should -Be 29491
            Should -Invoke -ModuleName sqmSQLTool Set-DbaMaxMemory -Times 1
        }
    }
}

Describe 'Set-sqmMaxDop' {
    It 'Funktion existiert und unterstuetzt ShouldProcess' {
        $cmd = Get-Command Set-sqmMaxDop
        $cmd | Should -Not -BeNullOrEmpty
        $cmd.Parameters.ContainsKey('WhatIf')           | Should -Be $true
        $cmd.Parameters.ContainsKey('SkipCostThreshold') | Should -Be $true
    }

    Context 'Ausfuehrung (gemockt)' {
        BeforeAll {
            Mock -ModuleName sqmSQLTool Invoke-sqmLogging { }
            Mock -ModuleName sqmSQLTool Get-WmiObject { [PSCustomObject]@{ NumberOfLogicalProcessors = 4 } }
            Mock -ModuleName sqmSQLTool Get-DbaSpConfigure { [PSCustomObject]@{ RunningValue = 0 } }
            Mock -ModuleName sqmSQLTool Set-DbaSpConfigure { }
        }

        It 'Setzt unter -WhatIf nichts' {
            $r = Set-sqmMaxDop -SqlInstance 'SQL01' -WhatIf
            $r.Status    | Should -Be 'WhatIf'
            $r.NewMaxDop | Should -Be 4
            Should -Invoke -ModuleName sqmSQLTool Set-DbaSpConfigure -Times 0
        }

        It 'Setzt MAXDOP + Cost Threshold (2 sp_configure-Aufrufe)' {
            $r = Set-sqmMaxDop -SqlInstance 'SQL01' -Confirm:$false
            $r.Status | Should -Be 'Success'
            Should -Invoke -ModuleName sqmSQLTool Set-DbaSpConfigure -Times 2
        }

        It 'Mit -SkipCostThreshold nur MAXDOP (1 Aufruf)' {
            $r = Set-sqmMaxDop -SqlInstance 'SQL01' -MaxDop 2 -SkipCostThreshold -Confirm:$false
            $r.NewMaxDop | Should -Be 2
            Should -Invoke -ModuleName sqmSQLTool Set-DbaSpConfigure -Times 1
        }
    }
}