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 } } |