private/core-driverpack/Get-OSDCoreModelDriversCacheObject.Tests.ps1

BeforeAll {
    . "$PSScriptRoot\Get-OSDCoreModelDriversCacheObject.ps1"
    . "$PSScriptRoot\Resolve-OSDCoreModelDriversPath.ps1"
}

Describe 'Get-OSDCoreModelDriversCacheObject matching and ordering' {
    BeforeEach {
        Mock Resolve-OSDCoreModelDriversPath { $CacheObject.FullName }
        $content = @(
            [pscustomobject]@{ Type = 'ModelDrivers'; OSArchitecture = 'amd64'; ModelIdentity = 'HP_8CD1_Old model'; OSBuildVersion = '26200.99'; FullName = 'E:\old' },
            [pscustomobject]@{ Type = 'ModelDrivers'; OSArchitecture = 'amd64'; ModelIdentity = 'HP_8CD1_Renamed model'; OSBuildVersion = '26200.100'; FullName = 'E:\new' },
            [pscustomobject]@{ Type = 'ModelDrivers'; OSArchitecture = 'arm64'; ModelIdentity = 'HP_8CD1_ARM model'; OSBuildVersion = '28000.100'; FullName = 'E:\arm' },
            [pscustomobject]@{ Type = 'ModelDrivers'; OSArchitecture = 'amd64'; ModelIdentity = 'HP_8CD10_Wrong product'; OSBuildVersion = '28000.100'; FullName = 'E:\wrong-product' },
            [pscustomobject]@{ Type = 'ModelDrivers'; OSArchitecture = 'amd64'; ModelIdentity = 'Dell_8CD1_Wrong manufacturer'; OSBuildVersion = '28000.100'; FullName = 'E:\wrong-manufacturer' },
            [pscustomobject]@{ Type = 'Drivers'; OSArchitecture = 'amd64'; ModelIdentity = 'HP_8CD1_Wrong type'; OSBuildVersion = '28000.100'; FullName = 'E:\wrong-type' }
        )
    }

    It 'matches manufacturer/product only, ignoring different model text and sorting numerically' {
        $item = Get-OSDCoreModelDriversCacheObject -OSDManufacturer hp -OSDProduct 8cd1 -OSArchitecture amd64 -CacheContent $content
        $item.FullName | Should -Be 'E:\new'
        Should -Invoke Resolve-OSDCoreModelDriversPath -Times 1 -Exactly
    }

    It 'selects only the matching architecture' {
        $item = Get-OSDCoreModelDriversCacheObject -OSDManufacturer HP -OSDProduct 8CD1 -OSArchitecture arm64 -CacheContent $content
        $item.FullName | Should -Be 'E:\arm'
    }

    It 'never selects WinPEDrivers for deployment even with a higher matching build' {
        $winPEContent = @([pscustomobject]@{
            Type = 'WinPEDrivers'
            OSArchitecture = 'amd64'
            ModelIdentity = 'HP_8CD1_WinPE model'
            OSBuildVersion = '28000.100'
            FullName = 'E:\OSDCloud\winpedrivers-amd64\HP_8CD1_WinPE model_28000.100'
        })
        $item = Get-OSDCoreModelDriversCacheObject -OSDManufacturer HP -OSDProduct 8CD1 -OSArchitecture amd64 -CacheContent ($content + $winPEContent)
        $item.FullName | Should -Be 'E:\new'
        Get-OSDCoreModelDriversCacheObject -OSDManufacturer HP -OSDProduct 8CD1 -OSArchitecture amd64 -CacheContent $winPEContent | Should -BeNullOrEmpty
        Should -Invoke Resolve-OSDCoreModelDriversPath -Times 0 -Exactly -ParameterFilter { $CacheObject.Type -eq 'WinPEDrivers' }
    }

    It 'selects a higher major build regardless of the deployed OS build' {
        $content += [pscustomobject]@{ Type = 'ModelDrivers'; OSArchitecture = 'amd64'; ModelIdentity = 'HP_8CD1_Another description'; OSBuildVersion = '28000.1'; FullName = 'E:\new-major' }
        $item = Get-OSDCoreModelDriversCacheObject -OSDManufacturer HP -OSDProduct 8CD1 -OSArchitecture amd64 -CacheContent $content
        $item.FullName | Should -Be 'E:\new-major'
    }

    It 'uses deterministic path order for equal versions' {
        $content += [pscustomobject]@{ Type = 'ModelDrivers'; OSArchitecture = 'amd64'; ModelIdentity = 'HP_8CD1_Alternate description'; OSBuildVersion = '26200.100'; FullName = 'D:\duplicate' }
        $item = Get-OSDCoreModelDriversCacheObject -OSDManufacturer HP -OSDProduct 8CD1 -OSArchitecture amd64 -CacheContent $content
        $item.FullName | Should -Be 'D:\duplicate'
    }

    It 'falls back to the next safe folder when the newest source is excluded' {
        Mock Resolve-OSDCoreModelDriversPath {} -ParameterFilter { $CacheObject.FullName -eq 'E:\new' }
        $item = Get-OSDCoreModelDriversCacheObject -OSDManufacturer HP -OSDProduct 8CD1 -OSArchitecture amd64 -CacheContent $content
        $item.FullName | Should -Be 'E:\old'
    }

    It 'matches product underscores and regex characters literally' {
        $content = @([pscustomobject]@{ Type = 'ModelDrivers'; OSArchitecture = 'arm64'; ModelIdentity = 'Microsoft_Surface_Product[1]_Any model'; OSBuildVersion = '28000.100'; FullName = 'E:\surface' })
        $item = Get-OSDCoreModelDriversCacheObject -OSDManufacturer Microsoft -OSDProduct 'Surface_Product[1]' -OSArchitecture arm64 -CacheContent $content
        $item.FullName | Should -Be 'E:\surface'
    }

    It 'does not match a product prefix without the underscore boundary' {
        Get-OSDCoreModelDriversCacheObject -OSDManufacturer HP -OSDProduct 8CD -OSArchitecture amd64 -CacheContent $content | Should -BeNullOrEmpty
        Should -Invoke Resolve-OSDCoreModelDriversPath -Times 0 -Exactly
    }

    It 'warns and excludes an invalid numeric version' {
        $content[1].OSBuildVersion = 'invalid'
        $item = Get-OSDCoreModelDriversCacheObject -OSDManufacturer HP -OSDProduct 8CD1 -OSArchitecture amd64 -CacheContent $content -WarningVariable messages -WarningAction SilentlyContinue
        $item.FullName | Should -Be 'E:\old'
        $messages.Count | Should -Be 1
    }

    It 'returns no source for missing device identity or an empty inventory' {
        Get-OSDCoreModelDriversCacheObject -OSDManufacturer '' -OSDProduct 8CD1 -OSArchitecture amd64 -CacheContent $content | Should -BeNullOrEmpty
        Get-OSDCoreModelDriversCacheObject -OSDManufacturer HP -OSDProduct 8CD1 -OSArchitecture amd64 -CacheContent @() | Should -BeNullOrEmpty
        Should -Invoke Resolve-OSDCoreModelDriversPath -Times 0 -Exactly
    }
}