tests/Unit/Public/Invoke-sqmRestoreTest.Tests.ps1

#Requires -Modules Pester
<#
.SYNOPSIS
    Unit Tests fuer die -DatabaseName-Aufloesung von Invoke-sqmRestoreTest.
 
.DESCRIPTION
    Hintergrund: -DatabaseName war unbedingt Mandatory, obwohl der Name bei Angabe von
    -BackupFile bereits im Backup selbst steht (RESTORE HEADERONLY) - PowerShell fragte den
    Namen deshalb immer interaktiv ab, selbst wenn -BackupFile mitgegeben wurde. Angeglichen an
    Invoke-sqmRestoreDatabase, das denselben Fall schon immer aus dem Backup-Header loest.
    -DatabaseName bleibt erforderlich, wenn -BackupFile FEHLT, da der Name dort als Suchschluessel
    fuer die msdb-Sicherungshistorie dient und es keinen anderen Weg gibt, das Backup zu finden.
#>


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

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

Describe 'Invoke-sqmRestoreTest - DatabaseName-Aufloesung' {

    It '-DatabaseName ist nicht mehr Mandatory (Voraussetzung dafuer, dass -BackupFile allein reicht)' {
        $cmd = Get-Command Invoke-sqmRestoreTest
        $param = $cmd.Parameters['DatabaseName']
        $isMandatory = ($param.ParameterSets.Values | ForEach-Object { $_.IsMandatory }) -contains $true
        $isMandatory | Should -BeFalse
    }

    It 'liest -DatabaseName aus dem Backup-Header, wenn nur -BackupFile angegeben ist' {
        InModuleScope sqmSQLTool {
            Mock Invoke-sqmLogging { }
            Mock Invoke-DbaQuery -ParameterFilter { $Query -match 'RESTORE HEADERONLY' } -MockWith {
                [PSCustomObject]@{ DatabaseName = 'KundeAutoDetected' }
            }
            # Sentinel statt vollem Restore-Pfad: sobald Connect-DbaInstance erreicht wird, steht
            # fest, dass die Guards (Praefix/Zielname) mit dem aufgeloesten Namen bereits
            # durchlaufen sind - die eigentliche Fragestellung (wurde der Name ueberhaupt
            # aufgeloest, statt nach ihm zu fragen) ist damit beantwortet.
            Mock Connect-DbaInstance { throw 'SENTINEL_REACHED_CONNECT' }

            {
                Invoke-sqmRestoreTest -SqlInstance 'SQL01' -BackupFile 'D:\Backup\Kunde_Full.bak' `
                    -EnableException -Confirm:$false
            } | Should -Throw -ExpectedMessage '*SENTINEL_REACHED_CONNECT*'

            Should -Invoke Invoke-DbaQuery -ParameterFilter { $Query -match 'RESTORE HEADERONLY' } -Times 1
        }
    }

    It 'lehnt fehlenden -DatabaseName OHNE -BackupFile ab, bevor ueberhaupt eine Verbindung aufgebaut wird' {
        InModuleScope sqmSQLTool {
            Mock Invoke-sqmLogging { }
            Mock Connect-DbaInstance { throw 'DARF_NICHT_AUFGERUFEN_WERDEN' }

            $result = Invoke-sqmRestoreTest -SqlInstance 'SQL01' -Confirm:$false

            $result.Status | Should -Be 'Rejected'
            Should -Invoke Connect-DbaInstance -Times 0
        }
    }

    It '-DatabaseName weiterhin nutzbar, wenn explizit angegeben (kein Header-Lookup noetig)' {
        InModuleScope sqmSQLTool {
            Mock Invoke-sqmLogging { }
            Mock Invoke-DbaQuery -ParameterFilter { $Query -match 'RESTORE HEADERONLY' } -MockWith {
                throw 'HEADER LOOKUP HAETTE NICHT LAUFEN DUERFEN'
            }
            Mock Connect-DbaInstance { throw 'SENTINEL_REACHED_CONNECT' }

            {
                Invoke-sqmRestoreTest -SqlInstance 'SQL01' -BackupFile 'D:\Backup\Kunde_Full.bak' -DatabaseName 'Kunde' `
                    -EnableException -Confirm:$false
            } | Should -Throw -ExpectedMessage '*SENTINEL_REACHED_CONNECT*'

            Should -Invoke Invoke-DbaQuery -ParameterFilter { $Query -match 'RESTORE HEADERONLY' } -Times 0
        }
    }
}