Tests/Get-ADArchitectureAssessment.Tests.ps1

Import-Module "$PSScriptRoot\..\ADOpsKit.psd1" -Force -ErrorAction Stop

Describe "Get-ADArchitectureAssessment" {

    Context "Parameter defaults" {

        It "Should default OutputFolder to C:\ADOpsKit\Reports\Get-ADArchitectureAssessment" {
            $ast   = (Get-Command Get-ADArchitectureAssessment).ScriptBlock.Ast
            $param = $ast.Body.ParamBlock.Parameters | Where-Object { $_.Name.VariablePath.UserPath -eq 'OutputFolder' }
            $param.DefaultValue.ToString() | Should -Match 'C:\\ADOpsKit\\Reports\\Get-ADArchitectureAssessment'
        }

        It "Should default StaleUserDays to 90" {
            $ast   = (Get-Command Get-ADArchitectureAssessment).ScriptBlock.Ast
            $param = $ast.Body.ParamBlock.Parameters | Where-Object { $_.Name.VariablePath.UserPath -eq 'StaleUserDays' }
            $param.DefaultValue.ToString() | Should -Be '90'
        }

        It "Should default StaleComputerDays to 90" {
            $ast   = (Get-Command Get-ADArchitectureAssessment).ScriptBlock.Ast
            $param = $ast.Body.ParamBlock.Parameters | Where-Object { $_.Name.VariablePath.UserPath -eq 'StaleComputerDays' }
            $param.DefaultValue.ToString() | Should -Be '90'
        }

        It "Should default PortTimeoutMs to 1000" {
            $ast   = (Get-Command Get-ADArchitectureAssessment).ScriptBlock.Ast
            $param = $ast.Body.ParamBlock.Parameters | Where-Object { $_.Name.VariablePath.UserPath -eq 'PortTimeoutMs' }
            $param.DefaultValue.ToString() | Should -Be '1000'
        }

        It "Should default TcpPortsToTest to the standard AD/DNS/LDAP/Kerberos/WSUS port set" {
            $ast   = (Get-Command Get-ADArchitectureAssessment).ScriptBlock.Ast
            $param = $ast.Body.ParamBlock.Parameters | Where-Object { $_.Name.VariablePath.UserPath -eq 'TcpPortsToTest' }
            $param.DefaultValue.ToString() | Should -Match '53.*88.*135.*139.*389.*445.*464.*636.*3268.*3269.*5985.*5986.*8530.*8531.*9389'
        }
    }

    Context "Parameter validation" {

        It "Should reject StaleUserDays outside 1-3650" {
            { Get-ADArchitectureAssessment -StaleUserDays 0 -SkipPortChecks -SkipServiceChecks } |
                Should -Throw
        }

        It "Should reject PortTimeoutMs below 100" {
            { Get-ADArchitectureAssessment -PortTimeoutMs 50 -SkipPortChecks -SkipServiceChecks } |
                Should -Throw
        }

        It "Should reject TcpPortsToTest values outside 1-65535" {
            { Get-ADArchitectureAssessment -TcpPortsToTest @(70000) -SkipPortChecks -SkipServiceChecks } |
                Should -Throw
        }
    }

    Context "Integration - requires domain connectivity" -Tag 'Integration' {

        BeforeAll {
            $script:outputFolder = Join-Path $TestDrive 'ad-arch-assessment'
            Get-ADArchitectureAssessment -OutputFolder $script:outputFolder -SkipPortChecks -SkipServiceChecks
        }

        It "Should create the output folder" {
            $script:outputFolder | Should -Exist
        }

        It "Should write an HTML report file" {
            # Written under a timestamped ADArchitectureAssessment_<yyyyMMdd_HHmmss>
            # subfolder of -OutputFolder, not directly in it.
            Get-ChildItem $script:outputFolder -Filter '*.html' -Recurse | Should -Not -BeNullOrEmpty
        }

        It "Should write a JSON report file" {
            Get-ChildItem $script:outputFolder -Filter '*.json' -Recurse | Should -Not -BeNullOrEmpty
        }
    }
}