Tests/Get-GitWorktreeStatus.Tests.ps1

BeforeAll {
    Import-Module "$PSScriptRoot\..\GittHelpers.psd1" -Force
}

Describe 'Get-GitWorktreeStatus' {
    BeforeEach {
        Mock Get-GitRoot { return $TestDrive } -ModuleName GittHelpers
        Mock Get-WorktreeList {
            return @(
                [PSCustomObject]@{ Path = $TestDrive;    Branch = $null;  IsBare = $true;  IsDetached = $false },
                [PSCustomObject]@{ Path = 'C:\wt\main'; Branch = 'main'; IsBare = $false; IsDetached = $false }
            )
        } -ModuleName GittHelpers
        Mock git { $global:LASTEXITCODE = 0 } -ModuleName GittHelpers
    }

    It 'Returns an entry for every worktree including the bare entry' {
        $result = Get-GitWorktreeStatus
        $result.Count | Should -Be 2
    }

    It 'Reports zero changes for a clean worktree' {
        $result = Get-GitWorktreeStatus
        ($result | Where-Object { $_.Branch -eq 'main' }).Changes | Should -Be 0
    }

    It 'Reports correct change count for a dirty worktree' {
        Mock git {
            $global:LASTEXITCODE = 0
            if ($args -contains 'status') { return @('M file1.txt', '?? file2.txt') }
        } -ModuleName GittHelpers

        $result = Get-GitWorktreeStatus
        ($result | Where-Object { $_.Branch -eq 'main' }).Changes | Should -Be 2
    }

    It 'Labels the bare entry as (bare)' {
        $result = Get-GitWorktreeStatus
        ($result | Where-Object { $_.IsBare }).Branch | Should -Be '(bare)'
    }

    It 'Does not run git status against the bare repo entry' {
        $script:StatusCalled = $false
        Mock git {
            $global:LASTEXITCODE = 0
            if ($args -contains 'status') { $script:StatusCalled = $true }
        } -ModuleName GittHelpers

        Get-GitWorktreeStatus | Out-Null

        # status should only be called once (for the non-bare worktree)
        Should -Invoke git -ModuleName GittHelpers -Times 1 `
            -ParameterFilter { $args -contains 'status' }
    }
}

Describe 'Invoke-Gitt list dispatch' {
    It 'list subcommand calls Get-GitWorktreeStatus' {
        Mock Get-GitWorktreeStatus { return @() } -ModuleName GittHelpers
        Invoke-Gitt list
        Should -Invoke Get-GitWorktreeStatus -Times 1 -ModuleName GittHelpers
    }
}