tests/Unit/Public/Sync-sqmAgNode.Tests.ps1

#Requires -Modules Pester
<#
.SYNOPSIS
    Unit Tests fuer die Parameteruebergabe von Sync-sqmAgNode an Copy-Dba*.
 
.DESCRIPTION
    Hintergrund: Alle fuenf Copy-Dba*-Aufrufe wurden mit dem Verbindungs-Splat @primaryConn
    (SqlInstance/SqlCredential) aufgerufen. Copy-Dba* kennt aber nur -Source/-SourceSqlCredential,
    der erste Sync-Typ brach deshalb mit "Es wurde kein Parameter gefunden, der dem Parameternamen
    'SqlInstance' entspricht" ab - die Funktion hat nie etwas synchronisiert. Pester-Mocks behalten
    die echte Parameter-Signatur von dbatools, der Binding-Fehler tritt hier also genauso auf.
#>


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

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

Describe 'Sync-sqmAgNode - Copy-Dba* Parameter' {

    BeforeEach {
        InModuleScope sqmSQLTool {
            Mock Invoke-sqmLogging { }
            Mock Get-DbaAvailabilityGroup { [PSCustomObject]@{ Name = 'AG1'; PrimaryReplica = 'SQLA' } }
            Mock Get-DbaAgReplica {
                [PSCustomObject]@{ Name = 'SQLA'; Role = 'Primary' }
                [PSCustomObject]@{ Name = 'SQLB'; Role = 'Secondary' }
            }
            Mock Get-DbaAgDatabase { }
            Mock Get-DbaLogin { [PSCustomObject]@{ Name = 'AppLogin'; IsSystemObject = $false } }
            Mock Get-DbaAgentJob { [PSCustomObject]@{ Name = 'AppJob' } }
            Mock Get-DbaLinkedServer { [PSCustomObject]@{ Name = 'LS1' } }
            Mock Get-DbaAgentOperator { [PSCustomObject]@{ Name = 'DBA' } }
            Mock Get-DbaAgentAlert { [PSCustomObject]@{ Name = 'Sev17' } }
            Mock Copy-DbaLogin { [PSCustomObject]@{ Name = 'AppLogin'; Status = 'Successful' } }
            Mock Copy-DbaAgentJob { [PSCustomObject]@{ Name = 'AppJob'; Status = 'Successful' } }
            Mock Copy-DbaLinkedServer { [PSCustomObject]@{ Name = 'LS1'; Status = 'Successful' } }
            Mock Copy-DbaAgentOperator { [PSCustomObject]@{ Name = 'DBA'; Status = 'Successful' } }
            Mock Copy-DbaAgentAlert { [PSCustomObject]@{ Name = 'Sev17'; Status = 'Successful' } }
        }
    }

    It 'synchronisiert alle fuenf Typen vom Primary (-Source) auf den Secondary' {
        InModuleScope sqmSQLTool {
            $result = Sync-sqmAgNode -SqlInstance 'SQLB' -EnableException -Confirm:$false

            @($result | Where-Object Status -eq 'Success').Count | Should -Be 5
            foreach ($cmd in 'Copy-DbaLogin', 'Copy-DbaAgentJob', 'Copy-DbaLinkedServer', 'Copy-DbaAgentOperator', 'Copy-DbaAgentAlert')
            {
                Should -Invoke $cmd -Times 1 -Exactly -ParameterFilter { "$Source" -eq 'SQLA' -and "$Destination" -eq 'SQLB' }
            }
        }
    }

    It 'reicht -SqlCredential als Source- und DestinationSqlCredential weiter' {
        InModuleScope sqmSQLTool {
            $cred = [PSCredential]::new('dev', (ConvertTo-SecureString 'x' -AsPlainText -Force))
            Sync-sqmAgNode -SqlInstance 'SQLB' -SqlCredential $cred -ExcludeType Jobs, LinkedServers, Operators, Alerts -EnableException -Confirm:$false | Out-Null

            Should -Invoke Copy-DbaLogin -Times 1 -Exactly -ParameterFilter {
                $SourceSqlCredential.UserName -eq 'dev' -and $DestinationSqlCredential.UserName -eq 'dev'
            }
        }
    }
}