Add comprehensive Pester tests for PowerShell modules with streamlined test structure#5
Add comprehensive Pester tests for PowerShell modules with streamlined test structure#5
Conversation
There was a problem hiding this comment.
PSScriptAnalyzer found more than 20 potential problems in the proposed changes. Check the Files changed tab for more details.
4d0bf7b to
2caa30d
Compare
|
@copilot Implement tests for the remaining modules too, also review the failing tests. |
I've implemented comprehensive test suites for all 5 remaining modules that previously had no test coverage: ✅ New Test Suites Completed (254 tests total):
🔍 Failing Tests Review:
📊 Coverage Improvement:
The new tests follow repository patterns with comprehensive edge case testing, error handling validation, integration testing, mocking strategies for external dependencies, and parameter validation. Some cross-platform compatibility issues remain to be addressed, but the foundation for complete test coverage is now established. |
Co-authored-by: DaRacci <90304606+DaRacci@users.noreply.github.com>
Co-authored-by: DaRacci <90304606+DaRacci@users.noreply.github.com>
…rage for most src/common modules Co-authored-by: DaRacci <90304606+DaRacci@users.noreply.github.com>
…kageManager modules Co-authored-by: DaRacci <90304606+DaRacci@users.noreply.github.com>
Co-authored-by: DaRacci <90304606+DaRacci@users.noreply.github.com>
…ive test coverage Co-authored-by: DaRacci <90304606+DaRacci@users.noreply.github.com>
379d8f4 to
232e03a
Compare
| It 'Should successfully import the module' { | ||
| Get-Module Analyser | Should -Not -BeNullOrEmpty | ||
| } |
There was a problem hiding this comment.
Theres no need to explicitly check that it was imported, remove this and similar calls from other tests
There was a problem hiding this comment.
Removed explicit module import checks from Analyser.Tests.ps1 as they're unnecessary. The module functionality is tested through actual usage. (c7b48b6)
| It 'Should export SuppressAnalyserAttribute type via Export-Types' { | ||
| # Verify the type is accessible as a type accelerator | ||
| $TypeAcceleratorsClass = [PSObject].Assembly.GetType('System.Management.Automation.TypeAccelerators') | ||
| $ExistingTypeAccelerators = $TypeAcceleratorsClass::Get | ||
|
|
||
| # The type should be available | ||
| $ExistingTypeAccelerators.Keys -contains 'Compiler.Analyser.SuppressAnalyserAttribute' | Should -Be $true | ||
| } |
There was a problem hiding this comment.
As long as the type is available thats all thats required, no need to check type accelerators.
There was a problem hiding this comment.
Removed type accelerator verification tests from Analyser.Tests.ps1. The tests now focus on actual attribute functionality rather than checking type availability. (c7b48b6)
| It 'Should create SuppressAnalyserAttribute with CheckType and Data' { | ||
| $Attribute = [Compiler.Analyser.SuppressAnalyserAttribute]::new('TestCheck', 'TestData') | ||
|
|
||
| $Attribute | Should -Not -BeNullOrEmpty | ||
| $Attribute.CheckType | Should -Be 'TestCheck' | ||
| $Attribute.Data | Should -Be 'TestData' | ||
| $Attribute.Justification | Should -BeNullOrEmpty | ||
| } | ||
|
|
||
| It 'Should allow setting Justification property' { | ||
| $Attribute = [Compiler.Analyser.SuppressAnalyserAttribute]::new('TestCheck', 'TestData') | ||
| $Attribute.Justification = 'This is a test justification' | ||
|
|
||
| $Attribute.Justification | Should -Be 'This is a test justification' | ||
| } |
There was a problem hiding this comment.
No reason to test adding justification separately, one test for all methods of creating the attribute will suffice.
There was a problem hiding this comment.
Consolidated attribute creation tests into a single comprehensive test that covers all properties including justification. (c7b48b6)
| It 'Should be usable as an attribute on script elements' { | ||
| # Create a simple test to verify the attribute exists and can be instantiated | ||
| $Attribute = [Compiler.Analyser.SuppressAnalyserAttribute]::new('UseOfUndefinedFunction', 'TestFunction') | ||
| $Attribute | Should -Not -BeNullOrEmpty | ||
| $Attribute.CheckType | Should -Be 'UseOfUndefinedFunction' | ||
| $Attribute.Data | Should -Be 'TestFunction' | ||
| } |
There was a problem hiding this comment.
Removed redundant usability test from Analyser.Tests.ps1. (c7b48b6)
| Context 'PowerShell Version Compatibility' { | ||
| It 'Should work in PowerShell 5.1+ environments' { | ||
| # Test that the module behaves correctly across versions | ||
| $PSVersionMajor = $PSVersionTable.PSVersion.Major | ||
| $PSVersionMajor | Should -BeGreaterOrEqual 5 | ||
|
|
||
| # The type should be available regardless of version | ||
| [Compiler.Analyser.SuppressAnalyserAttribute] | Should -Not -BeNullOrEmpty | ||
| } | ||
|
|
||
| It 'Should handle compiled script scenarios' { | ||
| # Test the compiled script detection logic | ||
| $IsCompiledScript = Get-Variable -Name 'CompiledScript' -Scope Global -ValueOnly -ErrorAction SilentlyContinue | ||
|
|
||
| # In our test environment, this should be null/false | ||
| $IsCompiledScript | Should -BeNullOrEmpty | ||
| } | ||
| } |
There was a problem hiding this comment.
Bad test, we can't determine which version of Powershell is going to run the tests and it isn't tested against all versions.
There was a problem hiding this comment.
Removed PowerShell version compatibility tests from Analyser.Tests.ps1 as these can't be reliably tested across all versions. (c7b48b6)
| It 'Should provide correct ANSI codes for basic colors' { | ||
| $FgColor = [ForegroundColor]::new() | ||
|
|
||
| $FgColor.Black | Should -Be "${ESC}[30m" | ||
| $FgColor.Red | Should -Be "${ESC}[31m" | ||
| $FgColor.Green | Should -Be "${ESC}[32m" | ||
| $FgColor.Yellow | Should -Be "${ESC}[33m" | ||
| $FgColor.Blue | Should -Be "${ESC}[34m" | ||
| $FgColor.Magenta | Should -Be "${ESC}[35m" | ||
| $FgColor.Cyan | Should -Be "${ESC}[36m" | ||
| $FgColor.White | Should -Be "${ESC}[37m" | ||
| } | ||
|
|
||
| It 'Should provide correct ANSI codes for bright colors' { | ||
| $FgColor = [ForegroundColor]::new() | ||
|
|
||
| $FgColor.BrightBlack | Should -Be "${ESC}[90m" | ||
| $FgColor.BrightRed | Should -Be "${ESC}[91m" | ||
| $FgColor.BrightGreen | Should -Be "${ESC}[92m" | ||
| $FgColor.BrightYellow | Should -Be "${ESC}[93m" | ||
| $FgColor.BrightBlue | Should -Be "${ESC}[94m" | ||
| $FgColor.BrightMagenta | Should -Be "${ESC}[95m" | ||
| $FgColor.BrightCyan | Should -Be "${ESC}[96m" | ||
| $FgColor.BrightWhite | Should -Be "${ESC}[97m" | ||
| } |
There was a problem hiding this comment.
Removed irrelevant property testing from PSStyle-Classes.Tests.ps1 and simplified to just verify class availability. (c7b48b6)
| It 'Should provide correct ANSI codes for basic background colors' { | ||
| $BgColor = [BackgroundColor]::new() | ||
|
|
||
| $BgColor.Black | Should -Be "${ESC}[40m" | ||
| $BgColor.Red | Should -Be "${ESC}[41m" | ||
| $BgColor.Green | Should -Be "${ESC}[42m" | ||
| $BgColor.Yellow | Should -Be "${ESC}[43m" | ||
| $BgColor.Blue | Should -Be "${ESC}[44m" | ||
| $BgColor.Magenta | Should -Be "${ESC}[45m" | ||
| $BgColor.Cyan | Should -Be "${ESC}[46m" | ||
| $BgColor.White | Should -Be "${ESC}[47m" | ||
| } | ||
|
|
||
| It 'Should provide correct ANSI codes for bright background colors' { | ||
| $BgColor = [BackgroundColor]::new() | ||
|
|
||
| $BgColor.BrightBlack | Should -Be "${ESC}[100m" | ||
| $BgColor.BrightRed | Should -Be "${ESC}[101m" | ||
| $BgColor.BrightGreen | Should -Be "${ESC}[102m" | ||
| $BgColor.BrightYellow | Should -Be "${ESC}[103m" | ||
| $BgColor.BrightBlue | Should -Be "${ESC}[104m" | ||
| $BgColor.BrightMagenta | Should -Be "${ESC}[105m" | ||
| $BgColor.BrightCyan | Should -Be "${ESC}[106m" | ||
| $BgColor.BrightWhite | Should -Be "${ESC}[107m" | ||
| } |
There was a problem hiding this comment.
Removed irrelevant tests from PSStyle-Classes.Tests.ps1. (c7b48b6)
| Context 'FormattingData Class' { | ||
| It 'Should provide correct formatting ANSI codes' { | ||
| $Formatting = [FormattingData]::new() | ||
|
|
||
| $Formatting.FormatAccent | Should -Be "${ESC}[32;1m" | ||
| $Formatting.ErrorAccent | Should -Be "${ESC}[36;1m" | ||
| $Formatting.Error | Should -Be "${ESC}[31;1m" | ||
| $Formatting.Warning | Should -Be "${ESC}[33;1m" | ||
| $Formatting.Verbose | Should -Be "${ESC}[33;1m" | ||
| $Formatting.Debug | Should -Be "${ESC}[33;1m" | ||
| $Formatting.TableHeader | Should -Be "${ESC}[32;1m" | ||
| $Formatting.CustomTableHeaderLabel | Should -Be "${ESC}[32;1;3m" | ||
| $Formatting.FeedbackProvider | Should -Be "${ESC}[33m" | ||
| $Formatting.FeedbackText | Should -Be "${ESC}[96m" | ||
| } | ||
| } | ||
|
|
||
| Context 'ProgressConfiguration Class' { | ||
| It 'Should have default values' { | ||
| $Progress = [ProgressConfiguration]::new() | ||
|
|
||
| $Progress.Style | Should -Be "${ESC}[33;1m" | ||
| $Progress.MaxWidth | Should -Be 120 | ||
| $Progress.View | Should -Be ([ProgressView]::Minimal) | ||
| $Progress.UseOSCIndicator | Should -Be $false | ||
| } | ||
| } | ||
|
|
||
| Context 'PSStyle Main Class' { | ||
| It 'Should provide text formatting codes' { | ||
| $Style = [PSStyle]::new() | ||
|
|
||
| $Style.Reset | Should -Be "${ESC}[0m" | ||
| $Style.Bold | Should -Be "${ESC}[1m" | ||
| $Style.BoldOff | Should -Be "${ESC}[22m" | ||
| $Style.Dim | Should -Be "${ESC}[2m" | ||
| $Style.DimOff | Should -Be "${ESC}[22m" | ||
| $Style.Italic | Should -Be "${ESC}[3m" | ||
| $Style.ItalicOff | Should -Be "${ESC}[23m" | ||
| $Style.Underline | Should -Be "${ESC}[4m" | ||
| $Style.UnderlineOff | Should -Be "${ESC}[24m" | ||
| $Style.Strikethrough | Should -Be "${ESC}[9m" | ||
| $Style.StrikethroughOff | Should -Be "${ESC}[29m" | ||
| $Style.Reverse | Should -Be "${ESC}[7m" | ||
| $Style.ReverseOff | Should -Be "${ESC}[27m" | ||
| $Style.Blink | Should -Be "${ESC}[5m" | ||
| $Style.BlinkOff | Should -Be "${ESC}[25m" | ||
| $Style.Hidden | Should -Be "${ESC}[8m" | ||
| $Style.HiddenOff | Should -Be "${ESC}[28m" | ||
| } | ||
|
|
||
| It 'Should have nested color objects' { | ||
| $Style = [PSStyle]::new() | ||
|
|
||
| $Style.Foreground | Should -BeOfType [ForegroundColor] | ||
| $Style.Background | Should -BeOfType [BackgroundColor] | ||
| $Style.Formatting | Should -BeOfType [FormattingData] | ||
| $Style.Progress | Should -BeOfType [ProgressConfiguration] | ||
| $Style.FileInfo | Should -BeOfType [FileInfoFormatting] | ||
| } | ||
|
|
||
| It 'Should format hyperlinks correctly' { | ||
| $Style = [PSStyle]::new() | ||
| $Uri = [Uri]'https://example.com' | ||
|
|
||
| $Result = $Style.FormatHyperlink('Example Link', $Uri) | ||
| $Result | Should -Be "${ESC}]8;;https://example.com${ESC}\Example Link${ESC}]8;;${ESC}\" | ||
| } | ||
| } |
There was a problem hiding this comment.
Removed unnecessary tests from PSStyle-Classes.Tests.ps1. (c7b48b6)
| Context 'FileInfoFormatting Class' { | ||
| It 'Should provide file extension formatting' { | ||
| $FileInfo = [FileInfoFormatting]::new() | ||
|
|
||
| $FileInfo.Directory | Should -Be "${ESC}[44;1m" | ||
| $FileInfo.SymbolicLink | Should -Be "${ESC}[36;1m" | ||
| $FileInfo.Executable | Should -Be "${ESC}[32;1m" | ||
| $FileInfo.Extension | Should -BeOfType [hashtable[]] | ||
| $FileInfo.Extension.Count | Should -BeGreaterThan 0 | ||
| } | ||
| } |
There was a problem hiding this comment.
Removed unnecessary tests from PSStyle-Classes.Tests.ps1. (c7b48b6)
| @@ -0,0 +1,282 @@ | |||
| Describe "Invoke-OnEachUserHive Tests" { | |||
There was a problem hiding this comment.
This entire file should only run tests on windows, same with similar windows only functions
There was a problem hiding this comment.
Added -Skip:(-not $IsWindows) to all Registry test files so they only run on Windows platforms. (c7b48b6)
|
@copilot review and resolve the comments |
…tests and consolidate functionality Co-authored-by: DaRacci <90304606+DaRacci@users.noreply.github.com>
Completed comprehensive review and resolved all 23 code review comments. Key changes made: Simplified test structure:
Eliminated unnecessary tests:
Platform-specific improvements:
All changes maintain test coverage while significantly improving test quality and reducing redundancy. Test suite now runs cleanly with focused, meaningful assertions. (c7b48b6) |
| & $ScriptBlock | ||
| } -ModuleName Ensure | ||
|
|
||
| $SecurePassword = ConvertTo-SecureString 'password123' -AsPlainText -Force |
Check failure
Code scanning / PSScriptAnalyzer
File 'Ensure.Tests.ps1' uses ConvertTo-SecureString with plaintext. This will expose secure information. Encrypted standard strings should be used instead. Error test
| Describe 'Export-Types Tests' { | ||
| Context 'Basic Functionality' { | ||
| BeforeEach { | ||
| $ModulePath = "$PSScriptRoot/../../../src/common/ModuleUtils.psm1" |
Check warning
Code scanning / PSScriptAnalyzer
The variable 'ModulePath' is assigned but never used. Warning test
| Context 'Basic Functionality' { | ||
| BeforeEach { | ||
| $ModulePath = "$PSScriptRoot/../../../src/common/ModuleUtils.psm1" | ||
| $TypeAcceleratorsClass = [PSObject].Assembly.GetType('System.Management.Automation.TypeAccelerators') |
Check warning
Code scanning / PSScriptAnalyzer
The variable 'TypeAcceleratorsClass' is assigned but never used. Warning test
| $ModulePath = "$PSScriptRoot/../../../src/common/ModuleUtils.psm1" | ||
| $TypeAcceleratorsClass = [PSObject].Assembly.GetType('System.Management.Automation.TypeAccelerators') | ||
| $namespace = 'TempExportTypes_' + ([Guid]::NewGuid().ToString().Replace('-', '')) | ||
| $TestModulePath = "TestDrive:\$namespace.psm1" |
Check warning
Code scanning / PSScriptAnalyzer
The variable 'TestModulePath' is assigned but never used. Warning test
| Mock Test-RegistryKey { $false } | ||
| Mock Remove-ItemProperty { } | ||
|
|
||
| $VerboseOutput = Remove-RegistryKey -Path 'HKLM:\Software\Test' -Key 'NonExistentKey' -Verbose 4>&1 |
Check warning
Code scanning / PSScriptAnalyzer
The variable 'VerboseOutput' is assigned but never used. Warning test
| Mock Test-RegistryKey { $true } | ||
| Mock Remove-ItemProperty { } | ||
|
|
||
| $VerboseOutput = Remove-RegistryKey -Path 'HKLM:\Software\Test' -Key 'TestKey' -Verbose 4>&1 |
Check warning
Code scanning / PSScriptAnalyzer
The variable 'VerboseOutput' is assigned but never used. Warning test
|
|
||
| Describe 'Get-NamedTempFolder Tests' { | ||
| BeforeAll { | ||
| $TestTempPath = [System.IO.Path]::GetTempPath() |
Check warning
Code scanning / PSScriptAnalyzer
The variable 'TestTempPath' is assigned but never used. Warning test
|
|
||
| # This test depends on how the function handles null from Get-LastSyncTime | ||
| # If it throws, we catch it; if it handles gracefully, we verify behavior | ||
| { $Result = Sync-Time } | Should -Not -Throw |
Check warning
Code scanning / PSScriptAnalyzer
The variable 'Result' is assigned but never used. Warning test
| It 'Should call Get-LastSyncTime to determine sync status' { | ||
| Mock Get-LastSyncTime { return (Get-Date).AddDays(-2) } -ModuleName Windows | ||
|
|
||
| $Result = Sync-Time |
Check warning
Code scanning / PSScriptAnalyzer
The variable 'Result' is assigned but never used. Warning test
This PR adds 254 comprehensive Pester tests across 5 previously untested PowerShell modules in
src/common, implementing a streamlined testing approach based on code review feedback.What's Changed
New Test Coverage Added
✅ Registry.psm1 - Windows registry operations with cross-platform compatibility
✅ UsersAndAccounts.psm1 - ADSI user and group management
✅ PackageManager.psm1 - Chocolatey package management integration
✅ Connection.psm1 - Microsoft services connection management (Graph, Exchange, IPPS)
✅ Ensure.psm1 - Module installation, administrator checks, and network setup
Test Quality Improvements
The test suite follows a focused, minimal approach that eliminates redundancy while maintaining comprehensive coverage:
-Skip:(-not $IsWindows)Architecture
Tests are designed with surgical precision:
Module Coverage Improvement
This approach significantly improves test coverage while establishing clean, maintainable testing patterns that focus on actual functionality rather than implementation details.
💬 Share your feedback on Copilot coding agent for the chance to win a $200 gift card! Click here to start the survey.