mirror of
https://github.com/NexusOne23/noid-privacy.git
synced 2026-02-07 12:11:53 +01:00
159 lines
4.9 KiB
PowerShell
159 lines
4.9 KiB
PowerShell
<#
|
|
.SYNOPSIS
|
|
Run all Pester tests for NoID Privacy
|
|
|
|
.DESCRIPTION
|
|
Executes Pester v5 tests with proper configuration.
|
|
Generates test results and code coverage reports.
|
|
|
|
.PARAMETER TestType
|
|
Type of tests to run (Unit, Integration, Validation, All)
|
|
|
|
.PARAMETER OutputFormat
|
|
Output format for test results (NUnitXml, JUnitXml, None)
|
|
|
|
.PARAMETER CodeCoverage
|
|
Enable code coverage analysis
|
|
|
|
.NOTES
|
|
Author: NexusOne23
|
|
Version: 2.2.0
|
|
Requires: PowerShell 5.1+, Pester 5.0+
|
|
|
|
.EXAMPLE
|
|
.\Run-Tests.ps1
|
|
Run all tests with default settings
|
|
|
|
.EXAMPLE
|
|
.\Run-Tests.ps1 -TestType Unit -CodeCoverage
|
|
Run only unit tests with code coverage
|
|
#>
|
|
|
|
[CmdletBinding()]
|
|
param(
|
|
[Parameter(Mandatory = $false)]
|
|
[ValidateSet("Unit", "Integration", "Validation", "All")]
|
|
[string]$TestType = "All",
|
|
|
|
[Parameter(Mandatory = $false)]
|
|
[ValidateSet("NUnitXml", "JUnitXml", "None")]
|
|
[string]$OutputFormat = "NUnitXml",
|
|
|
|
[Parameter(Mandatory = $false)]
|
|
[switch]$CodeCoverage
|
|
)
|
|
|
|
# Check Pester availability
|
|
$pesterModule = Get-Module -Name Pester -ListAvailable | Sort-Object Version -Descending | Select-Object -First 1
|
|
|
|
if ($null -eq $pesterModule -or $pesterModule.Version -lt [Version]"5.0.0") {
|
|
Write-Host "ERROR: Pester v5.0+ required. Run Setup-TestEnvironment.ps1 first." -ForegroundColor Red
|
|
exit 1
|
|
}
|
|
|
|
# Import Pester
|
|
Import-Module Pester -MinimumVersion 5.0.0
|
|
|
|
Write-Host "NoID Privacy - Test Runner" -ForegroundColor Cyan
|
|
Write-Host "==============================" -ForegroundColor Cyan
|
|
Write-Host "Pester Version: $($pesterModule.Version)" -ForegroundColor Gray
|
|
Write-Host ""
|
|
|
|
# Determine test paths
|
|
$testRoot = $PSScriptRoot
|
|
$testPaths = @()
|
|
|
|
switch ($TestType) {
|
|
"Unit" { $testPaths += Join-Path $testRoot "Unit" }
|
|
"Integration" { $testPaths += Join-Path $testRoot "Integration" }
|
|
"Validation" { $testPaths += Join-Path $testRoot "Validation" }
|
|
"All" {
|
|
$testPaths += Join-Path $testRoot "Unit"
|
|
$testPaths += Join-Path $testRoot "Integration"
|
|
$testPaths += Join-Path $testRoot "Validation"
|
|
}
|
|
}
|
|
|
|
# Filter out non-existent paths
|
|
$testPaths = $testPaths | Where-Object { Test-Path $_ }
|
|
|
|
if ($testPaths.Count -eq 0) {
|
|
Write-Host "WARNING: No test files found in: $TestType" -ForegroundColor Yellow
|
|
Write-Host "Create test files in Tests/$TestType/*.Tests.ps1" -ForegroundColor Yellow
|
|
exit 0
|
|
}
|
|
|
|
# Prepare output directory
|
|
$resultsPath = Join-Path $testRoot "Results"
|
|
if (-not (Test-Path $resultsPath)) {
|
|
New-Item -ItemType Directory -Path $resultsPath -Force | Out-Null
|
|
}
|
|
|
|
$timestamp = Get-Date -Format "yyyyMMdd_HHmmss"
|
|
$resultFile = Join-Path $resultsPath "TestResults_$timestamp.xml"
|
|
|
|
# Configure Pester
|
|
$pesterConfig = New-PesterConfiguration
|
|
|
|
# Set test paths
|
|
$pesterConfig.Run.Path = $testPaths
|
|
|
|
# Output configuration
|
|
if ($OutputFormat -ne "None") {
|
|
$pesterConfig.TestResult.Enabled = $true
|
|
$pesterConfig.TestResult.OutputFormat = $OutputFormat
|
|
$pesterConfig.TestResult.OutputPath = $resultFile
|
|
}
|
|
|
|
# Code coverage configuration
|
|
if ($CodeCoverage) {
|
|
$pesterConfig.CodeCoverage.Enabled = $true
|
|
$pesterConfig.CodeCoverage.Path = @(
|
|
(Join-Path (Split-Path $testRoot -Parent) "Core\*.ps1"),
|
|
(Join-Path (Split-Path $testRoot -Parent) "Utils\*.ps1"),
|
|
(Join-Path (Split-Path $testRoot -Parent) "Modules\*\*.ps1")
|
|
)
|
|
$pesterConfig.CodeCoverage.OutputPath = Join-Path $resultsPath "CodeCoverage_$timestamp.xml"
|
|
}
|
|
|
|
# Output configuration
|
|
$pesterConfig.Output.Verbosity = "Detailed"
|
|
|
|
# Run tests
|
|
Write-Host "Running $TestType tests..." -ForegroundColor Yellow
|
|
Write-Host ""
|
|
|
|
$testResults = Invoke-Pester -Configuration $pesterConfig
|
|
|
|
# Display summary
|
|
Write-Host ""
|
|
Write-Host "==============================" -ForegroundColor Cyan
|
|
Write-Host "Test Summary" -ForegroundColor Cyan
|
|
Write-Host "==============================" -ForegroundColor Cyan
|
|
Write-Host "Total Tests: $($testResults.TotalCount)" -ForegroundColor White
|
|
Write-Host "Passed: $($testResults.PassedCount)" -ForegroundColor Green
|
|
Write-Host "Failed: $($testResults.FailedCount)" -ForegroundColor $(if ($testResults.FailedCount -gt 0) { "Red" } else { "White" })
|
|
Write-Host "Skipped: $($testResults.SkippedCount)" -ForegroundColor Yellow
|
|
Write-Host "Duration: $($testResults.Duration)" -ForegroundColor White
|
|
|
|
if ($OutputFormat -ne "None") {
|
|
Write-Host ""
|
|
Write-Host "Results saved to: $resultFile" -ForegroundColor Cyan
|
|
}
|
|
|
|
if ($CodeCoverage) {
|
|
Write-Host ""
|
|
Write-Host "Code Coverage:" -ForegroundColor Cyan
|
|
Write-Host " Analyzed: $($testResults.CodeCoverage.AnalyzedFiles.Count) files" -ForegroundColor White
|
|
Write-Host " Coverage: $([math]::Round($testResults.CodeCoverage.CoveragePercent, 2))%" -ForegroundColor $(if ($testResults.CodeCoverage.CoveragePercent -ge 80) { "Green" } else { "Yellow" })
|
|
}
|
|
|
|
Write-Host ""
|
|
|
|
# Exit code based on test results
|
|
if ($testResults.FailedCount -gt 0) {
|
|
exit 1
|
|
}
|
|
else {
|
|
exit 0
|
|
}
|