private/steps/3-preinstall/step-preinstall-partitiontargetdisk.Tests.ps1

BeforeAll {
    . "$PSScriptRoot\step-preinstall-partitiontargetdisk.ps1"
    . "$PSScriptRoot\..\..\disk\disk-osdcloud-v2.ps1"
    . "$PSScriptRoot\..\..\disk\Get-OSDCloudDiskParameters.ps1"
    $originalInvoke = $global:OSDCloudWorkflowInvoke
    $originalDevice = $global:OSDCoreDevice
    $originalIsVM = Get-Variable IsVM -Scope Global -ErrorAction SilentlyContinue
}

AfterAll {
    $global:OSDCloudWorkflowInvoke = $originalInvoke
    $global:OSDCoreDevice = $originalDevice
    if ($originalIsVM) { $global:IsVM = $originalIsVM.Value }
    else { Remove-Variable IsVM -Scope Global -ErrorAction SilentlyContinue }
}

Describe 'Partition step disk customization' {
    BeforeEach {
        $global:OSDCoreDevice = [pscustomobject]@{ IsVM = $false }
        $global:IsVM = $false
        $global:OSDCloudWorkflowInvoke = [ordered]@{
            DeploymentDiskNumber = 0
            RecoveryPartition = [pscustomobject]@{ Force = $false; Skip = $false }
        }
        Mock New-OSDCloudDisk {}
        Mock Get-PSDrive { [pscustomobject]@{ Name = 'C' } }
        Mock Start-Sleep {}
        Mock Write-Host {}
    }

    It 'passes the legacy default layout without binding SizeWindows' {
        step-preinstall-partitiontargetdisk
        Should -Invoke New-OSDCloudDisk -Times 1 -Exactly -ParameterFilter {
            $DiskNumber -eq 0 -and $PartitionStyle -eq 'GPT' -and $Force -and
            $LabelWindows -eq 'OS' -and $LabelRecovery -eq 'Recovery' -and
            $SizeSystemGpt -eq 500MB -and $SizeRecovery -eq 2000MB -and
            -not $NoRecoveryPartition -and -not $PesterBoundParameters.ContainsKey('SizeWindows')
        }
    }

    It 'forwards each override independently: <Property>' -TestCases @(
        @{ Property = 'DiskLabelOS'; Value = 'Windows'; Parameter = 'LabelWindows' }
        @{ Property = 'DiskLabelRecovery'; Value = 'WinRE'; Parameter = 'LabelRecovery' }
        @{ Property = 'DiskSizeSystem'; Value = 1GB; Parameter = 'SizeSystemGpt' }
        @{ Property = 'DiskSizeOS'; Value = 32GB; Parameter = 'SizeWindows' }
        @{ Property = 'DiskSizeRecovery'; Value = 3GB; Parameter = 'SizeRecovery' }
    ) {
        param ($Property, $Value, $Parameter)
        $global:OSDCloudWorkflowInvoke[$Property] = $Value
        step-preinstall-partitiontargetdisk
        Should -Invoke New-OSDCloudDisk -Times 1 -Exactly -ParameterFilter { $PesterBoundParameters[$Parameter] -eq $Value }
    }

    It 'supports a nonzero disk with recovery disabled and combined overrides' {
        $global:OSDCloudWorkflowInvoke.DiskLabelOS = 'Windows'
        $global:OSDCloudWorkflowInvoke.DiskLabelRecovery = 'WinRE'
        $global:OSDCloudWorkflowInvoke.DiskSizeSystem = 1GB
        $global:OSDCloudWorkflowInvoke.DiskSizeOS = 32GB
        $global:OSDCloudWorkflowInvoke.DiskSizeRecovery = 3GB
        step-preinstall-partitiontargetdisk -DiskNumber 1 -RecoveryPartitionSkip $true
        Should -Invoke New-OSDCloudDisk -Times 1 -Exactly -ParameterFilter {
            $DiskNumber -eq 1 -and $NoRecoveryPartition -and $SizeWindows -eq 32GB -and
            $SizeSystemGpt -eq 1GB -and $SizeRecovery -eq 3GB -and
            $LabelWindows -eq 'Windows' -and $LabelRecovery -eq 'WinRE'
        }
    }

    It 'retains default disk selection when no target number is available' {
        $global:OSDCloudWorkflowInvoke.DeploymentDiskNumber = $null
        step-preinstall-partitiontargetdisk
        Should -Invoke New-OSDCloudDisk -Times 1 -Exactly -ParameterFilter { -not $PesterBoundParameters.ContainsKey('DiskNumber') }
    }

    It 'allows force to override a virtual machine and recovery skip' {
        $global:OSDCoreDevice.IsVM = $true
        step-preinstall-partitiontargetdisk -RecoveryPartitionSkip $true -RecoveryPartitionForce $true
        Should -Invoke New-OSDCloudDisk -Times 1 -Exactly -ParameterFilter { -not $NoRecoveryPartition }
    }
}