tests/Get-PendingRebootStatus.Tests.ps1

BeforeAll {
    $modulePath = (Resolve-Path "$PSScriptRoot\..\modules\System.psm1").Path
    Import-Module $modulePath -Force
}

AfterAll {
    Remove-Module System -Force -ErrorAction SilentlyContinue
}

Describe "Get-PendingRebootStatus" {
    Context "Function exists and loads" {
        It "function is available" {
            Get-Command Get-PendingRebootStatus -ErrorAction SilentlyContinue | Should -Not -BeNullOrEmpty
        }

        It "supports WhatIf parameter" {
            $cmd = Get-Command Get-PendingRebootStatus
            $cmd.Parameters.Keys -contains 'WhatIf' | Should -Be $true
        }

        It "supports Verbose parameter" {
            $cmd = Get-Command Get-PendingRebootStatus
            $cmd.Parameters.Keys -contains 'Verbose' | Should -Be $true
        }
    }

    Context "Basic Functionality" {
        It "executes without parameters" {
            { Get-PendingRebootStatus -ErrorAction SilentlyContinue } | Should -Not -Throw
        }

        It "returns PSCustomObject" {
            $result = Get-PendingRebootStatus -ErrorAction SilentlyContinue
            $result | Should -BeOfType [PSCustomObject]
        }

        It "returns object with IsPending property" {
            $result = Get-PendingRebootStatus -ErrorAction SilentlyContinue
            $result.IsPending | Should -Not -BeNullOrEmpty
        }

        It "returns object with Message property" {
            $result = Get-PendingRebootStatus -ErrorAction SilentlyContinue
            $result.Message | Should -Not -BeNullOrEmpty
        }
    }

    Context "Return Value Properties" {
        It "IsPending property is boolean" {
            $result = Get-PendingRebootStatus -ErrorAction SilentlyContinue
            $result.IsPending | Should -BeOfType [bool]
        }

        It "Message property is not empty" {
            $result = Get-PendingRebootStatus -ErrorAction SilentlyContinue
            $result.Message | Should -Not -BeNullOrEmpty
        }

        It "Message mentions reboot when IsPending is false" {
            $result = Get-PendingRebootStatus -ErrorAction SilentlyContinue
            if ($result.IsPending -eq $false) {
                $result.Message | Should -Match "No reboot|reboot"
            }
        }

        It "Message mentions updates when IsPending is true" {
            $result = Get-PendingRebootStatus -ErrorAction SilentlyContinue
            if ($result.IsPending -eq $true) {
                $result.Message | Should -Match "restart|update"
            }
        }
    }

    Context "Error Handling" {
        It "runs with ErrorAction SilentlyContinue" {
            { Get-PendingRebootStatus -ErrorAction SilentlyContinue } | Should -Not -Throw
        }

        It "runs with ErrorAction Stop" {
            { Get-PendingRebootStatus -ErrorAction Stop } | Should -Not -Throw
        }
    }

    Context "WhatIf Support" {
        It "executes in WhatIf mode without throwing" {
            { Get-PendingRebootStatus -WhatIf } | Should -Not -Throw
        }

        It "does not return object in WhatIf mode" {
            $result = Get-PendingRebootStatus -WhatIf
            $result | Should -BeNullOrEmpty
        }

        It "does not log in WhatIf mode" {
            { Get-PendingRebootStatus -WhatIf -Verbose 4>&1 } | Should -Not -Throw
        }
    }

    Context "Verbose Output" {
        It "accepts Verbose parameter" {
            { Get-PendingRebootStatus -Verbose 4>&1 } | Should -Not -Throw
        }
    }

    Context "Documentation" {
        It "has help documentation" {
            $help = Get-Help Get-PendingRebootStatus -ErrorAction SilentlyContinue
            $help.Synopsis | Should -Not -BeNullOrEmpty
        }

        It "has description" {
            $help = Get-Help Get-PendingRebootStatus -ErrorAction SilentlyContinue
            $help.Description | Should -Not -BeNullOrEmpty
        }

        It "has at least one example" {
            $help = Get-Help Get-PendingRebootStatus -ErrorAction SilentlyContinue
            $help.Examples | Should -Not -BeNullOrEmpty
        }
    }
}