Skip to content

Commit ba5bfb0

Browse files
committed
feat(#259): update to Pester 6.0.0 and improve test assertions
- Added Get-NovaScaffoldModuleVersion function to retrieve module version. - Updated Pester version requirements in project files and README. - Refactored test assertions to use Should-Invoke for better clarity.
1 parent 9c5f31e commit ba5bfb0

71 files changed

Lines changed: 621 additions & 334 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

README.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -298,8 +298,8 @@ Notes:
298298
- if `project.json` sets `Pester.CodeCoverage.CoveragePercentTarget`, `Invoke-NovaTest` fails when the measured coverage percentage is lower than that configured target
299299
- this repository currently enables coverage with a `99` percent target; the template and packaged example
300300
`project.json` files ship the same JaCoCo configuration shape with `Enabled=false` and a `90` percent opt-in target
301-
- make sure `Pester 5.7.1` is available before running `Invoke-NovaTest` or `Test-NovaBuild`
302-
- the published `NovaModuleTools` manifest also declares `Pester 5.7.1`, so installed end-user workflows can still resolve that dependency automatically
301+
- make sure `Pester 6.0.0` or newer is available before running `Invoke-NovaTest` or `Test-NovaBuild`
302+
- the published `NovaModuleTools` manifest now declares `Pester 6.0.0`, so installed end-user workflows and repository validation align on the same supported dependency major version
303303

304304
### Create a package artifact
305305

@@ -640,7 +640,7 @@ Responsibilities currently covered by the release pipeline include:
640640
- publishing to PowerShell Gallery
641641
- preparing the next prerelease version on `develop`
642642

643-
The workflow now uses `KeepAChangelog` for changelog release moves, creates annotated git tags named directly from the release version, and bootstraps the local PSResourceGet repository store before calling `Publish-NovaModule`. The shared CI installer also installs `Pester 5.7.1` explicitly before it installs prerelease gallery modules so test workflows do not rely on transitive manifest dependency resolution.
643+
The workflow now uses `KeepAChangelog` for changelog release moves, creates annotated git tags named directly from the release version, and bootstraps the local PSResourceGet repository store before calling `Publish-NovaModule`. The shared CI installer also installs `Pester 6.0.0` explicitly before it installs prerelease gallery modules so test workflows do not rely on transitive manifest dependency resolution.
644644

645645
### Where NovaModuleTools cmdlets fit
646646

project.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
"RequiredModules": [
1515
{
1616
"ModuleName": "Pester",
17-
"ModuleVersion": "5.7.1"
17+
"ModuleVersion": "6.0.0"
1818
},
1919
{
2020
"ModuleName": "Microsoft.PowerShell.PlatyPS",

scripts/build/ci/Install-CiPowerShellModules.ps1

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ function Get-CiModuleInstallOption {
1515

1616
if ($Name -eq 'Pester') {
1717
return [pscustomobject]@{
18-
RequiredVersion = '5.7.1'
18+
RequiredVersion = '6.0.0'
1919
AllowPrerelease = $false
2020
}
2121
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
function Get-NovaPesterRuntimeMajorVersion {
2+
[CmdletBinding()]
3+
param()
4+
5+
$invokePesterCommand = Get-Command -Name Invoke-Pester -ErrorAction SilentlyContinue
6+
if ($null -ne $invokePesterCommand -and $null -ne $invokePesterCommand.Version) {
7+
return [int]$invokePesterCommand.Version.Major
8+
}
9+
10+
$pesterModule = Get-Module -Name Pester -ListAvailable |
11+
Sort-Object Version -Descending |
12+
Select-Object -First 1
13+
if ($null -eq $pesterModule) {
14+
return $null
15+
}
16+
17+
return [int]$pesterModule.Version.Major
18+
}

src/private/quality/GetNovaTestWorkflowContext.ps1

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ function Assert-NovaPesterAvailable {
1616
param()
1717

1818
if (-not (Get-Module -Name Pester -ListAvailable)) {
19-
Stop-NovaOperation -Message 'The module Pester must be installed to run Nova tests. Install Pester 5.7.1 and try again.' -ErrorId 'Nova.Dependency.PesterDependencyMissing' -Category ResourceUnavailable -TargetObject 'Pester'
19+
Stop-NovaOperation -Message 'The module Pester must be installed to run Nova tests. Install Pester 6.0.0 or newer and try again.' -ErrorId 'Nova.Dependency.PesterDependencyMissing' -Category ResourceUnavailable -TargetObject 'Pester'
2020
}
2121
}
2222

src/private/quality/InvokeNovaPester.ps1

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,3 +6,4 @@ function Invoke-NovaPester {
66

77
return Invoke-Pester -Configuration $Configuration
88
}
9+

src/private/quality/InvokeNovaTestWorkflow.ps1

Lines changed: 70 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,9 @@ function Invoke-NovaTestWorkflow {
99
$whatIfEnabled = Test-NovaWhatIfWorkflowContext -WorkflowContext $WorkflowContext
1010
$testResult = $null
1111
$shouldRunWorkflow = Test-NovaTestWorkflowShouldRun -WorkflowContext $WorkflowContext -BoundParameters $PSBoundParameters -ShouldRun:$ShouldRun
12+
$messageWriter = (Get-Command -Name Write-Message -CommandType Function -ErrorAction Stop).ScriptBlock
13+
$propertyReader = (Get-Command -Name Get-NovaPropertyValue -CommandType Function -ErrorAction Stop).ScriptBlock
14+
$coverageFormatter = (Get-Command -Name Format-NovaCoveragePercentValue -CommandType Function -ErrorAction Stop).ScriptBlock
1215

1316
try {
1417
Invoke-NovaTestWorkflowBuildStep -WorkflowContext $WorkflowContext -Activity $progressActivity -WhatIfEnabled:$whatIfEnabled
@@ -28,7 +31,47 @@ function Invoke-NovaTestWorkflow {
2831
Write-Progress -Activity $progressActivity -Completed
2932
}
3033

31-
Write-NovaTestWorkflowResult -WorkflowContext $WorkflowContext -TestResult $testResult
34+
& $messageWriter "Pester tests passed for $( $WorkflowContext.ProjectInfo.ProjectName )" -color Green
35+
& $messageWriter "Results file: $( $WorkflowContext.TestResultPath )"
36+
37+
$pesterSettings = & $propertyReader -InputObject $WorkflowContext -Name 'PesterSettings'
38+
if ($null -eq $pesterSettings) {
39+
$projectInfo = & $propertyReader -InputObject $WorkflowContext -Name 'ProjectInfo'
40+
$pesterSettings = & $propertyReader -InputObject $projectInfo -Name 'Pester'
41+
}
42+
43+
$coveragePercentTarget = $null
44+
$codeCoverageSettings = & $propertyReader -InputObject $pesterSettings -Name 'CodeCoverage'
45+
if ($true -eq [bool](& $propertyReader -InputObject $codeCoverageSettings -Name 'Enabled')) {
46+
$configuredCoveragePercentTarget = & $propertyReader -InputObject $codeCoverageSettings -Name 'CoveragePercentTarget'
47+
if ($null -ne $configuredCoveragePercentTarget -and -not [string]::IsNullOrWhiteSpace([string]$configuredCoveragePercentTarget)) {
48+
$coveragePercentTarget = [double]$configuredCoveragePercentTarget
49+
}
50+
}
51+
52+
$coverageMessage = $null
53+
$codeCoverage = & $propertyReader -InputObject $testResult -Name 'CodeCoverage'
54+
$coveragePercent = & $propertyReader -InputObject $codeCoverage -Name 'CoveragePercent'
55+
if ($null -ne $coveragePercent -and -not [string]::IsNullOrWhiteSpace([string]$coveragePercent)) {
56+
$formattedCoverage = & $coverageFormatter -Value ([double]$coveragePercent)
57+
if ($null -eq $coveragePercentTarget) {
58+
$coverageMessage = "Measured code coverage: $formattedCoverage%"
59+
} else {
60+
$formattedTarget = & $coverageFormatter -Value $coveragePercentTarget
61+
$coverageMessage = "Measured code coverage: $formattedCoverage% (target: $formattedTarget%)"
62+
}
63+
}
64+
65+
if (-not [string]::IsNullOrWhiteSpace($coverageMessage)) {
66+
& $messageWriter $coverageMessage
67+
}
68+
69+
foreach ($line in @(
70+
'Next step:'
71+
'Publish-NovaModule -Local'
72+
)) {
73+
& $messageWriter $line
74+
}
3275
}
3376

3477
function Invoke-NovaTestWorkflowBuildStep {
@@ -93,28 +136,46 @@ function Invoke-NovaTestWorkflowExecution {
93136

94137
$WorkflowContext.PesterConfig.TestResult.OutputPath = $WorkflowContext.TestResultPath
95138
$coverageTargetAssertion = Get-NovaCoverageTargetAssertionScriptBlock -WorkflowContext $WorkflowContext
96-
$testProgressContext = [pscustomobject]@{
97-
Activity = $Activity
98-
StartPercentComplete = 70
99-
EndPercentComplete = 94
100-
}
101-
$testResult = Invoke-NovaPesterWithSuppressedProgress -Configuration $WorkflowContext.PesterConfig -ProgressContext $testProgressContext
139+
$testResult = Get-NovaTestWorkflowPesterResult -WorkflowContext $WorkflowContext -Activity $Activity
102140

103-
Invoke-NovaTestWorkflowStep -Activity $Activity -Status 'Writing the test result report' -PercentComplete 96 -Action {
141+
Write-Progress -Activity $Activity -Status 'Writing the test result report' -PercentComplete 96
142+
& {
104143
& $WorkflowContext.TestResultArtifactWriter.ScriptBlock -TestResult $testResult -OutputPath $WorkflowContext.TestResultPath -ReportWriter $WorkflowContext.TestResultReportWriter.ScriptBlock
105144
}
106145

107146
if ($testResult.Result -ne 'Passed') {
108147
Stop-NovaOperation -Message (Get-NovaTestWorkflowFailureMessage -WorkflowContext $WorkflowContext) -ErrorId 'Nova.Workflow.TestRunFailed' -Category InvalidOperation -TargetObject $WorkflowContext.TestResultPath
109148
}
110149

111-
Invoke-NovaTestWorkflowStep -Activity $Activity -Status 'Checking the configured code coverage target' -PercentComplete 99 -Action {
150+
Write-Progress -Activity $Activity -Status 'Checking the configured code coverage target' -PercentComplete 99
151+
& {
112152
& $coverageTargetAssertion -WorkflowContext $WorkflowContext -TestResult $testResult
113153
}
114154

115155
return $testResult
116156
}
117157

158+
function Get-NovaTestWorkflowPesterResult {
159+
[CmdletBinding()]
160+
param(
161+
[Parameter(Mandatory)][pscustomobject]$WorkflowContext,
162+
[Parameter(Mandatory)][string]$Activity
163+
)
164+
165+
if ((Get-NovaPesterRuntimeMajorVersion) -ge 6) {
166+
return Invoke-NovaTestWorkflowStep -Activity $Activity -Status 'Running Pester tests' -PercentComplete 70 -Action {
167+
Invoke-NovaPester -Configuration $WorkflowContext.PesterConfig
168+
}
169+
}
170+
171+
$testProgressContext = [pscustomobject]@{
172+
Activity = $Activity
173+
StartPercentComplete = 70
174+
EndPercentComplete = 94
175+
}
176+
return Invoke-NovaPesterWithSuppressedProgress -Configuration $WorkflowContext.PesterConfig -ProgressContext $testProgressContext
177+
}
178+
118179
function Invoke-NovaTestWorkflowStep {
119180
[CmdletBinding()]
120181
param(
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
function Get-NovaScaffoldModuleVersion {
2+
[CmdletBinding()]
3+
param()
4+
5+
$module = $ExecutionContext.SessionState.Module
6+
if ($null -eq $module) {
7+
return $null
8+
}
9+
10+
return $module.Version
11+
}
12+

src/private/scaffold/WriteNovaModuleProjectJson.ps1

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ function Write-NovaModuleProjectJson {
1818
$jsonData.Manifest.GUID = (New-Guid).GUID
1919
}
2020

21-
$moduleVersion = $ExecutionContext.SessionState.Module.Version
21+
$moduleVersion = Get-NovaScaffoldModuleVersion
2222
if ($null -ne $moduleVersion) {
2323
$majorVersion = $moduleVersion.Major
2424
$jsonData['$schema'] = "https://www.novamoduletools.com/schema/v$majorVersion/project.json"

src/private/scaffold/WriteNovaVsCodeSettings.ps1

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ function Write-NovaVsCodeSettings {
55
[Parameter(Mandatory)][string]$ProjectRoot
66
)
77

8-
$moduleVersion = $ExecutionContext.SessionState.Module.Version
8+
$moduleVersion = Get-NovaScaffoldModuleVersion
99
if ($null -eq $moduleVersion) { return }
1010

1111
$schemaUrl = "https://www.novamoduletools.com/schema/v$($moduleVersion.Major)/project.json"

0 commit comments

Comments
 (0)