tests/Unit/Public/Repair-sqmAlwaysOnDatabases.Tests.ps1
|
#Requires -Modules Pester <# .SYNOPSIS Unit Tests fuer Repair-sqmAlwaysOnDatabases, Schwerpunkt: nur AGs reparieren, in denen die Instanz Primary ist. dbatools wird 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 'Repair-sqmAlwaysOnDatabases' { BeforeAll { Mock -ModuleName sqmSQLTool Invoke-sqmLogging { } Mock -ModuleName sqmSQLTool Write-EventLog { } Mock -ModuleName sqmSQLTool Invoke-sqmSqlAlwaysOnAutoseeding { @() } Mock -ModuleName sqmSQLTool Get-DbaAgDatabase { [PSCustomObject]@{ Name = "DB_$AvailabilityGroup"; SynchronizationState = 'NotSynchronizing' } } Mock -ModuleName sqmSQLTool Remove-DbaAgDatabase { } Mock -ModuleName sqmSQLTool Get-DbaAgReplica { @([PSCustomObject]@{ Name = 'SQL01'; Role = 'Primary' }, [PSCustomObject]@{ Name = 'SQL02'; Role = 'Secondary' }) } Mock -ModuleName sqmSQLTool Get-DbaDatabase { [PSCustomObject]@{ Name = 'X'; RecoveryModel = 'Full' } } Mock -ModuleName sqmSQLTool Remove-DbaDatabase { } Mock -ModuleName sqmSQLTool Add-DbaAgDatabase { } } It 'Repariert nur die AG, in der die Instanz Primary ist' { Mock -ModuleName sqmSQLTool Get-DbaAvailabilityGroup { @([PSCustomObject]@{ Name = 'AG_P'; LocalReplicaRole = 'Primary'; PrimaryReplica = 'SQL01' }, [PSCustomObject]@{ Name = 'AG_S'; LocalReplicaRole = 'Secondary'; PrimaryReplica = 'SQL03' }) } $r = Repair-sqmAlwaysOnDatabases -SqlInstance 'SQL01' -Confirm:$false $r.DatabaseName | Should -Be 'DB_AG_P' $r.Status | Should -Be 'RepairSuccess' Should -Invoke -ModuleName sqmSQLTool Get-DbaAgDatabase -ParameterFilter { $AvailabilityGroup -eq 'AG_S' } -Exactly 0 Should -Invoke -ModuleName sqmSQLTool Remove-DbaAgDatabase -ParameterFilter { $AvailabilityGroup -eq 'AG_S' } -Exactly 0 Should -Invoke -ModuleName sqmSQLTool Add-DbaAgDatabase -ParameterFilter { $AvailabilityGroup -eq 'AG_P' } -Exactly 1 } It 'Automatic Seeding wird nur fuer die Primary-AGs gesetzt' { Mock -ModuleName sqmSQLTool Get-DbaAvailabilityGroup { @([PSCustomObject]@{ Name = 'AG_P'; LocalReplicaRole = 'Primary'; PrimaryReplica = 'SQL01' }, [PSCustomObject]@{ Name = 'AG_S'; LocalReplicaRole = 'Secondary'; PrimaryReplica = 'SQL03' }) } Repair-sqmAlwaysOnDatabases -SqlInstance 'SQL01' -Confirm:$false | Out-Null Should -Invoke -ModuleName sqmSQLTool Invoke-sqmSqlAlwaysOnAutoseeding -ParameterFilter { ($AvailabilityGroup -join ',') -eq 'AG_P' -and -not $All } -Exactly 1 } It 'Instanz ist nirgends Primary: aendert nichts' { Mock -ModuleName sqmSQLTool Get-DbaAvailabilityGroup { [PSCustomObject]@{ Name = 'AG_S'; LocalReplicaRole = 'Secondary'; PrimaryReplica = 'SQL03' } } $r = Repair-sqmAlwaysOnDatabases -SqlInstance 'SQL01' -Confirm:$false $r | Should -BeNullOrEmpty Should -Invoke -ModuleName sqmSQLTool Invoke-sqmSqlAlwaysOnAutoseeding -Exactly 0 Should -Invoke -ModuleName sqmSQLTool Remove-DbaAgDatabase -Exactly 0 Should -Invoke -ModuleName sqmSQLTool Add-DbaAgDatabase -Exactly 0 } } |