From 7582511dd5059ec4e0e704880149926d1d359d5d Mon Sep 17 00:00:00 2001 From: DrIOS <58635327+DrIOSX@users.noreply.github.com> Date: Thu, 30 May 2024 15:03:59 -0500 Subject: [PATCH] add: filter function for tests --- source/Private/Get-TestDefinitionsObject.ps1 | 63 +++++++++++++++++++ source/Public/Invoke-M365SecurityAudit.ps1 | 59 +++++------------ .../Get-TestDefinitionsObject.tests.ps1 | 27 ++++++++ 3 files changed, 107 insertions(+), 42 deletions(-) create mode 100644 source/Private/Get-TestDefinitionsObject.ps1 create mode 100644 tests/Unit/Private/Get-TestDefinitionsObject.tests.ps1 diff --git a/source/Private/Get-TestDefinitionsObject.ps1 b/source/Private/Get-TestDefinitionsObject.ps1 new file mode 100644 index 0000000..6e42d23 --- /dev/null +++ b/source/Private/Get-TestDefinitionsObject.ps1 @@ -0,0 +1,63 @@ +function Get-TestDefinitionsObject { + param ( + [Parameter(Mandatory = $true)] + [object[]]$TestDefinitions, + + [Parameter(Mandatory = $true)] + [string]$ParameterSetName, + + [string]$ELevel, + [string]$ProfileLevel, + [string[]]$IncludeRecommendation, + [string[]]$SkipRecommendation + ) + + Write-Verbose "Initial test definitions count: $($TestDefinitions.Count)" + + switch ($ParameterSetName) { + 'ELevelFilter' { + Write-Verbose "Applying ELevelFilter" + if ($null -ne $ELevel -and $null -ne $ProfileLevel) { + Write-Verbose "Filtering on ELevel = $ELevel and ProfileLevel = $ProfileLevel" + $TestDefinitions = $TestDefinitions | Where-Object { + $_.ELevel -eq $ELevel -and $_.ProfileLevel -eq $ProfileLevel + } + } + elseif ($null -ne $ELevel) { + Write-Verbose "Filtering on ELevel = $ELevel" + $TestDefinitions = $TestDefinitions | Where-Object { + $_.ELevel -eq $ELevel + } + } + elseif ($null -ne $ProfileLevel) { + Write-Verbose "Filtering on ProfileLevel = $ProfileLevel" + $TestDefinitions = $TestDefinitions | Where-Object { + $_.ProfileLevel -eq $ProfileLevel + } + } + } + 'IG1Filter' { + Write-Verbose "Applying IG1Filter" + $TestDefinitions = $TestDefinitions | Where-Object { $_.IG1 -eq 'TRUE' } + } + 'IG2Filter' { + Write-Verbose "Applying IG2Filter" + $TestDefinitions = $TestDefinitions | Where-Object { $_.IG2 -eq 'TRUE' } + } + 'IG3Filter' { + Write-Verbose "Applying IG3Filter" + $TestDefinitions = $TestDefinitions | Where-Object { $_.IG3 -eq 'TRUE' } + } + 'RecFilter' { + Write-Verbose "Applying RecFilter" + $TestDefinitions = $TestDefinitions | Where-Object { $IncludeRecommendation -contains $_.Rec } + } + 'SkipRecFilter' { + Write-Verbose "Applying SkipRecFilter" + $TestDefinitions = $TestDefinitions | Where-Object { $SkipRecommendation -notcontains $_.Rec } + } + } + + Write-Verbose "Filtered test definitions count: $($TestDefinitions.Count)" + return $TestDefinitions +} \ No newline at end of file diff --git a/source/Public/Invoke-M365SecurityAudit.ps1 b/source/Public/Invoke-M365SecurityAudit.ps1 index fb0ee29..f137cfa 100644 --- a/source/Public/Invoke-M365SecurityAudit.ps1 +++ b/source/Public/Invoke-M365SecurityAudit.ps1 @@ -71,28 +71,28 @@ function Invoke-M365SecurityAudit { [string]$DomainName, # E-Level with optional ProfileLevel selection - [Parameter(ParameterSetName = 'ELevelFilter')] + [Parameter(Mandatory = $true, ParameterSetName = 'ELevelFilter')] [ValidateSet('E3', 'E5')] [string]$ELevel, - [Parameter(ParameterSetName = 'ELevelFilter')] + [Parameter(Mandatory = $true, ParameterSetName = 'ELevelFilter')] [ValidateSet('L1', 'L2')] [string]$ProfileLevel, # IG Filters, one at a time - [Parameter(ParameterSetName = 'IG1Filter')] + [Parameter(Mandatory = $true, ParameterSetName = 'IG1Filter')] [switch]$IncludeIG1, - [Parameter(ParameterSetName = 'IG2Filter')] + [Parameter(Mandatory = $true, ParameterSetName = 'IG2Filter')] [switch]$IncludeIG2, - [Parameter(ParameterSetName = 'IG3Filter')] + [Parameter(Mandatory = $true, ParameterSetName = 'IG3Filter')] [switch]$IncludeIG3, # Inclusion of specific recommendation numbers - [Parameter(ParameterSetName = 'RecFilter')] + [Parameter(Mandatory = $true, ParameterSetName = 'RecFilter')] [ValidateSet( - '1.1.1','1.1.3', '1.2.1', '1.2.2', '1.3.1', '1.3.3', '1.3.6', '2.1.1', '2.1.2', ` + '1.1.1', '1.1.3', '1.2.1', '1.2.2', '1.3.1', '1.3.3', '1.3.6', '2.1.1', '2.1.2', ` '2.1.3', '2.1.4', '2.1.5', '2.1.6', '2.1.7', '2.1.9', '3.1.1', '5.1.2.3', ` '5.1.8.1', '6.1.1', '6.1.2', '6.1.3', '6.2.1', '6.2.2', '6.2.3', '6.3.1', ` '6.5.1', '6.5.2', '6.5.3', '7.2.1', '7.2.10', '7.2.2', '7.2.3', '7.2.4', ` @@ -103,9 +103,9 @@ function Invoke-M365SecurityAudit { [string[]]$IncludeRecommendation, # Exclusion of specific recommendation numbers - [Parameter(ParameterSetName = 'SkipRecFilter')] + [Parameter(Mandatory = $true, ParameterSetName = 'SkipRecFilter')] [ValidateSet( - '1.1.1','1.1.3', '1.2.1', '1.2.2', '1.3.1', '1.3.3', '1.3.6', '2.1.1', '2.1.2', ` + '1.1.1', '1.1.3', '1.2.1', '1.2.2', '1.3.1', '1.3.3', '1.3.6', '2.1.1', '2.1.2', ` '2.1.3', '2.1.4', '2.1.5', '2.1.6', '2.1.7', '2.1.9', '3.1.1', '5.1.2.3', ` '5.1.8.1', '6.1.1', '6.1.2', '6.1.3', '6.2.1', '6.2.2', '6.2.3', '6.3.1', ` '6.5.1', '6.5.2', '6.5.3', '7.2.1', '7.2.10', '7.2.2', '7.2.3', '7.2.4', ` @@ -164,40 +164,15 @@ function Invoke-M365SecurityAudit { # Load the Test Definitions into the script scope for use in other functions $script:TestDefinitionsObject = $testDefinitions # Apply filters based on parameter sets - switch ($PSCmdlet.ParameterSetName) { - 'ELevelFilter' { - if ($null -ne $ELevel -and $null -ne $ProfileLevel) { - $testDefinitions = $testDefinitions | Where-Object { - $_.ELevel -eq $ELevel -and $_.ProfileLevel -eq $ProfileLevel - } - } - elseif ($null -ne $ELevel) { - $testDefinitions = $testDefinitions | Where-Object { - $_.ELevel -eq $ELevel - } - } - elseif ($null -ne $ProfileLevel) { - $testDefinitions = $testDefinitions | Where-Object { - $_.ProfileLevel -eq $ProfileLevel - } - } - } - 'IG1Filter' { - $testDefinitions = $testDefinitions | Where-Object { $_.IG1 -eq 'TRUE' } - } - 'IG2Filter' { - $testDefinitions = $testDefinitions | Where-Object { $_.IG2 -eq 'TRUE' } - } - 'IG3Filter' { - $testDefinitions = $testDefinitions | Where-Object { $_.IG3 -eq 'TRUE' } - } - 'RecFilter' { - $testDefinitions = $testDefinitions | Where-Object { $IncludeRecommendation -contains $_.Rec } - } - 'SkipRecFilter' { - $testDefinitions = $testDefinitions | Where-Object { $SkipRecommendation -notcontains $_.Rec } - } + $params = @{ + TestDefinitions = $testDefinitions + ParameterSetName = $PSCmdlet.ParameterSetName + ELevel = $ELevel + ProfileLevel = $ProfileLevel + IncludeRecommendation = $IncludeRecommendation + SkipRecommendation = $SkipRecommendation } + $testDefinitions = Get-TestDefinitionsObject @params # End switch ($PSCmdlet.ParameterSetName) # Determine which test files to load based on filtering diff --git a/tests/Unit/Private/Get-TestDefinitionsObject.tests.ps1 b/tests/Unit/Private/Get-TestDefinitionsObject.tests.ps1 new file mode 100644 index 0000000..4a2aa69 --- /dev/null +++ b/tests/Unit/Private/Get-TestDefinitionsObject.tests.ps1 @@ -0,0 +1,27 @@ +$ProjectPath = "$PSScriptRoot\..\..\.." | Convert-Path +$ProjectName = ((Get-ChildItem -Path $ProjectPath\*\*.psd1).Where{ + ($_.Directory.Name -match 'source|src' -or $_.Directory.Name -eq $_.BaseName) -and + $(try { Test-ModuleManifest $_.FullName -ErrorAction Stop } catch { $false } ) + }).BaseName + + +Import-Module $ProjectName + +InModuleScope $ProjectName { + Describe Get-PrivateFunction { + Context 'Default' { + BeforeEach { + $return = Get-PrivateFunction -PrivateData 'string' + } + + It 'Returns a single object' { + ($return | Measure-Object).Count | Should -Be 1 + } + + It 'Returns a string based on the parameter PrivateData' { + $return | Should -Be 'string' + } + } + } +} +