From 64eb4ada347f2c254c5b6ae8788b0ef488967cfb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ra=C3=BAl=20=28Dibildos=29=20Gonz=C3=A1lez?= Date: Tue, 20 Jan 2026 12:09:17 +0100 Subject: [PATCH 1/6] feat(test): implement Test-TestingHelperResults function for enhanced test result validation --- .github/workflows/test_with_TestingHelper.yml | 4 +-- test.ps1 | 25 +++++++++++++++++++ 2 files changed, 26 insertions(+), 3 deletions(-) diff --git a/.github/workflows/test_with_TestingHelper.yml b/.github/workflows/test_with_TestingHelper.yml index 30bda51..f060b17 100644 --- a/.github/workflows/test_with_TestingHelper.yml +++ b/.github/workflows/test_with_TestingHelper.yml @@ -35,9 +35,7 @@ jobs: $result = ./test.ps1 -ShowTestErrors $result - # Allow Not Implemented and Skipped tests to pass - $passed = $result.Tests -eq $result.Pass + $result.NotImplemented + $result.Skipped - # $passed = $result.Tests -eq $result.Pass + $passed = Test-TestingHelperResults -Results $result if($passed) { "All test passed" | Write-Verbose -verbose ; exit 0 } diff --git a/test.ps1 b/test.ps1 index f52014c..bb36271 100644 --- a/test.ps1 +++ b/test.ps1 @@ -108,6 +108,31 @@ function Import-RequiredModule{ } } +function Test-TestingHelperResults{ + [CmdletBinding()] + param( + [Parameter(ValueFromPipeline)][object]$result, + [Parameter()][switch]$SkippedNotAllowed, + [Parameter()][switch]$NotImplementedNotAllowed + ) + + # Chek results from last run + $result = $result ?? $Global:ResultTestingHelper + + if($SkippedNotAllowed -and $result.Skipped -gt 0){ + return $false + } + + if($NotImplementedNotAllowed -and $result.NotImplemented -gt 0){ + return $false + } + + # Allow Not Implemented and Skipped tests to pass + $passed = $result.Tests -eq $result.Pass + $result.NotImplemented + $result.Skipped + + return $passed +} + <# . SYNOPSIS Extracts the required modules from the module manifest From 8a65b2d0c28f4b25a1c09a97050ec2944e5b8790 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ra=C3=BAl=20=28Dibildos=29=20Gonz=C3=A1lez?= Date: Tue, 20 Jan 2026 12:33:41 +0100 Subject: [PATCH 2/6] feat(test): add tools/Test_Helper and update test WF to use it --- .github/workflows/test_with_TestingHelper.yml | 7 +- tools/Test_Helper/Test_Helper.psd1 | 132 ++++++++++++++++++ tools/Test_Helper/Test_Helper.psm1 | 27 ++++ tools/Test_Helper/public/testResults.ps1 | 24 ++++ 4 files changed, 188 insertions(+), 2 deletions(-) create mode 100644 tools/Test_Helper/Test_Helper.psd1 create mode 100644 tools/Test_Helper/Test_Helper.psm1 create mode 100644 tools/Test_Helper/public/testResults.ps1 diff --git a/.github/workflows/test_with_TestingHelper.yml b/.github/workflows/test_with_TestingHelper.yml index f060b17..7163d24 100644 --- a/.github/workflows/test_with_TestingHelper.yml +++ b/.github/workflows/test_with_TestingHelper.yml @@ -33,9 +33,12 @@ jobs: shell: pwsh run: | $result = ./test.ps1 -ShowTestErrors - $result + + Write-Output $result - $passed = Test-TestingHelperResults -Results $result + import-module ./tools/Test_Helper/ + + $passed = Test-Result -Result $result if($passed) { "All test passed" | Write-Verbose -verbose ; exit 0 } diff --git a/tools/Test_Helper/Test_Helper.psd1 b/tools/Test_Helper/Test_Helper.psd1 new file mode 100644 index 0000000..0ffc471 --- /dev/null +++ b/tools/Test_Helper/Test_Helper.psd1 @@ -0,0 +1,132 @@ +# +# Module manifest for module 'Test_Helper' +# +# Generated by: rulasg +# +# Generated on: 20/1/2026 +# + +@{ + +# Script module or binary module file associated with this manifest. +RootModule = 'Test_Helper.psm1' + +# Version number of this module. +ModuleVersion = '0.0.1' + +# Supported PSEditions +# CompatiblePSEditions = @() + +# ID used to uniquely identify this module +GUID = '0be904b3-72c4-4e02-882a-153fa558e074' + +# Author of this module +Author = 'rulasg' + +# Company or vendor of this module +CompanyName = 'Unknown' + +# Copyright statement for this module +Copyright = '(c) rulasg. All rights reserved.' + +# Description of the functionality provided by this module +# Description = '' + +# Minimum version of the PowerShell engine required by this module +# PowerShellVersion = '' + +# Name of the PowerShell host required by this module +# PowerShellHostName = '' + +# Minimum version of the PowerShell host required by this module +# PowerShellHostVersion = '' + +# Minimum version of Microsoft .NET Framework required by this module. This prerequisite is valid for the PowerShell Desktop edition only. +# DotNetFrameworkVersion = '' + +# Minimum version of the common language runtime (CLR) required by this module. This prerequisite is valid for the PowerShell Desktop edition only. +# ClrVersion = '' + +# Processor architecture (None, X86, Amd64) required by this module +# ProcessorArchitecture = '' + +# Modules that must be imported into the global environment prior to importing this module +# RequiredModules = @() + +# Assemblies that must be loaded prior to importing this module +# RequiredAssemblies = @() + +# Script files (.ps1) that are run in the caller's environment prior to importing this module. +# ScriptsToProcess = @() + +# Type files (.ps1xml) to be loaded when importing this module +# TypesToProcess = @() + +# Format files (.ps1xml) to be loaded when importing this module +# FormatsToProcess = @() + +# Modules to import as nested modules of the module specified in RootModule/ModuleToProcess +# NestedModules = @() + +# Functions to export from this module, for best performance, do not use wildcards and do not delete the entry, use an empty array if there are no functions to export. +FunctionsToExport = '*' + +# Cmdlets to export from this module, for best performance, do not use wildcards and do not delete the entry, use an empty array if there are no cmdlets to export. +CmdletsToExport = '*' + +# Variables to export from this module +VariablesToExport = '*' + +# Aliases to export from this module, for best performance, do not use wildcards and do not delete the entry, use an empty array if there are no aliases to export. +AliasesToExport = '*' + +# DSC resources to export from this module +# DscResourcesToExport = @() + +# List of all modules packaged with this module +# ModuleList = @() + +# List of all files packaged with this module +# FileList = @() + +# Private data to pass to the module specified in RootModule/ModuleToProcess. This may also contain a PSData hashtable with additional module metadata used by PowerShell. +PrivateData = @{ + + PSData = @{ + + # Tags applied to this module. These help with module discovery in online galleries. + # Tags = @() + + # A URL to the license for this module. + # LicenseUri = '' + + # A URL to the main website for this project. + # ProjectUri = '' + + # A URL to an icon representing this module. + # IconUri = '' + + # ReleaseNotes of this module + # ReleaseNotes = '' + + # Prerelease string of this module + Prerelease = 'dev' + + # Flag to indicate whether the module requires explicit user acceptance for install/update/save + # RequireLicenseAcceptance = $false + + # External dependent modules of this module + # ExternalModuleDependencies = @() + + } # End of PSData hashtable + +} # End of PrivateData hashtable + +# HelpInfo URI of this module +# HelpInfoURI = '' + +# Default prefix for commands exported from this module. Override the default prefix using Import-Module -Prefix. +# DefaultCommandPrefix = '' + +} + diff --git a/tools/Test_Helper/Test_Helper.psm1 b/tools/Test_Helper/Test_Helper.psm1 new file mode 100644 index 0000000..026beb2 --- /dev/null +++ b/tools/Test_Helper/Test_Helper.psm1 @@ -0,0 +1,27 @@ +Write-Information -Message ("Loading {0} ..." -f ($PSCommandPath | Split-Path -LeafBase)) -InformationAction continue + +#Module path is where resides the RootModule file. This file. :) +$MODULE_PATH = $PSScriptRoot + +#Get public and private function definition files. +$Public = @( Get-ChildItem -Path $MODULE_PATH\public\*.ps1 -ErrorAction SilentlyContinue ) +$Private = @( Get-ChildItem -Path $MODULE_PATH\private\*.ps1 -ErrorAction SilentlyContinue ) + +#Dot source the files +Foreach($import in @($Public + $Private)) +{ + Try + { + . $import.fullname + } + Catch + { + Write-Error -Message "Failed to import function $($import.fullname): $_" + } +} + +# Here I might... +# Read in or create an initial config file and variable +# Export Public functions ($Public.BaseName) for WIP modules +# Set variables visible to the module and its functions only + diff --git a/tools/Test_Helper/public/testResults.ps1 b/tools/Test_Helper/public/testResults.ps1 new file mode 100644 index 0000000..7188f51 --- /dev/null +++ b/tools/Test_Helper/public/testResults.ps1 @@ -0,0 +1,24 @@ +function Test-Result{ + [CmdletBinding()] + param( + [Parameter(ValueFromPipeline)][object]$Result, + [Parameter()][switch]$SkippedNotAllowed, + [Parameter()][switch]$NotImplementedNotAllowed + ) + + # Chek results from last run + $Result = $Result ?? $Global:ResultTestingHelper + + if($SkippedNotAllowed -and $Result.Skipped -gt 0){ + return $false + } + + if($NotImplementedNotAllowed -and $Result.NotImplemented -gt 0){ + return $false + } + + # Allow Not Implemented and Skipped tests to pass + $passed = $Result.Tests -eq $Result.Pass + $Result.NotImplemented + $Result.Skipped + + return $passed +} Export-ModuleMember -Function Test-Result From 1585360117c69dea739818a3d2eb8c942219d130 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ra=C3=BAl=20=28Dibildos=29=20Gonz=C3=A1lez?= Date: Tue, 20 Jan 2026 12:57:37 +0100 Subject: [PATCH 3/6] refactor(test): move TestName functions to Test_Helper module --- test.ps1 | 38 --------------------------- tools/Test_Helper/public/testname.ps1 | 37 ++++++++++++++++++++++++++ 2 files changed, 37 insertions(+), 38 deletions(-) create mode 100644 tools/Test_Helper/public/testname.ps1 diff --git a/test.ps1 b/test.ps1 index bb36271..05ea1d2 100644 --- a/test.ps1 +++ b/test.ps1 @@ -18,44 +18,6 @@ param ( [Parameter()][string]$TestName ) -function Set-TestName{ - [CmdletBinding()] - [Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSAvoidGlobalVars', '', Scope='Function')] - [Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSUseDeclaredVarsMoreThanAssignments', '', Scope='Function')] - [Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSUseShouldProcessForStateChangingFunctions', '', Scope='Function')] - [Alias("st")] - param ( - [Parameter(Position=0,ValueFromPipeline)][string]$TestName - ) - - process{ - $global:TestNameVar = $TestName - } -} - -function Get-TestName{ - [CmdletBinding()] - [Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSAvoidGlobalVars', '', Scope='Function')] - [Alias("gt")] - param ( - ) - - process{ - $global:TestNameVar - } -} - -function Clear-TestName{ - [CmdletBinding()] - [Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSAvoidGlobalVars', '', Scope='Function')] - [Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSUseDeclaredVarsMoreThanAssignments', '', Scope='Function')] - [Alias("ct")] - param ( - ) - - $global:TestNameVar = $null -} - function Import-RequiredModule{ [CmdletBinding()] [Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSAvoidUsingWriteHost', '', Scope='Function')] diff --git a/tools/Test_Helper/public/testname.ps1 b/tools/Test_Helper/public/testname.ps1 new file mode 100644 index 0000000..0a8ca0b --- /dev/null +++ b/tools/Test_Helper/public/testname.ps1 @@ -0,0 +1,37 @@ +function Set-TestName{ + [CmdletBinding()] + [Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSAvoidGlobalVars', '', Scope='Function')] + [Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSUseDeclaredVarsMoreThanAssignments', '', Scope='Function')] + [Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSUseShouldProcessForStateChangingFunctions', '', Scope='Function')] + [Alias("st")] + param ( + [Parameter(Position=0,ValueFromPipeline)][string]$TestName + ) + + process{ + $global:TestNameVar = $TestName + } +} Export-ModuleMember -Function Set-TestName -Alias st + +function Get-TestName{ + [CmdletBinding()] + [Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSAvoidGlobalVars', '', Scope='Function')] + [Alias("gt")] + param ( + ) + + process{ + $global:TestNameVar + } +} Export-ModuleMember -Function Get-TestName -Alias gt + +function Clear-TestName{ + [CmdletBinding()] + [Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSAvoidGlobalVars', '', Scope='Function')] + [Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSUseDeclaredVarsMoreThanAssignments', '', Scope='Function')] + [Alias("ct")] + param ( + ) + + $global:TestNameVar = $null +} Export-ModuleMember -Function Clear-TestName -Alias ct \ No newline at end of file From 9a86e352929538879bcd9651000c1316f720f5d1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ra=C3=BAl=20=28Dibildos=29=20Gonz=C3=A1lez?= Date: Tue, 20 Jan 2026 12:57:52 +0100 Subject: [PATCH 4/6] fix(test): update query dates in mockfiles and traceInvoke logs for accurate data retrieval --- Test/mockfiles.log | 6 +++++- Test/traceInvoke.log | 3 ++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/Test/mockfiles.log b/Test/mockfiles.log index e3acaf2..ad9c44b 100644 --- a/Test/mockfiles.log +++ b/Test/mockfiles.log @@ -205,6 +205,10 @@ }, { "FileName": "invoke-GitHubOrgProjectWithFields-octodemo-700-query-field-text.json", - "Command": "Invoke-GitHubOrgProjectWithFields -Owner octodemo -ProjectNumber 700 -afterFields \"\" -afterItems \"\" -query \"updated:<2025-03-15\"" + "Command": "Invoke-GitHubOrgProjectWithFields -Owner octodemo -ProjectNumber 700 -afterFields \"\" -afterItems \"\" -query \"updated:>=2024-02-18\"" + }, + { + "FileName": "invoke-GitHubOrgProjectWithFields-octodemo-700-query-field-text.json", + "Command": "Invoke-GitHubOrgProjectWithFields -Owner octodemo -ProjectNumber 700 -afterFields \"\" -afterItems \"\" -query \"updated:>=2025-03-15\"" } ] diff --git a/Test/traceInvoke.log b/Test/traceInvoke.log index 2596077..1f1dcb2 100644 --- a/Test/traceInvoke.log +++ b/Test/traceInvoke.log @@ -78,4 +78,5 @@ Invoke-GetUser -Handle rulasg Invoke-UpdateProjectV2Collaborators -ProjectId PVT_kwDOAlIw4c4BCe3V -collaborators "MDQ6VXNlcjY4ODQ0MDg=" -Role "WRITER" Invoke-GetUser -Handle rauldibildos Invoke-UpdateProjectV2Collaborators -ProjectId PVT_kwDOAlIw4c4BCe3V -collaborators "MDQ6VXNlcjY4ODQ0MDg= U_kgDOC_E3gw" -Role "WRITER" -Invoke-GitHubOrgProjectWithFields -Owner octodemo -ProjectNumber 700 -afterFields "" -afterItems "" -query "updated:<2025-03-15" +Invoke-GitHubOrgProjectWithFields -Owner octodemo -ProjectNumber 700 -afterFields "" -afterItems "" -query "updated:>=2024-02-18" +Invoke-GitHubOrgProjectWithFields -Owner octodemo -ProjectNumber 700 -afterFields "" -afterItems "" -query "updated:>=2025-03-15" From 067e01fd1b4860d2025e541c1e67cf74d9718d73 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ra=C3=BAl=20=28Dibildos=29=20Gonz=C3=A1lez?= Date: Tue, 20 Jan 2026 16:33:05 +0100 Subject: [PATCH 5/6] feat(test): Move test.ps1 internal functions to tools/Test_Helper --- test.ps1 | 102 +----------------- .../Test_Helper/public/Get-RequiredModule.ps1 | 27 +++++ .../public/Import-RequiredModule.ps1 | 59 ++++++++++ tools/Test_Helper/public/testResults.ps1 | 32 +++--- 4 files changed, 106 insertions(+), 114 deletions(-) create mode 100644 tools/Test_Helper/public/Get-RequiredModule.ps1 create mode 100644 tools/Test_Helper/public/Import-RequiredModule.ps1 diff --git a/test.ps1 b/test.ps1 index 05ea1d2..2f478ff 100644 --- a/test.ps1 +++ b/test.ps1 @@ -18,108 +18,10 @@ param ( [Parameter()][string]$TestName ) -function Import-RequiredModule{ - [CmdletBinding()] - [Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSAvoidUsingWriteHost', '', Scope='Function')] - param ( - [Parameter(ParameterSetName = "HT", ValueFromPipeline)][hashtable]$RequiredModule, - [Parameter(ParameterSetName = "RM",Position = 0)][string]$ModuleName, - [Parameter(ParameterSetName = "RM")][string]$ModuleVersion, - [Parameter(ParameterSetName = "HT")] - [Parameter(ParameterSetName = "RM")] - [switch]$AllowPrerelease, - [Parameter(ParameterSetName = "HT")] - [Parameter(ParameterSetName = "RM")] - [switch]$PassThru - ) - - process{ - # Powershell module manifest does not allow versions with prerelease tags on them. - # Powershell modle manifest does not allow to add a arbitrary field to specify prerelease versions. - # Valid value (ModuleName, ModuleVersion, RequiredVersion, GUID) - # There is no way to specify a prerelease required module. - - if($RequiredModule){ - $ModuleName = $RequiredModule.ModuleName - $ModuleVersion = [string]::IsNullOrWhiteSpace($RequiredModule.RequiredVersion) ? $RequiredModule.ModuleVersion : $RequiredModule.RequiredVersion - } - - "Importing module Name[{0}] Version[{1}] AllowPrerelease[{2}]" -f $ModuleName, $ModuleVersion, $AllowPrerelease | Write-Verbose - - # Following semVer we can manually specidy a taged version to specify that is prerelease - # Extract the semVer from it and set AllowPrerelease to true - if ($ModuleVersion) { - $V = $ModuleVersion.Split('-') - $semVer = $V[0] - $AllowPrerelease = ($AllowPrerelease -or ($null -ne $V[1])) - } - - $module = Import-Module $ModuleName -PassThru -ErrorAction SilentlyContinue -MinimumVersion:$semVer - - if ($null -eq $module) { - "Installing module Name[{0}] Version[{1}] AllowPrerelease[{2}]" -f $ModuleName, $ModuleVersion, $AllowPrerelease | Write-Host -ForegroundColor DarkGray - $installed = Install-Module -Name $ModuleName -Force -AllowPrerelease:$AllowPrerelease -passThru -RequiredVersion:$ModuleVersion - $module = $installed | ForEach-Object {Import-Module -Name $_.Name -RequiredVersion ($_.Version.Split('-')[0]) -Force -PassThru} - } - - "Imported module Name[{0}] Version[{1}] PreRelease[{2}]" -f $module.Name, $module.Version, $module.privatedata.psdata.prerelease | Write-Host -ForegroundColor DarkGray - - if ($PassThru) { - $module - } - } -} - -function Test-TestingHelperResults{ - [CmdletBinding()] - param( - [Parameter(ValueFromPipeline)][object]$result, - [Parameter()][switch]$SkippedNotAllowed, - [Parameter()][switch]$NotImplementedNotAllowed - ) - - # Chek results from last run - $result = $result ?? $Global:ResultTestingHelper - - if($SkippedNotAllowed -and $result.Skipped -gt 0){ - return $false - } - - if($NotImplementedNotAllowed -and $result.NotImplemented -gt 0){ - return $false - } - - # Allow Not Implemented and Skipped tests to pass - $passed = $result.Tests -eq $result.Pass + $result.NotImplemented + $result.Skipped - - return $passed -} - -<# -. SYNOPSIS - Extracts the required modules from the module manifest -#> -function Get-RequiredModule{ - [CmdletBinding()] - [OutputType([Object[]])] - param() - - # Required Modules - $localPath = $PSScriptRoot - $manifest = $localPath | Join-Path -child "*.psd1" | Get-Item | Import-PowerShellDataFile - $requiredModule = $null -eq $manifest.RequiredModules ? @() : $manifest.RequiredModules - - # Convert to hashtable - $ret = @() - $requiredModule | ForEach-Object{ - $ret += $_ -is [string] ? @{ ModuleName = $_ } : $_ - } - - return $ret -} +# Load Test_Helper module +Import-Module ./tools/Test_Helper # Install and load TestingHelper -# Import-RequiredModule -Name TestingHelper -AllowPrerelease Import-RequiredModule "TestingHelper" -AllowPrerelease # Install and Load Module dependencies diff --git a/tools/Test_Helper/public/Get-RequiredModule.ps1 b/tools/Test_Helper/public/Get-RequiredModule.ps1 new file mode 100644 index 0000000..5370707 --- /dev/null +++ b/tools/Test_Helper/public/Get-RequiredModule.ps1 @@ -0,0 +1,27 @@ +<# +. SYNOPSIS + Extracts the required modules from the module manifest +#> +function Get-RequiredModule{ + [CmdletBinding()] + [OutputType([object[]])] + param( + # Path + [Parameter()][string]$Path = '.' + ) + + # Required Modules + $manifest = $Path | Join-Path -child "*.psd1" | Get-Item | Import-PowerShellDataFile + $requiredModule = $null -eq $manifest.RequiredModules ? @() : $manifest.RequiredModules + + "Found RequiredModules: $($requiredModule.Count)" | Write-Host -ForegroundColor DarkGray + + # Convert to hashtable + $requiredModule | ForEach-Object{ + "Processing RequiredModule: $($_| convertto-json -Depth 5)" | Write-Host -ForegroundColor DarkGray + $hashtable = $_ -is [string] ? @{ ModuleName = $_ } : $_ + + return [pscustomobject]$hashtable + } + +} Export-ModuleMember -Function Get-RequiredModule \ No newline at end of file diff --git a/tools/Test_Helper/public/Import-RequiredModule.ps1 b/tools/Test_Helper/public/Import-RequiredModule.ps1 new file mode 100644 index 0000000..370fab9 --- /dev/null +++ b/tools/Test_Helper/public/Import-RequiredModule.ps1 @@ -0,0 +1,59 @@ +<# +.SYNOPSIS + Import required modules +.DESCRIPTION + Import required modules specified in a module manifest or by name/version + If the module is not installed it will be installed from PSGallery +#> + +function Import-RequiredModule{ + [CmdletBinding()] + [Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSAvoidUsingWriteHost', '', Scope='Function')] + param ( + [Parameter(ParameterSetName = "HT", ValueFromPipeline)][PsCustomObject]$RequiredModule, + [Parameter(ParameterSetName = "RM",Position = 0)][string]$ModuleName, + [Parameter(ParameterSetName = "RM")][string]$ModuleVersion, + [Parameter(ParameterSetName = "HT")] + [Parameter(ParameterSetName = "RM")] + [switch]$AllowPrerelease, + [Parameter(ParameterSetName = "HT")] + [Parameter(ParameterSetName = "RM")] + [switch]$PassThru + ) + + process{ + # Powershell module manifest does not allow versions with prerelease tags on them. + # Powershell modle manifest does not allow to add a arbitrary field to specify prerelease versions. + # Valid value (ModuleName, ModuleVersion, RequiredVersion, GUID) + # There is no way to specify a prerelease required module. + + if($RequiredModule){ + $ModuleName = $RequiredModule.ModuleName + $ModuleVersion = [string]::IsNullOrWhiteSpace($RequiredModule.RequiredVersion) ? $RequiredModule.ModuleVersion : $RequiredModule.RequiredVersion + } + + "Importing module Name[{0}] Version[{1}] AllowPrerelease[{2}]" -f $ModuleName, $ModuleVersion, $AllowPrerelease | Write-Verbose + + # Following semVer we can manually specidy a taged version to specify that is prerelease + # Extract the semVer from it and set AllowPrerelease to true + if ($ModuleVersion) { + $V = $ModuleVersion.Split('-') + $semVer = $V[0] + $AllowPrerelease = ($AllowPrerelease -or ($null -ne $V[1])) + } + + $module = Import-Module $ModuleName -PassThru -ErrorAction SilentlyContinue -MinimumVersion:$semVer + + if ($null -eq $module) { + "Installing module Name[{0}] Version[{1}] AllowPrerelease[{2}]" -f $ModuleName, $ModuleVersion, $AllowPrerelease | Write-Host -ForegroundColor DarkGray + $installed = Install-Module -Name $ModuleName -Force -AllowPrerelease:$AllowPrerelease -passThru -RequiredVersion:$ModuleVersion + $module = $installed | ForEach-Object {Import-Module -Name $_.Name -RequiredVersion ($_.Version.Split('-')[0]) -Force -PassThru} + } + + "Imported module Name[{0}] Version[{1}] PreRelease[{2}]" -f $module.Name, $module.Version, $module.privatedata.psdata.prerelease | Write-Host -ForegroundColor DarkGray + + if ($PassThru) { + $module + } + } +} Export-ModuleMember -Function Import-RequiredModule diff --git a/tools/Test_Helper/public/testResults.ps1 b/tools/Test_Helper/public/testResults.ps1 index 7188f51..455338a 100644 --- a/tools/Test_Helper/public/testResults.ps1 +++ b/tools/Test_Helper/public/testResults.ps1 @@ -1,24 +1,28 @@ function Test-Result{ [CmdletBinding()] + [Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSAvoidGlobalVars', '', Scope='Function')] + [OutputType([bool])] param( [Parameter(ValueFromPipeline)][object]$Result, [Parameter()][switch]$SkippedNotAllowed, [Parameter()][switch]$NotImplementedNotAllowed ) - # Chek results from last run - $Result = $Result ?? $Global:ResultTestingHelper - - if($SkippedNotAllowed -and $Result.Skipped -gt 0){ - return $false - } - - if($NotImplementedNotAllowed -and $Result.NotImplemented -gt 0){ - return $false + process{ + # Chek results from last run + $Result = $Result ?? $Global:ResultTestingHelper + + if($SkippedNotAllowed -and $Result.Skipped -gt 0){ + return $false + } + + if($NotImplementedNotAllowed -and $Result.NotImplemented -gt 0){ + return $false + } + + # Allow Not Implemented and Skipped tests to pass + $passed = $Result.Tests -eq $Result.Pass + $Result.NotImplemented + $Result.Skipped + + return $passed } - - # Allow Not Implemented and Skipped tests to pass - $passed = $Result.Tests -eq $Result.Pass + $Result.NotImplemented + $Result.Skipped - - return $passed } Export-ModuleMember -Function Test-Result From 9aed4af44c00fd0c18b7c8127b328c97e2db3cb7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ra=C3=BAl=20=28Dibildos=29=20Gonz=C3=A1lez?= Date: Tue, 20 Jan 2026 16:37:55 +0100 Subject: [PATCH 6/6] feat(workflow): add test execution step and improve error handling in deployment --- .../workflows/deploy_module_on_release.yml | 30 +++++++++++++++++-- 1 file changed, 27 insertions(+), 3 deletions(-) diff --git a/.github/workflows/deploy_module_on_release.yml b/.github/workflows/deploy_module_on_release.yml index d3132cb..cad2ee8 100644 --- a/.github/workflows/deploy_module_on_release.yml +++ b/.github/workflows/deploy_module_on_release.yml @@ -19,6 +19,22 @@ jobs: run: | echo $EVENT_CONTEXT + - name: Run test.ps1 + shell: pwsh + run: | + $result = ./test.ps1 -ShowTestErrors + + Write-Output $result + + import-module ./tools/Test_Helper/ + + $passed = Test-Result -Result $result + + if($passed) + { "All test passed" | Write-Verbose -verbose ; exit 0 } + else + { "Not all tests passed" | Write-Verbose -verbose ; exit 1 } + - name: deploy_ps1 shell: pwsh env: @@ -27,8 +43,16 @@ jobs: RELEASE_TAG: ${{ github.event.release.tag_name }} RELEASE_NAME: ${{ github.event.release.name }} run: | - $env:EVENT_REF = $env:REF + # Import required modules for deployment + import-module ./tools/Test_Helper/ + + Get-RequiredModule -Verbose | Import-RequiredModule -AllowPrerelease + + # GET TAG NAME + + ## Ref definition. Branch or Tag + $env:EVENT_REF = $env:REF If ([string]::IsNullOrEmpty($env:EVENT_REF)) { # Release published trigger $tag = $env:RELEASE_TAG @@ -41,9 +65,9 @@ jobs: If([string]::IsNullorwhitespace($tag)) { # Tag name is empty, exit - write-error "Tag name is empty" - exit 1 + throw "Tag name is empty" } + # DEPLOYMENT ./deploy.ps1 -VersionTag $tag -NugetApiKey $env:NUGETAPIKEY