Tests/Get-WorkloadSessionStatus.Tests.ps1

Describe 'Get-WorkloadSessionStatus' {

    BeforeAll {
        $modulePath = Join-Path (Join-Path $PSScriptRoot '..') 'WinslopFix.psd1'
        Import-Module $modulePath -Force -ErrorAction Stop
    }

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

    Context 'When no WorkloadsSessionHost processes are running' {

        BeforeAll {
            Mock -ModuleName WinslopFix Get-WinslopFixProcess { return @() } -ParameterFilter {
                $ProcessName -eq 'WorkloadsSessionHost'
            }
        }

        It 'returns a summary object with zero instances' {
            $result = Get-WorkloadSessionStatus
            $result | Should -Not -BeNullOrEmpty
            $result.Status | Should -Be 'NoProcessesFound'
            $result.InstanceCount | Should -Be 0
            $result.TotalMemoryMB | Should -Be 0
        }
    }

    Context 'When WorkloadsSessionHost processes are running' {

        BeforeAll {
            $mockProcesses = @(
                [PSCustomObject]@{
                    Id                  = 1234
                    ProcessName         = 'WorkloadsSessionHost'
                    PrivateMemorySize64 = 500MB
                    TotalProcessorTime  = [TimeSpan]::FromSeconds(30)
                    StartTime           = (Get-Date).AddSeconds(-120)
                }
                [PSCustomObject]@{
                    Id                  = 5678
                    ProcessName         = 'WorkloadsSessionHost'
                    PrivateMemorySize64 = 250MB
                    TotalProcessorTime  = [TimeSpan]::FromSeconds(10)
                    StartTime           = (Get-Date).AddSeconds(-60)
                }
            )

            Mock -ModuleName WinslopFix Get-WinslopFixProcess { return $mockProcesses } -ParameterFilter {
                $ProcessName -eq 'WorkloadsSessionHost'
            }
        }

        It 'returns one object per process plus a summary' {
            $results = @(Get-WorkloadSessionStatus)
            # 2 processes + 1 summary = 3 objects
            $results.Count | Should -Be 3
        }

        It 'returns correct PID values' {
            $results = @(Get-WorkloadSessionStatus)
            $results[0].PID | Should -Be 1234
            $results[1].PID | Should -Be 5678
        }

        It 'calculates memory in MB' {
            $results = @(Get-WorkloadSessionStatus)
            $results[0].MemoryMB | Should -BeGreaterThan 400
            $results[1].MemoryMB | Should -BeGreaterThan 200
        }

        It 'includes an aggregate summary as the last object' {
            $results = @(Get-WorkloadSessionStatus)
            $summary = $results[-1]
            $summary.Status | Should -Match 'Summary'
            $summary.PID | Should -BeNullOrEmpty
            $summary.MemoryMB | Should -BeGreaterThan 700
        }

        It 'calculates process age in seconds' {
            $results = @(Get-WorkloadSessionStatus)
            $results[0].AgeSeconds | Should -BeGreaterOrEqual 100
            $results[1].AgeSeconds | Should -BeGreaterOrEqual 50
        }
    }

    Context 'With custom ProcessName' {

        BeforeAll {
            Mock -ModuleName WinslopFix Get-WinslopFixProcess { return @() } -ParameterFilter {
                $ProcessName -eq 'CustomProcess'
            }
        }

        It 'accepts a custom process name parameter' {
            $result = Get-WorkloadSessionStatus -ProcessName 'CustomProcess'
            $result.ProcessName | Should -Be 'CustomProcess'
        }
    }
}