. $PSScriptRoot\..\..\Load-PesterModules.ps1 $here = Split-Path -Parent $MyInvocation.MyCommand.Path $sut = (Split-Path -Leaf $MyInvocation.MyCommand.Path) -replace '\.tests\.', '.' $functionPath = Join-Path -Path $here -ChildPath $sut Write-Host "Overriding SUT: $functionPath" Import-Module $functionPath -Force $moduleForMock = '' Describe 'Get-FolderSizeMb' { $testSize = 1024 * 1024 $testPath = 'TestDrive:\Test' $testServer = 'server1.test.local' Mock -CommandName Test-Path -ModuleName $moduleForMock -MockWith { return $true } Mock -CommandName Get-ChildItem -ModuleName $moduleForMock -MockWith { return @(@{Length = $testSize }) } Mock -CommandName Measure-Object -ModuleName $moduleForMock -MockWith { return @{Sum = $testSize } } Mock -CommandName Compare-StringToLocalMachineIdentifiers -ModuleName $moduleForMock -MockWith { return $true } Mock -CommandName Test-StringIsNullOrWhitespace -ModuleName $moduleForMock -MockWith { return $true } Mock -CommandName Invoke-Command -ModuleName $moduleForMock -MockWith { return $ScriptBlock.Invoke(@($testPath)) } Context 'Input Validation' { It 'Throws if Path is null' { { Get-FolderSizeMb -Path $null } | Should -Throw } It 'Throws if Path is empty' { { Get-FolderSizeMb -Path '' } | Should -Throw } } Context 'Logic' { It 'Performs command on localhost by default' { Get-FolderSizeMb -Path $testPath | Out-Null Assert-MockCalled -ModuleName $moduleForMock -CommandName Test-StringIsNullOrWhitespace -Times 1 -Exactly -Scope It Assert-MockCalled -ModuleName $moduleForMock -CommandName Compare-StringToLocalMachineIdentifiers -Times 0 -Exactly -Scope It Assert-MockCalled -ModuleName $moduleForMock -CommandName Test-Path -Times 1 -Exactly -Scope It Assert-MockCalled -ModuleName $moduleForMock -CommandName Get-ChildItem -Times 1 -Exactly -Scope It Assert-MockCalled -ModuleName $moduleForMock -CommandName Measure-Object -Times 1 -Exactly -Scope It Assert-MockCalled -ModuleName $moduleForMock -CommandName Invoke-Command -Times 1 -Exactly -Scope It ` -ParameterFilter { ( -not $PSBoundParameters.ContainsKey('ComputerName')) } } It 'Performs command on localhost if ComputerName matches current server' { Mock -CommandName Test-StringIsNullOrWhitespace -ModuleName $moduleForMock -MockWith { return $false } Get-FolderSizeMb -Path $testPath -ComputerName $testServer | Out-Null Assert-MockCalled -ModuleName $moduleForMock -CommandName Test-StringIsNullOrWhitespace -Times 1 -Exactly -Scope It Assert-MockCalled -ModuleName $moduleForMock -CommandName Compare-StringToLocalMachineIdentifiers -Times 1 -Exactly -Scope It ` -ParameterFilter { $stringToCheck -eq $testServer } Assert-MockCalled -ModuleName $moduleForMock -CommandName Invoke-Command -Times 1 -Exactly -Scope It ` -ParameterFilter { ( -not $PSBoundParameters.ContainsKey('ComputerName')) } Mock -CommandName Test-StringIsNullOrWhitespace -ModuleName $moduleForMock -MockWith { return $true } } It 'Performs command on remote server if ComputerName does not match current server' { Mock -CommandName Test-StringIsNullOrWhitespace -ModuleName $moduleForMock -MockWith { return $false } Mock -CommandName Compare-StringToLocalMachineIdentifiers -ModuleName $moduleForMock -MockWith { return $false } $testServer2 = 'server2.test.local' Get-FolderSizeMb -Path $testPath -ComputerName $testServer2 | Out-Null Assert-MockCalled -ModuleName $moduleForMock -CommandName Test-StringIsNullOrWhitespace -Times 1 -Exactly -Scope It Assert-MockCalled -ModuleName $moduleForMock -CommandName Compare-StringToLocalMachineIdentifiers -Times 1 -Exactly -Scope It ` -ParameterFilter { $stringToCheck -eq $testServer2 } Assert-MockCalled -ModuleName $moduleForMock -CommandName Invoke-Command -Times 1 -Exactly -Scope It ` -ParameterFilter { $ComputerName -eq $testServer2 } Mock -CommandName Test-StringIsNullOrWhitespace -ModuleName $moduleForMock -MockWith { return $true } Mock -CommandName Compare-StringToLocalMachineIdentifiers -ModuleName $moduleForMock -MockWith { return $true } } It 'Returns zero if path not found' { Mock -CommandName Test-Path -ModuleName $moduleForMock -MockWith { return $false } $result = Get-FolderSizeMb -Path $testPath $result | Should -BeExactly 0 Assert-MockCalled -ModuleName $moduleForMock -CommandName Test-Path -Times 1 -Exactly -Scope It Assert-MockCalled -ModuleName $moduleForMock -CommandName Get-ChildItem -Times 0 -Exactly -Scope It Assert-MockCalled -ModuleName $moduleForMock -CommandName Measure-Object -Times 0 -Exactly -Scope It Assert-MockCalled -ModuleName $moduleForMock -CommandName Invoke-Command -Times 1 -Exactly -Scope It Mock -CommandName Test-Path -ModuleName $moduleForMock -MockWith { return $true } } It 'Returns size in MB if path is found' { $result = Get-FolderSizeMb -Path $testPath $result | Should -BeExactly ($testSize / 1Mb) Assert-MockCalled -ModuleName $moduleForMock -CommandName Test-Path -Times 1 -Exactly -Scope It Assert-MockCalled -ModuleName $moduleForMock -CommandName Get-ChildItem -Times 1 -Exactly -Scope It Assert-MockCalled -ModuleName $moduleForMock -CommandName Measure-Object -Times 1 -Exactly -Scope It Assert-MockCalled -ModuleName $moduleForMock -CommandName Invoke-Command -Times 1 -Exactly -Scope It } } }