Testing/Unit/PowerShell/Orchestrator/Get-TenantDetail.Tests.ps1

$OrchestratorPath = '../../../../Modules/Orchestrator.psm1'
Import-Module (Join-Path -Path $PSScriptRoot -ChildPath $OrchestratorPath) -Function 'Get-TenantDetail'

InModuleScope Orchestrator {
    BeforeAll {
        function Get-AADTenantDetail {}
        Mock -ModuleName Orchestrator Get-AADTenantDetail {
            '{"DisplayName": "displayName"}'
        }
        function Get-TeamsTenantDetail {}
        Mock -ModuleName Orchestrator Get-TeamsTenantDetail {
            '{"DisplayName": "displayName"}'
        }
        function Get-PowerPlatformTenantDetail {}
        Mock -ModuleName Orchestrator Get-PowerPlatformTenantDetail {
            '{"DisplayName": "displayName"}'
        }
        function Get-EXOTenantDetail {}
        Mock -ModuleName Orchestrator Get-PowerPlatformTenantDetail {
            '{"DisplayName": "displayName"}'
        }
        function Test-CyberAssessmentValidJson {
            param (
                [string]
                $Json
            )
            $ValidJson = $true
            try {
                ConvertFrom-Json $Json -ErrorAction Stop | Out-Null
            }
            catch {
                $ValidJson = $false;
            }
            $ValidJson
        }
    }
    Describe -Tag 'Orchestrator' -Name 'Get-TenantDetail' {
        Context 'When connecting to commercial Endpoints' {
            BeforeAll {
                [Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSUseDeclaredVarsMoreThanAssignments', 'M365Environment')]
                $M365Environment = 'commercial'
            }
            It 'With -ProductNames "aad", returns valid JSON' {
                $ProductNames = @('aad')
                $Json = Get-TenantDetail -M365Environment $M365Environment -ProductNames $ProductNames
                $ValidJson = Test-CyberAssessmentValidJson -Json $Json | Select-Object -Last 1
                $ValidJson | Should -Be $true
            }
            It 'With -ProductNames "exo", returns valid JSON' {
                $ProductNames = @('exo')
                $Json = Get-TenantDetail -M365Environment $M365Environment -ProductNames $ProductNames
                $ValidJson = Test-CyberAssessmentValidJson -Json $Json | Select-Object -Last 1
                $ValidJson | Should -Be $true
            }
            It 'With -ProductNames "defender", returns valid JSON' {
                $ProductNames = @('defender')
                $Json = Get-TenantDetail -M365Environment $M365Environment -ProductNames $ProductNames
                $ValidJson = Test-CyberAssessmentValidJson -Json $Json | Select-Object -Last 1
                $ValidJson | Should -Be $true
            }
            It 'With -ProductNames "powerplatform", returns valid JSON' {
                $ProductNames = @('powerplatform')
                $Json = Get-TenantDetail -M365Environment $M365Environment -ProductNames $ProductNames
                $ValidJson = Test-CyberAssessmentValidJson -Json $Json | Select-Object -Last 1
                $ValidJson | Should -Be $true
            }
            It 'With -ProductNames "sharepoint", returns valid JSON' {
                $ProductNames = @('sharepoint')
                $Json = Get-TenantDetail -M365Environment $M365Environment -ProductNames $ProductNames
                $ValidJson = Test-CyberAssessmentValidJson -Json $Json | Select-Object -Last 1
                $ValidJson | Should -Be $true
            }
            It 'With -ProductNames "teams", returns valid JSON' {
                $ProductNames = @('teams')
                $Json = Get-TenantDetail -M365Environment $M365Environment -ProductNames $ProductNames
                $ValidJson = Test-CyberAssessmentValidJson -Json $Json | Select-Object -Last 1
                $ValidJson | Should -Be $true
            }
            It 'With all products, returns valid JSON' {
                $ProductNames = @("aad", "defender", "exo", "powerplatform", "sharepoint", "teams")
                $Json = Get-TenantDetail -M365Environment $M365Environment -ProductNames $ProductNames
                $ValidJson = Test-CyberAssessmentValidJson -Json $Json | Select-Object -Last 1
                $ValidJson | Should -Be $true
            }
        }
        Context 'When connecting to GCC Endpoints' {
            BeforeAll {
                [Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSUseDeclaredVarsMoreThanAssignments', 'M365Environment')]
                $M365Environment = 'gcc'
            }
            It 'With -ProductNames "aad", returns valid JSON' {
                $ProductNames = @('aad')
                $Json = Get-TenantDetail -M365Environment $M365Environment -ProductNames $ProductNames
                $ValidJson = Test-CyberAssessmentValidJson -Json $Json | Select-Object -Last 1
                $ValidJson | Should -Be $true
            }
            It 'With -ProductNames "exo", returns valid JSON' {
                $ProductNames = @('exo')
                $Json = Get-TenantDetail -M365Environment $M365Environment -ProductNames $ProductNames
                $ValidJson = Test-CyberAssessmentValidJson -Json $Json | Select-Object -Last 1
                $ValidJson | Should -Be $true
            }
            It 'With -ProductNames "defender", returns valid JSON' {
                $ProductNames = @('defender')
                $Json = Get-TenantDetail -M365Environment $M365Environment -ProductNames $ProductNames
                $ValidJson = Test-CyberAssessmentValidJson -Json $Json | Select-Object -Last 1
                $ValidJson | Should -Be $true
            }
            It 'With -ProductNames "powerplatform", returns valid JSON' {
                $ProductNames = @('powerplatform')
                $Json = Get-TenantDetail -M365Environment $M365Environment -ProductNames $ProductNames
                $ValidJson = Test-CyberAssessmentValidJson -Json $Json | Select-Object -Last 1
                $ValidJson | Should -Be $true
            }
            It 'With -ProductNames "sharepoint", returns valid JSON' {
                $ProductNames = @('sharepoint')
                $Json = Get-TenantDetail -M365Environment $M365Environment -ProductNames $ProductNames
                $ValidJson = Test-CyberAssessmentValidJson -Json $Json | Select-Object -Last 1
                $ValidJson | Should -Be $true
            }
            It 'With -ProductNames "teams", returns valid JSON' {
                $ProductNames = @('teams')
                $Json = Get-TenantDetail -M365Environment $M365Environment -ProductNames $ProductNames
                $ValidJson = Test-CyberAssessmentValidJson -Json $Json | Select-Object -Last 1
                $ValidJson | Should -Be $true
            }
            It 'With all products, returns valid JSON' {
                $ProductNames = @("aad", "defender", "exo", "powerplatform", "sharepoint", "teams")
                $Json = Get-TenantDetail -M365Environment $M365Environment -ProductNames $ProductNames
                $ValidJson = Test-CyberAssessmentValidJson -Json $Json | Select-Object -Last 1
                $ValidJson | Should -Be $true
            }
        }
        Context 'When connecting to GCC High Endpoints' {
            BeforeAll {
                [Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSUseDeclaredVarsMoreThanAssignments', 'M365Environment')]
                $M365Environment = 'gcchigh'
            }
            It 'With -ProductNames "aad", returns valid JSON' {
                $ProductNames = @('aad')
                $Json = Get-TenantDetail -M365Environment $M365Environment -ProductNames $ProductNames
                $ValidJson = Test-CyberAssessmentValidJson -Json $Json | Select-Object -Last 1
                $ValidJson | Should -Be $true
            }
            It 'With -ProductNames "exo", returns valid JSON' {
                $ProductNames = @('exo')
                $Json = Get-TenantDetail -M365Environment $M365Environment -ProductNames $ProductNames
                $ValidJson = Test-CyberAssessmentValidJson -Json $Json | Select-Object -Last 1
                $ValidJson | Should -Be $true
            }
            It 'With -ProductNames "defender", returns valid JSON' {
                $ProductNames = @('defender')
                $Json = Get-TenantDetail -M365Environment $M365Environment -ProductNames $ProductNames
                $ValidJson = Test-CyberAssessmentValidJson -Json $Json | Select-Object -Last 1
                $ValidJson | Should -Be $true
            }
            It 'With -ProductNames "powerplatform", returns valid JSON' {
                $ProductNames = @('powerplatform')
                $Json = Get-TenantDetail -M365Environment $M365Environment -ProductNames $ProductNames
                $ValidJson = Test-CyberAssessmentValidJson -Json $Json | Select-Object -Last 1
                $ValidJson | Should -Be $true
            }
            It 'With -ProductNames "sharepoint", returns valid JSON' {
                $ProductNames = @('sharepoint')
                $Json = Get-TenantDetail -M365Environment $M365Environment -ProductNames $ProductNames
                $ValidJson = Test-CyberAssessmentValidJson -Json $Json | Select-Object -Last 1
                $ValidJson | Should -Be $true
            }
            It 'With -ProductNames "teams", returns valid JSON' {
                $ProductNames = @('teams')
                $Json = Get-TenantDetail -M365Environment $M365Environment -ProductNames $ProductNames
                $ValidJson = Test-CyberAssessmentValidJson -Json $Json | Select-Object -Last 1
                $ValidJson | Should -Be $true
            }
            It 'With all products, returns valid JSON' {
                $ProductNames = @("aad", "defender", "exo", "powerplatform", "sharepoint", "teams")
                $Json = Get-TenantDetail -M365Environment $M365Environment -ProductNames $ProductNames
                $ValidJson = Test-CyberAssessmentValidJson -Json $Json | Select-Object -Last 1
                $ValidJson | Should -Be $true
            }
        }
        Context 'When connecting to DOD Endpoints' {
            BeforeAll {
                [Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSUseDeclaredVarsMoreThanAssignments', 'M365Environment')]
                $M365Environment = 'dod'
            }
            It 'With -ProductNames "aad", returns valid JSON' {
                $ProductNames = @('aad')
                $Json = Get-TenantDetail -M365Environment $M365Environment -ProductNames $ProductNames
                $ValidJson = Test-CyberAssessmentValidJson -Json $Json | Select-Object -Last 1
                $ValidJson | Should -Be $true
            }
            It 'With -ProductNames "exo", returns valid JSON' {
                $ProductNames = @('exo')
                $Json = Get-TenantDetail -M365Environment $M365Environment -ProductNames $ProductNames
                $ValidJson = Test-CyberAssessmentValidJson -Json $Json | Select-Object -Last 1
                $ValidJson | Should -Be $true
            }
            It 'With -ProductNames "defender", returns valid JSON' {
                $ProductNames = @('defender')
                $Json = Get-TenantDetail -M365Environment $M365Environment -ProductNames $ProductNames
                $ValidJson = Test-CyberAssessmentValidJson -Json $Json | Select-Object -Last 1
                $ValidJson | Should -Be $true
            }
            It 'With -ProductNames "powerplatform", returns valid JSON' {
                $ProductNames = @('powerplatform')
                $Json = Get-TenantDetail -M365Environment $M365Environment -ProductNames $ProductNames
                $ValidJson = Test-CyberAssessmentValidJson -Json $Json | Select-Object -Last 1
                $ValidJson | Should -Be $true
            }
            It 'With -ProductNames "sharepoint", returns valid JSON' {
                $ProductNames = @('sharepoint')
                $Json = Get-TenantDetail -M365Environment $M365Environment -ProductNames $ProductNames
                $ValidJson = Test-CyberAssessmentValidJson -Json $Json | Select-Object -Last 1
                $ValidJson | Should -Be $true
            }
            It 'With -ProductNames "teams", returns valid JSON' {
                $ProductNames = @('teams')
                $Json = Get-TenantDetail -M365Environment $M365Environment -ProductNames $ProductNames
                $ValidJson = Test-CyberAssessmentValidJson -Json $Json | Select-Object -Last 1
                $ValidJson | Should -Be $true
            }
            It 'With all products, returns valid JSON' {
                $ProductNames = @("aad", "defender", "exo", "powerplatform", "sharepoint", "teams")
                $Json = Get-TenantDetail -M365Environment $M365Environment -ProductNames $ProductNames
                $ValidJson = Test-CyberAssessmentValidJson -Json $Json | Select-Object -Last 1
                $ValidJson | Should -Be $true
            }
        }
    }
}

AfterAll {
    Remove-Module Orchestrator -ErrorAction SilentlyContinue
}