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

#Requires -Modules Pester
<#
.SYNOPSIS
    Unit Tests fuer Get-sqmDatabaseSpaceReport
#>


BeforeAll {
    . "$PSScriptRoot\..\..\..\tests\TestHelpers.ps1"
    Import-sqmTestModule
    $script:TestDir = New-TempTestDirectory
}

AfterAll {
    if (Test-Path $script:TestDir) { Remove-Item $script:TestDir -Recurse -Force }
    if (Get-Module sqmSQLTool) { Remove-Module sqmSQLTool -Force }
    $env:MSSQLTOOLS_SKIP_AUTO_UPDATE = $null
}

Describe 'Get-sqmDatabaseSpaceReport' {

    Context 'Parameter-Validierung' {
        It 'Funktion existiert' {
            Get-Command Get-sqmDatabaseSpaceReport | Should -Not -BeNullOrEmpty
        }

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

        It 'wirft bei CriticalThresholdPct <= WarnThresholdPct' {
            { Get-sqmDatabaseSpaceReport -SqlInstance 'TESTSERVER' -WarnThresholdPct 90 -CriticalThresholdPct 80 -EnableException } |
                Should -Throw
        }
    }

    Context 'Ausfuehrung mit gemockten dbatools-Daten' {
        BeforeAll {
            Mock -ModuleName sqmSQLTool Get-DbaDbSpace {
                @(
                    # AlmostFullDb: 1 Datendatei bei 95% (Critical), 1 Logdatei bei 50%
                    [PSCustomObject]@{
                        Database = 'AlmostFullDb'; FileName = 'AlmostFullDb_data'; FileGroup = 'PRIMARY'
                        PhysicalName = 'C:\Data\AlmostFullDb.mdf'; FileType = 'ROWS'
                        FileSize = [PSCustomObject]@{ Megabyte = 1000 }
                        UsedSpace = [PSCustomObject]@{ Megabyte = 950 }
                        FreeSpace = [PSCustomObject]@{ Megabyte = 50 }
                        PercentUsed = 95; AutoGrowType = 'MB'
                    }
                    [PSCustomObject]@{
                        Database = 'AlmostFullDb'; FileName = 'AlmostFullDb_log'; FileGroup = $null
                        PhysicalName = 'C:\Data\AlmostFullDb.ldf'; FileType = 'LOG'
                        FileSize = [PSCustomObject]@{ Megabyte = 200 }
                        UsedSpace = [PSCustomObject]@{ Megabyte = 100 }
                        FreeSpace = [PSCustomObject]@{ Megabyte = 100 }
                        PercentUsed = 50; AutoGrowType = 'pct'
                    }
                    # HealthyDb: alles unter dem Warn-Schwellwert
                    [PSCustomObject]@{
                        Database = 'HealthyDb'; FileName = 'HealthyDb_data'; FileGroup = 'PRIMARY'
                        PhysicalName = 'C:\Data\HealthyDb.mdf'; FileType = 'ROWS'
                        FileSize = [PSCustomObject]@{ Megabyte = 500 }
                        UsedSpace = [PSCustomObject]@{ Megabyte = 100 }
                        FreeSpace = [PSCustomObject]@{ Megabyte = 400 }
                        PercentUsed = 20; AutoGrowType = 'MB'
                    }
                )
            }
            Mock -ModuleName sqmSQLTool Invoke-sqmLogging { }
            Mock -ModuleName sqmSQLTool Invoke-sqmOpenReport { }
            Mock -ModuleName sqmSQLTool Copy-sqmToCentralPath { }
        }

        It 'Laeuft ohne Fehler durch und liefert ein Ergebnis je Instanz' {
            $r = Get-sqmDatabaseSpaceReport -SqlInstance 'TESTSERVER' -OutputPath $script:TestDir
            $r.SqlInstance | Should -Be 'TESTSERVER'
            $r.Databases.Count | Should -Be 2
        }

        It 'markiert AlmostFullDb als Critical (Datendatei 95% >= Default-Schwellwert 90%)' {
            $r = Get-sqmDatabaseSpaceReport -SqlInstance 'TESTSERVER' -OutputPath $script:TestDir
            $db = $r.Databases | Where-Object DatabaseName -eq 'AlmostFullDb'
            $db.DataPercentUsed | Should -Be 95
            $db.Status | Should -Be 'Critical'
        }

        It 'markiert HealthyDb als OK' {
            $r = Get-sqmDatabaseSpaceReport -SqlInstance 'TESTSERVER' -OutputPath $script:TestDir
            $db = $r.Databases | Where-Object DatabaseName -eq 'HealthyDb'
            $db.Status | Should -Be 'OK'
        }

        It 'schreibt CSV+HTML nach -OutputPath' {
            $r = Get-sqmDatabaseSpaceReport -SqlInstance 'TESTSERVER' -OutputPath $script:TestDir -NoOpen
            Test-Path $r.CsvFile | Should -Be $true
            Test-Path $r.HtmlFile | Should -Be $true
        }

        It 'schreibt CSV+HTML ohne explizites -OutputPath in den Default-Ordner' {
            $r = Get-sqmDatabaseSpaceReport -SqlInstance 'TESTSERVER'
            $r.CsvFile | Should -BeLike 'C:\System\WinSrvLog\MSSQL\DatabaseSpaceReport\*'
            Test-Path $r.CsvFile | Should -Be $true
        }
    }
}