Testing/Unit/PowerShell/Orchestrator/Invoke-ReportCreation.Tests.ps1

$OrchestratorPath = '../../../../Modules/Orchestrator.psm1'
$CreateReportPath = '../../../../Modules/CreateReport/CreateReport.psm1'
Import-Module (Join-Path -Path $PSScriptRoot -ChildPath $OrchestratorPath) -Function Invoke-ReportCreation -Force
Import-Module (Join-Path -Path $PSScriptRoot -ChildPath $CreateReportPath) -Function New-Report, Import-SecureBaseline -Force

InModuleScope Orchestrator {
    Describe -Tag 'Orchestrator' -Name 'Invoke-ReportCreation' {
        BeforeAll {
            Mock -ModuleName Orchestrator New-Report {}
            Mock -ModuleName Orchestrator Pluralize {}
            Mock -ModuleName Orchestrator Import-SecureBaseline {
                @{}
            }
            Mock -CommandName Write-Progress {}
            Mock -CommandName Join-Path { "." }
            Mock -CommandName Out-File {}
            Mock -CommandName ConvertTo-Html {}
            Mock -CommandName Copy-Item {}
            Mock -CommandName Get-Content {}
            Mock -CommandName Add-Type {}
            Mock -CommandName Invoke-Item {}
            function Get-Utf8NoBom {throw 'this will be mocked'}
            Mock -CommandName Get-Utf8NoBom {}
            Mock -CommandName ConvertFrom-Json { @{ "report_uuid"="" } }
        }
        Context 'When creating the reports from Provider and OPA results JSON' {
            BeforeAll {
                [Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSUseDeclaredVarsMoreThanAssignments', 'CyberConfig')]
                $CyberConfig = [PSCustomObject]@{
                    ProductNames = @('aad')
                    OutProviderFileName = "ProviderSettingsExport"
                    OutRegoFileName = "TestResults"
                    OutReportName = "BaselineReports"
                    OPAPath = "."
                    LogIn = $false
                }
                [Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSUseDeclaredVarsMoreThanAssignments', 'TenantDetails')]
                $TenantDetails = '{"DisplayName": "displayName"}'
                [Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSUseDeclaredVarsMoreThanAssignments', 'DarkMode')]
                $DarkMode = $false
                [Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSUseDeclaredVarsMoreThanAssignments', 'ModuleVersion')]
                $ModuleVersion = '1.0'
                [Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSUseDeclaredVarsMoreThanAssignments', 'OutFolderPath')]
                $OutFolderPath = "./"
            }
            It 'Do it quietly (Do not automatically show report)' {
                $CyberConfig.ProductNames = @("aad")
                { Invoke-ReportCreation -CyberConfig $CyberConfig -TenantDetails $TenantDetails -ModuleVersion $ModuleVersion -OutFolderPath $OutFolderPath -DarkMode:$DarkMode -Quiet } | Should -Not -Throw
                Should -Invoke -CommandName Invoke-Item -Exactly -Times 0
                $CyberConfig.ProductNames = @()
            }
            It 'Show report' {
                $CyberConfig.ProductNames = @("aad")
                { Invoke-ReportCreation -CyberConfig $CyberConfig -TenantDetails $TenantDetails -ModuleVersion $ModuleVersion -OutFolderPath $OutFolderPath -DarkMode:$DarkMode } | Should -Not -Throw
                Should -Invoke -CommandName Invoke-Item -Exactly -Times 1 -ParameterFilter {-Not [string]::IsNullOrEmpty($Path) }
                $CyberConfig.ProductNames = @()
            }
            It 'With -ProductNames "aad", should not throw' {
                $CyberConfig.ProductNames = @("aad")
                { Invoke-ReportCreation -CyberConfig $CyberConfig -TenantDetails $TenantDetails -ModuleVersion $ModuleVersion -OutFolderPath $OutFolderPath -DarkMode:$DarkMode } | Should -Not -Throw
            }
            It 'With -ProductNames "defender", should not throw' {
                $CyberConfig.ProductNames = @("defender")
                { Invoke-ReportCreation -CyberConfig $CyberConfig -TenantDetails $TenantDetails -ModuleVersion $ModuleVersion -OutFolderPath $OutFolderPath -DarkMode:$DarkMode } | Should -Not -Throw
            }
            It 'With -ProductNames "exo", should not throw' {
                $CyberConfig.ProductNames = @("exo")
                { Invoke-ReportCreation -CyberConfig $CyberConfig -TenantDetails $TenantDetails -ModuleVersion $ModuleVersion -OutFolderPath $OutFolderPath -DarkMode:$DarkMode } | Should -Not -Throw
            }
            It 'With -ProductNames "powerplatform", should not throw' {
                $CyberConfig.ProductNames = @("powerplatform")
                { Invoke-ReportCreation -CyberConfig $CyberConfig -TenantDetails $TenantDetails -ModuleVersion $ModuleVersion -OutFolderPath $OutFolderPath -DarkMode:$DarkMode } | Should -Not -Throw
            }
            It 'With -ProductNames "sharepoint", should not throw' {
                $CyberConfig.ProductNames = @("sharepoint")
                { Invoke-ReportCreation -CyberConfig $CyberConfig -TenantDetails $TenantDetails -ModuleVersion $ModuleVersion -OutFolderPath $OutFolderPath -DarkMode:$DarkMode } | Should -Not -Throw
            }
            It 'With -ProductNames "teams", should not throw' {
                $CyberConfig.ProductNames = @("teams")
                { Invoke-ReportCreation -CyberConfig $CyberConfig -TenantDetails $TenantDetails -ModuleVersion $ModuleVersion -OutFolderPath $OutFolderPath -DarkMode:$DarkMode } | Should -Not -Throw
            }
            It 'With all products, should not throw' {
                $CyberConfig.ProductNames = @("aad", "defender", "exo", "powerplatform", "sharepoint", "teams")
                { Invoke-ReportCreation -CyberConfig $CyberConfig -TenantDetails $TenantDetails -ModuleVersion $ModuleVersion -OutFolderPath $OutFolderPath -DarkMode:$DarkMode } | Should -Not -Throw
            }
        }
        Context 'When creating the reports with -Quiet True' {
            BeforeAll {
                [Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSUseDeclaredVarsMoreThanAssignments', 'CyberConfig')]
                $CyberConfig = [PSCustomObject]@{
                    ProductNames = @('aad')
                    OutProviderFileName = "ProviderSettingsExport"
                    OutRegoFileName = "TestResults"
                    OutReportName = "BaselineReports"
                    OPAPath = "."
                    LogIn = $false
                }
                [Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSUseDeclaredVarsMoreThanAssignments', 'DarkMode')]
                $DarkMode = $false
                [Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSUseDeclaredVarsMoreThanAssignments', 'TenantDetails')]
                $TenantDetails = '{"DisplayName": "displayName"}'
                [Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSUseDeclaredVarsMoreThanAssignments', 'ModuleVersion')]
                $ModuleVersion = '1.0'
                [Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSUseDeclaredVarsMoreThanAssignments', 'OutFolderPath')]
                $OutFolderPath = "./"
                [Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSUseDeclaredVarsMoreThanAssignments', 'Quiet')]
                $Quiet = $true
            }
            It 'With all products, should not throw' {
                $CyberConfig.ProductNames = @("aad", "defender", "exo", "powerplatform", "sharepoint", "teams")
                { Invoke-ReportCreation -CyberConfig $CyberConfig -TenantDetails $TenantDetails -ModuleVersion $ModuleVersion -OutFolderPath $OutFolderPath -DarkMode:$DarkMode -Quiet:$Quiet } | Should -Not -Throw
            }
        }
    }
 }

AfterAll {
     Remove-Module Orchestrator -ErrorAction SilentlyContinue
 }