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

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


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-sqmSysadminAccounts' {

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

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

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

        It 'WhatIf wird unterstuetzt' {
            (Get-Command Get-sqmSysadminAccounts).Parameters.ContainsKey('WhatIf') | Should -Be $true
        }

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

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

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

    Context 'Ausfuehrung mit gemockten dbatools' {
        BeforeAll {
            Mock -ModuleName sqmSQLTool Connect-DbaInstance { New-MockSqlInstance -Name 'TESTSERVER' }
            Mock -ModuleName sqmSQLTool Get-DbaLogin {
                @(
                    [PSCustomObject]@{
                        Name        = 'sa'
                        LoginType   = 'SqlLogin'
                        IsDisabled  = $false
                        HasAccess   = $true
                        IsSysAdmin  = $true
                    }
                    [PSCustomObject]@{
                        Name        = 'domain\DBA-Group'
                        LoginType   = 'WindowsGroup'
                        IsDisabled  = $false
                        HasAccess   = $true
                        IsSysAdmin  = $true
                    }
                )
            }
            Mock -ModuleName sqmSQLTool Invoke-sqmLogging { }
        }

        It 'Laeuft ohne Fehler mit gemockten Daten durch' {
            { Get-sqmSysadminAccounts -SqlInstance 'TESTSERVER' -OutputPath $script:TestDir -WhatIf } |
                Should -Not -Throw
        }

        It 'Erstellt keine Dateien bei -WhatIf' {
            Get-sqmSysadminAccounts -SqlInstance 'TESTSERVER' -OutputPath $script:TestDir -WhatIf
            (Get-ChildItem $script:TestDir -File).Count | Should -Be 0
        }
    }

    Context 'SupportsShouldProcess' {
        It 'Funktion unterstuetzt ShouldProcess' {
            $cmd = Get-Command Get-sqmSysadminAccounts
            $cmd.Parameters.ContainsKey('WhatIf')   | Should -Be $true
            $cmd.Parameters.ContainsKey('Confirm')  | Should -Be $true
        }
    }
}