|
| 1 | +# PesterExplorer PowerShell Module |
| 2 | + |
| 3 | +PesterExplorer is a PowerShell 7+ module that provides a Terminal User Interface (TUI) to explore and navigate Pester test results using PwshSpectreConsole. |
| 4 | + |
| 5 | +Always reference these instructions first and fallback to search or bash commands only when you encounter unexpected information that does not match the info here. |
| 6 | + |
| 7 | +## Working Effectively |
| 8 | + |
| 9 | +### Prerequisites |
| 10 | +- Requires PowerShell 7.0 or later |
| 11 | +- Requires PwshSpectreConsole 2.3.0+ dependency for TUI functionality |
| 12 | +- Requires Pester 5.0.0+ for test result processing |
| 13 | +- Network access to PowerShell Gallery for dependency installation |
| 14 | + |
| 15 | +### Environment Setup |
| 16 | +**CRITICAL**: The build system requires PowerShell Gallery access. If PowerShell Gallery is not available, you must use an environment with internet access or pre-installed dependencies. |
| 17 | + |
| 18 | +#### Bootstrap Process (Network Required) |
| 19 | +```powershell |
| 20 | +# STEP 1: Ensure PowerShell Gallery is available |
| 21 | +Register-PSRepository -Default |
| 22 | +Get-PSRepository # Should show PSGallery |
| 23 | +
|
| 24 | +# STEP 2: Bootstrap dependencies |
| 25 | +.\build.ps1 -Task Init -Bootstrap |
| 26 | +``` |
| 27 | +**TIMING**: Bootstrap takes approximately 2-5 minutes depending on network speed. NEVER CANCEL - Set timeout to 10+ minutes. |
| 28 | + |
| 29 | +### Build and Test Process |
| 30 | + |
| 31 | +#### Build the Module |
| 32 | +```powershell |
| 33 | +# Run default build task (which runs Test) |
| 34 | +.\build.ps1 |
| 35 | +``` |
| 36 | +**TIMING**: Build + Test takes approximately 5-10 minutes. NEVER CANCEL - Set timeout to 15+ minutes. |
| 37 | + |
| 38 | +#### Available Build Tasks |
| 39 | +```powershell |
| 40 | +# List all available build tasks |
| 41 | +.\build.ps1 -Help |
| 42 | +``` |
| 43 | + |
| 44 | +#### Run Tests Only |
| 45 | +```powershell |
| 46 | +# Run Pester tests |
| 47 | +.\build.ps1 -Task Test |
| 48 | +``` |
| 49 | +**TIMING**: Test suite takes approximately 2-5 minutes. NEVER CANCEL - Set timeout to 10+ minutes. |
| 50 | + |
| 51 | +#### Code Analysis |
| 52 | +```powershell |
| 53 | +# Run PSScriptAnalyzer (works without dependencies) |
| 54 | +Invoke-ScriptAnalyzer -Path ./PesterExplorer/ -Recurse -Severity Warning,Error |
| 55 | +``` |
| 56 | +**TIMING**: Analysis takes approximately 3-5 seconds. |
| 57 | + |
| 58 | +#### Syntax Validation |
| 59 | +```powershell |
| 60 | +# Validate all PowerShell files for syntax errors (works offline) |
| 61 | +Get-ChildItem -Path . -Filter '*.ps1' -Recurse | ForEach-Object { |
| 62 | + try { |
| 63 | + $null = [System.Management.Automation.PSParser]::Tokenize((Get-Content $_.FullName -Raw), [ref]$null) |
| 64 | + Write-Host "✓ $($_.Name) - Syntax OK" |
| 65 | + } catch { |
| 66 | + Write-Host "✗ $($_.Name) - Syntax Error: $_" |
| 67 | + } |
| 68 | +} |
| 69 | +``` |
| 70 | +**TIMING**: Syntax validation takes approximately 1-2 seconds for all files. |
| 71 | + |
| 72 | +## Module Usage |
| 73 | + |
| 74 | +### Key Functions |
| 75 | +The module exports two main functions: |
| 76 | +- `Show-PesterResult` - Interactive TUI for exploring Pester results |
| 77 | +- `Show-PesterResultTree` - Tree view display of Pester results |
| 78 | + |
| 79 | +### Basic Usage Example |
| 80 | +```powershell |
| 81 | +# STEP 1: Import the module (requires dependencies installed) |
| 82 | +Import-Module ./PesterExplorer/PesterExplorer.psd1 |
| 83 | +
|
| 84 | +# STEP 2: Run Pester tests with PassThru to get result object |
| 85 | +$pesterResult = Invoke-Pester ./tests/ -PassThru |
| 86 | +
|
| 87 | +# STEP 3: Explore results interactively |
| 88 | +Show-PesterResult $pesterResult |
| 89 | +
|
| 90 | +# OR: View as tree structure |
| 91 | +Show-PesterResultTree $pesterResult |
| 92 | +``` |
| 93 | + |
| 94 | +### Required Test Data |
| 95 | +To test the module functionality, you need actual Pester test results: |
| 96 | +```powershell |
| 97 | +# Example: Create test results from the module's own test fixture (works without dependencies) |
| 98 | +$testResults = Invoke-Pester ./tests/fixtures/Example.ps1 -PassThru -Output None |
| 99 | +# This creates a Pester.Run object with 1 container, 4 tests (1 passed, 3 failed/skipped/inconclusive) |
| 100 | +``` |
| 101 | + |
| 102 | +**VALIDATION SCENARIO**: After making changes to the module, always test the complete user workflow: |
| 103 | +```powershell |
| 104 | +# STEP 1: Validate you can create test results |
| 105 | +$pesterResult = Invoke-Pester ./tests/fixtures/Example.ps1 -PassThru -Output None |
| 106 | +Write-Host "✓ Created Pester result: $($pesterResult.TotalCount) tests" |
| 107 | +
|
| 108 | +# STEP 2: Try to import module (will fail without dependencies but validates structure) |
| 109 | +try { |
| 110 | + Import-Module ./PesterExplorer/PesterExplorer.psd1 -Force |
| 111 | + Write-Host "✓ Module imported successfully" |
| 112 | + |
| 113 | + # STEP 3: Test main functions (requires PwshSpectreConsole) |
| 114 | + Show-PesterResult $pesterResult |
| 115 | + Write-Host "✓ Show-PesterResult executed successfully" |
| 116 | +} catch { |
| 117 | + Write-Host "⚠ Module functions require PwshSpectreConsole dependency: $_" |
| 118 | +} |
| 119 | +``` |
| 120 | + |
| 121 | +## Validation Requirements |
| 122 | + |
| 123 | +### Always Run These Validation Steps |
| 124 | +1. **Syntax Validation**: All PowerShell files must have valid syntax |
| 125 | + ```powershell |
| 126 | + # Validates all .ps1 files for syntax errors |
| 127 | + Get-ChildItem -Path . -Filter '*.ps1' -Recurse | ForEach-Object { |
| 128 | + [System.Management.Automation.PSParser]::Tokenize((Get-Content $_.FullName -Raw), [ref]$null) |
| 129 | + } |
| 130 | + ``` |
| 131 | + |
| 132 | +2. **Code Analysis**: Run PSScriptAnalyzer to check code quality |
| 133 | + ```powershell |
| 134 | + Invoke-ScriptAnalyzer -Path ./PesterExplorer/ -Recurse -Severity Warning,Error |
| 135 | + ``` |
| 136 | + |
| 137 | +3. **Module Structure**: Verify module structure is intact |
| 138 | + ```powershell |
| 139 | + # Check module manifest (will fail if dependencies not installed, but validates structure) |
| 140 | + try { |
| 141 | + Test-ModuleManifest ./PesterExplorer/PesterExplorer.psd1 |
| 142 | + Write-Host "✓ Module manifest is valid" |
| 143 | + } catch { |
| 144 | + Write-Host "⚠ Module manifest validation failed (expected if dependencies not installed): $_" |
| 145 | + } |
| 146 | + |
| 147 | + # Verify all functions are present |
| 148 | + Write-Host "Public functions:" |
| 149 | + Get-ChildItem ./PesterExplorer/Public/*.ps1 | ForEach-Object { Write-Host " - $($_.Name)" } |
| 150 | + Write-Host "Private functions:" |
| 151 | + Get-ChildItem ./PesterExplorer/Private/*.ps1 | ForEach-Object { Write-Host " - $($_.Name)" } |
| 152 | + ``` |
| 153 | + |
| 154 | +## Environment Limitations |
| 155 | + |
| 156 | +### Network Access Required For |
| 157 | +- Installing dependencies via PowerShell Gallery |
| 158 | +- Running the complete build process |
| 159 | +- Installing psake, PowerShellBuild, and other build tools |
| 160 | +- Installing PwshSpectreConsole dependency |
| 161 | + |
| 162 | +### What Works Without Network Access |
| 163 | +- Syntax validation of PowerShell files |
| 164 | +- PSScriptAnalyzer code analysis |
| 165 | +- Module structure verification |
| 166 | +- Direct PowerShell script testing (without dependencies) |
| 167 | + |
| 168 | +### Fallback Instructions When PSGallery Is Unavailable |
| 169 | +If you encounter PSGallery access issues: |
| 170 | + |
| 171 | +1. **Document the Limitation**: Note that build requires network access |
| 172 | +2. **Use Syntax Validation**: Verify code changes don't introduce syntax errors |
| 173 | +3. **Use PSScriptAnalyzer**: Ensure code quality standards are met |
| 174 | +4. **Manual Testing**: Test individual functions where possible |
| 175 | +5. **Environment Note**: Add note that full testing requires proper PowerShell Gallery access |
| 176 | + |
| 177 | +## Repository Structure |
| 178 | + |
| 179 | +``` |
| 180 | +/ |
| 181 | +├── .github/workflows/ # CI/CD workflows (uses shared workflows) |
| 182 | +├── PesterExplorer/ # Main module directory |
| 183 | +│ ├── PesterExplorer.psd1 # Module manifest |
| 184 | +│ ├── PesterExplorer.psm1 # Module script (dot-sources functions) |
| 185 | +│ ├── Public/ # Exported functions |
| 186 | +│ │ ├── Show-PesterResult.ps1 |
| 187 | +│ │ └── Show-PesterResultTree.ps1 |
| 188 | +│ └── Private/ # Internal helper functions |
| 189 | +├── tests/ # Pester test files |
| 190 | +│ ├── fixtures/ # Test data |
| 191 | +│ └── *.tests.ps1 # Test files |
| 192 | +├── docs/ # Documentation |
| 193 | +├── build.ps1 # Build script |
| 194 | +├── psakeFile.ps1 # Build configuration |
| 195 | +├── requirements.psd1 # Dependency definitions |
| 196 | +└── README.md # Project documentation |
| 197 | +``` |
| 198 | + |
| 199 | +## Common Tasks |
| 200 | + |
| 201 | +### Working with Tests |
| 202 | +- Test files are in `./tests/` directory |
| 203 | +- Test fixtures are in `./tests/fixtures/` |
| 204 | +- Tests require BuildHelpers environment variables to be set |
| 205 | +- Tests expect module to be built to `./Output/` directory structure |
| 206 | + |
| 207 | +### Making Changes |
| 208 | +1. **Always run syntax validation** after editing any .ps1 file |
| 209 | +2. **Always run PSScriptAnalyzer** before committing changes |
| 210 | +3. **Test module import** after significant changes (when dependencies available) |
| 211 | +4. **Update documentation** if changing public function interfaces |
| 212 | +5. **Update CHANGELOG.md** for any functional changes |
| 213 | + |
| 214 | +### Dependencies to Know About |
| 215 | +- **Pester** (5.0.0+): Testing framework and result object provider |
| 216 | +- **PwshSpectreConsole** (2.3.0+): TUI framework dependency (required for main functionality) |
| 217 | +- **PSScriptAnalyzer** (1.24.0+): Code quality analysis |
| 218 | +- **psake** (4.9.0): Build automation tool |
| 219 | +- **PowerShellBuild** (0.6.1+): PowerShell module build tasks |
| 220 | +- **BuildHelpers** (2.0.16+): Build environment helpers |
| 221 | + |
| 222 | +## Troubleshooting |
| 223 | + |
| 224 | +### "PSGallery repository not found" |
| 225 | +- This indicates network access issues or PowerShell Gallery not being registered |
| 226 | +- Try: `Register-PSRepository -Default` or `Register-PSResourceRepository -PSGallery -Trusted` |
| 227 | +- If it fails, document the network limitation and use offline validation methods |
| 228 | + |
| 229 | +### "Required module not loaded" |
| 230 | +- This occurs when trying to import the module without dependencies |
| 231 | +- Ensure PwshSpectreConsole is installed: `Install-Module PwshSpectreConsole -Scope CurrentUser` |
| 232 | +- Or use PSResourceGet: `Install-PSResource -Name PwshSpectreConsole -Repository PSGallery -Scope CurrentUser -TrustRepository` |
| 233 | + |
| 234 | +### Tests expect module in Output directory |
| 235 | +- The build process copies the module to `./Output/PesterExplorer/[version]/` |
| 236 | +- Tests look for the built module in this location |
| 237 | +- Without successful build, most tests will fail |
| 238 | + |
| 239 | +### Network Connectivity Issues |
| 240 | +If you encounter "Name or service not known" errors: |
| 241 | +- This indicates blocked access to PowerShell Gallery |
| 242 | +- Document this limitation in your changes |
| 243 | +- Use offline validation methods (syntax check, PSScriptAnalyzer) |
| 244 | +- Note that full functionality testing requires network access |
| 245 | + |
| 246 | +### Build Process Failures |
| 247 | +If bootstrap or build fails: |
| 248 | +- Check that PowerShell 7.0+ is available: `pwsh --version` |
| 249 | +- Verify PSGallery access: `Get-PSRepository` or `Get-PSResourceRepository` |
| 250 | +- Document timing: Bootstrap typically takes 2-5 minutes, builds take 5-10 minutes |
| 251 | +- **CRITICAL**: Never cancel long-running build operations |
| 252 | + |
| 253 | +## CI/CD Integration |
| 254 | + |
| 255 | +### GitHub Workflows |
| 256 | +- **CI.yaml**: Runs module CI checks (uses shared workflow) |
| 257 | +- **Publish.yaml**: Publishes to PowerShell Gallery (uses shared workflow) |
| 258 | +- **pages.yaml**: Publishes documentation to GitHub Pages |
| 259 | + |
| 260 | +### Shared Workflows |
| 261 | +The project uses shared workflows from `HeyItsGilbert/.github` repository, which handle the actual build and test logic. |
| 262 | + |
| 263 | +## Quick Reference |
| 264 | + |
| 265 | +### Essential Commands (Work Offline) |
| 266 | +```powershell |
| 267 | +# Validate all PowerShell syntax |
| 268 | +Get-ChildItem -Path . -Filter '*.ps1' -Recurse | ForEach-Object { |
| 269 | + [System.Management.Automation.PSParser]::Tokenize((Get-Content $_.FullName -Raw), [ref]$null) |
| 270 | +} |
| 271 | +
|
| 272 | +# Run code analysis |
| 273 | +Invoke-ScriptAnalyzer -Path ./PesterExplorer/ -Recurse -Severity Warning,Error |
| 274 | +
|
| 275 | +# Create test Pester result |
| 276 | +$pesterResult = Invoke-Pester ./tests/fixtures/Example.ps1 -PassThru -Output None |
| 277 | +
|
| 278 | +# Check module structure |
| 279 | +Get-ChildItem ./PesterExplorer/Public/*.ps1, ./PesterExplorer/Private/*.ps1 |
| 280 | +``` |
| 281 | + |
| 282 | +### Commands Requiring Network Access |
| 283 | +```powershell |
| 284 | +# Setup and bootstrap (2-5 minutes) |
| 285 | +Register-PSRepository -Default |
| 286 | +.\build.ps1 -Task Init -Bootstrap |
| 287 | +
|
| 288 | +# Build and test (5-10 minutes) |
| 289 | +.\build.ps1 |
| 290 | +
|
| 291 | +# Install dependencies manually |
| 292 | +Install-Module PwshSpectreConsole -Scope CurrentUser |
| 293 | +``` |
| 294 | + |
| 295 | +### File Locations |
| 296 | +- Main module: `./PesterExplorer/PesterExplorer.psd1` |
| 297 | +- Public functions: `./PesterExplorer/Public/` |
| 298 | +- Tests: `./tests/` |
| 299 | +- Build script: `./build.ps1` |
| 300 | +- Dependencies: `./requirements.psd1` |
0 commit comments