tests/functions/Get-IsNewMaesterVersionAvailable.Tests.ps1

Describe 'Get-IsNewMaesterVersionAvailable' {
    BeforeAll {
        . "$PSScriptRoot/../../internal/Get-MtLatestModuleVersion.ps1"
        . "$PSScriptRoot/../../internal/Get-MtModuleVersion.ps1"
        . "$PSScriptRoot/../../internal/Get-IsNewMaesterVersionAvailable.ps1"
    }

    Context 'When a newer version exists' {
        It 'returns true' {
            $latestVersion = [version]'2.5.0'

            Mock Get-MtModuleVersion { [version]'2.4.0' }
            Mock Get-MtLatestModuleVersion { $latestVersion }
            Mock Write-Host {}

            $result = Get-IsNewMaesterVersionAvailable

            $result | Should -BeTrue
            Should -Invoke Get-MtModuleVersion -Exactly 1
            Should -Invoke Get-MtLatestModuleVersion -Exactly 1
        }

        It 'returns false when installed is equal to latest' {
            Mock Get-MtModuleVersion { [version]'2.0.0' }
            Mock Get-MtLatestModuleVersion { [version]'2.0.0' }
            Mock Write-Host {}

            $result = Get-IsNewMaesterVersionAvailable

            $result | Should -BeFalse
        }

        It 'returns false when current version is not comparable (for example, Next)' {
            Mock Get-MtModuleVersion { 'Next' }
            Mock Get-MtLatestModuleVersion { [version]'2.0.0' }
            Mock Write-Host {}

            $result = Get-IsNewMaesterVersionAvailable

            $result | Should -BeFalse
        }
    }

    Context 'When latest version cannot be determined' {
        It 'returns false' {
            Mock Get-MtModuleVersion { [version]'2.4.0' }
            Mock Get-MtLatestModuleVersion { $null }
            Mock Write-Host {}

            $result = Get-IsNewMaesterVersionAvailable

            $result | Should -BeFalse
            Should -Invoke Get-MtLatestModuleVersion -Exactly 1
        }
    }

    Context 'When version lookup throws' {
        It 'returns false and does not throw' {
            Mock Get-MtModuleVersion { [version]'2.4.0' }
            Mock Get-MtLatestModuleVersion { throw 'Lookup failed' }
            Mock Write-Host {}

            { Get-IsNewMaesterVersionAvailable } | Should -Not -Throw
            Get-IsNewMaesterVersionAvailable | Should -BeFalse
        }
    }

    Context 'When installed version cannot be determined' {
        It 'returns false' {
            Mock Get-MtModuleVersion { $null }
            Mock Get-MtLatestModuleVersion { [version]'2.5.0' }
            Mock Write-Host {}

            $result = Get-IsNewMaesterVersionAvailable

            $result | Should -BeFalse
        }
    }

    Context 'When current module version is a prerelease string' {
        It 'parses and compares prerelease versions correctly' {
            Mock Get-MtModuleVersion { '2.0.0-beta' }
            Mock Get-MtLatestModuleVersion { [version]'2.1.0' }
            Mock Write-Host {}

            $result = Get-IsNewMaesterVersionAvailable

            # 2.0.0-beta is normalized to 2.0.0 for deterministic comparison.
            $result | Should -BeTrue
        }
    }
}