@@ -308,6 +308,21 @@ Describe 'Update notification behavior' {
308308 }
309309 }
310310
311+ It ' Complete-NovaModuleSelfUpdateResult overwrites an existing release-notes property in place' {
312+ InModuleScope $script :moduleName {
313+ $plan = [pscustomobject ]@ {
314+ ModuleName = ' NovaModuleTools'
315+ UpdateAvailable = $true
316+ ReleaseNotesUri = ' https://old.example/release-notes'
317+ }
318+
319+ $result = Complete-NovaModuleSelfUpdateResult - Plan $plan - ReleaseNotesUri ' https://www.novamoduletools.com/release-notes.html'
320+
321+ $result.ReleaseNotesUri | Should - Be ' https://www.novamoduletools.com/release-notes.html'
322+ @ ($result.PSObject.Properties.Name | Where-Object {$_ -eq ' ReleaseNotesUri' }).Count | Should - Be 1
323+ }
324+ }
325+
311326 It ' Update-NovaModuleTool delegates workflow context resolution and execution to private helpers' {
312327 InModuleScope $script :moduleName {
313328 Mock Get-NovaModuleSelfUpdateWorkflowContext {
@@ -348,6 +363,38 @@ Describe 'Update notification behavior' {
348363 }
349364 }
350365
366+ It ' Update-NovaModuleTool returns the unchanged plan and skips update execution when WhatIf declines the update action' {
367+ InModuleScope $script :moduleName {
368+ Mock Get-NovaModuleSelfUpdateWorkflowContext {
369+ [pscustomobject ]@ {
370+ Plan = [pscustomobject ]@ {
371+ ModuleName = ' NovaModuleTools'
372+ CurrentVersion = ' 1.0.0'
373+ TargetVersion = ' 1.1.0'
374+ PrereleaseNotificationsEnabled = $true
375+ UpdateAvailable = $true
376+ Updated = $false
377+ Cancelled = $false
378+ IsPrereleaseTarget = $false
379+ UsedAllowPrerelease = $false
380+ }
381+ Action = ' Update NovaModuleTools to version 1.1.0'
382+ }
383+ }
384+ Mock Invoke-NovaModuleSelfUpdateWorkflow {throw ' should not update during WhatIf' }
385+ Mock Write-NovaModuleReleaseNotesLink {throw ' should not write release notes during WhatIf' }
386+
387+ $result = Update-NovaModuleTool - WhatIf
388+
389+ $result.UpdateAvailable | Should - BeTrue
390+ $result.Updated | Should - BeFalse
391+ $result.ReleaseNotesUri | Should - BeNullOrEmpty
392+ Assert-MockCalled Get-NovaModuleSelfUpdateWorkflowContext - Times 1
393+ Assert-MockCalled Invoke-NovaModuleSelfUpdateWorkflow - Times 0
394+ Assert-MockCalled Write-NovaModuleReleaseNotesLink - Times 0
395+ }
396+ }
397+
351398 It ' Get-NovaUpdateNotificationPreference defaults prerelease notifications to enabled when no settings file exists' {
352399 $configRoot = Join-Path $TestDrive ' config-default'
353400 $originalConfigHome = $env: XDG_CONFIG_HOME
@@ -625,6 +672,17 @@ throw 'offline'
625672 }
626673 }
627674
675+ It ' Get-NovaModuleReleaseNotesMessage resolves the URI from the module parameter set' {
676+ InModuleScope $script :moduleName {
677+ Mock Get-NovaModuleReleaseNotesUri {' https://www.novamoduletools.com/release-notes.html' }
678+
679+ $message = Get-NovaModuleReleaseNotesMessage - Module ([pscustomobject ]@ {Name = ' NovaModuleTools' })
680+
681+ $message | Should - Be ' Release notes: https://www.novamoduletools.com/release-notes.html'
682+ Assert-MockCalled Get-NovaModuleReleaseNotesUri - Times 1
683+ }
684+ }
685+
628686 It ' Update-NovaModuleTool applies a stable update without prerelease confirmation' {
629687 $result = Invoke-TestNovaSelfUpdate - Options ([pscustomobject ]@ {
630688 PrereleaseNotificationsEnabled = $true
0 commit comments