tests/Unit/Public/Get-sqmAlwaysOnQueueStatus.Tests.ps1

#Requires -Modules Pester
<#
.SYNOPSIS
    Unit Tests fuer Get-sqmAlwaysOnQueueStatus
    dbatools-Abhaengigkeiten werden vollstaendig gemockt.
#>


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

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

Describe 'Get-sqmAlwaysOnQueueStatus' {

    Context 'Parameter-Validierung' {
        It 'Funktion existiert und ist aufrufbar' {
            Get-Command Get-sqmAlwaysOnQueueStatus | Should -Not -BeNullOrEmpty
        }

        It 'SqlInstance ist nicht mandatory (Default = Computername)' {
            $cmd = Get-Command Get-sqmAlwaysOnQueueStatus
            $mandatory = $cmd.Parameters['SqlInstance'].Attributes |
                Where-Object { $_ -is [System.Management.Automation.ParameterAttribute] } |
                Select-Object -ExpandProperty Mandatory -First 1
            $mandatory | Should -Be $false
        }

        It 'MaxRedoQueueMB Parameter existiert' {
            (Get-Command Get-sqmAlwaysOnQueueStatus).Parameters.ContainsKey('MaxRedoQueueMB') | Should -Be $true
        }

        It 'MaxSendQueueMB Parameter existiert' {
            (Get-Command Get-sqmAlwaysOnQueueStatus).Parameters.ContainsKey('MaxSendQueueMB') | Should -Be $true
        }

        It 'Hat keinen OutputPath Parameter (schreibt keine Dateien)' {
            (Get-Command Get-sqmAlwaysOnQueueStatus).Parameters.ContainsKey('OutputPath') | Should -Be $false
        }
    }

    Context 'Instanz ohne Availability Groups' {
        BeforeAll {
            Mock -ModuleName sqmSQLTool Get-DbaAvailabilityGroup { $null }
            Mock -ModuleName sqmSQLTool Invoke-DbaQuery { @() }
            Mock -ModuleName sqmSQLTool Invoke-sqmLogging { }
        }

        It 'Liefert ein leeres Ergebnis statt eines Fehlers' {
            $result = @(Get-sqmAlwaysOnQueueStatus -SqlInstance 'TESTSERVER')
            $result.Count | Should -Be 0
        }
    }

    Context 'Ausfuehrung mit gemockten dbatools' {
        BeforeAll {
            Mock -ModuleName sqmSQLTool Get-DbaAvailabilityGroup {
                @([PSCustomObject]@{
                    Name           = 'TestAG'
                    PrimaryReplica = 'TESTSERVER'
                })
            }
            Mock -ModuleName sqmSQLTool Invoke-DbaQuery {
                @([PSCustomObject]@{
                    AgName           = 'TestAG'
                    ReplicaName      = 'TESTSERVER'
                    AvailabilityMode = 'SYNCHRONOUS_COMMIT'
                    FailoverMode     = 'AUTOMATIC'
                    Role             = 'PRIMARY'
                    ConnectionState  = 'CONNECTED'
                    SyncHealth       = 'HEALTHY'
                    DatabaseName     = 'TestDB'
                    DbSyncState      = 'SYNCHRONIZED'
                    DbSyncHealth     = 'HEALTHY'
                    RedoQueueKB      = 0
                    SendQueueKB      = 51200
                    RedoRateKBs      = 0
                    SendRateKBs      = 1024
                    IsSuspended      = $false
                })
            }
            Mock -ModuleName sqmSQLTool Invoke-sqmLogging { }
        }

        It 'Laeuft ohne Fehler durch und liefert Zeilen zurueck' {
            $result = @(Get-sqmAlwaysOnQueueStatus -SqlInstance 'TESTSERVER')
            $result.Count | Should -Be 1
        }

        It 'Berechnet SendQueueMB korrekt und markiert Warning oberhalb des Schwellwerts' {
            $result = Get-sqmAlwaysOnQueueStatus -SqlInstance 'TESTSERVER' -MaxSendQueueMB 10
            $result.SendQueueMB | Should -Be 50
            $result.OverallStatus | Should -Be 'Warning'
        }

        It 'Schreibt keine Dateien' {
            $tempDir = Join-Path $env:TEMP "sqmQueueStatusTest_$(Get-Random)"
            New-Item -ItemType Directory -Path $tempDir -Force | Out-Null
            try
            {
                Get-sqmAlwaysOnQueueStatus -SqlInstance 'TESTSERVER' | Out-Null
                (Get-ChildItem $tempDir -File).Count | Should -Be 0
            }
            finally
            {
                Remove-Item $tempDir -Recurse -Force -ErrorAction SilentlyContinue
            }
        }
    }
}