tests/Test-IWBuildScript.ps1

#Requires -Version 7
$ErrorActionPreference = 'Stop'
. (Join-Path $PSScriptRoot '_TestHelpers.ps1')

$wizardRoot = Split-Path $PSScriptRoot -Parent
Import-Module (Join-Path $wizardRoot 'modules/ISC.OperatorConsole.psm1') -Force -Global -WarningAction SilentlyContinue
Import-Module (Join-Path $wizardRoot 'modules/IW.Core.psm1') -Force -Global
Import-Module (Join-Path $wizardRoot 'modules/IW.Render.psm1') -Force -Global
Import-Module (Join-Path $wizardRoot 'modules/Definitions/Aws.Connector.psm1') -Force
Import-Module (Join-Path $wizardRoot 'modules/Definitions/Azure.Connector.psm1') -Force
Import-Module (Join-Path $wizardRoot 'modules/Definitions/Google.Connector.psm1') -Force
Import-Module (Join-Path $wizardRoot 'modules/Definitions/Databricks.Connector.psm1') -Force
Import-Module (Join-Path $wizardRoot 'modules/Definitions/Salesforce.Connector.psm1') -Force
Import-Module (Join-Path $wizardRoot 'modules/Definitions/GitHub.Connector.psm1') -Force
Import-Module (Join-Path $wizardRoot 'modules/Definitions/CrowdStrike.Connector.psm1') -Force

Initialize-OperatorConsole -NonInteractive
Register-AwsConnectorDefinitions
Register-AzureConnectorDefinitions
Register-GoogleConnectorDefinitions
Register-DatabricksConnectorDefinitions
Register-SalesforceConnectorDefinitions
Register-GitHubConnectorDefinitions
Register-CrowdStrikeConnectorDefinitions

$tempRoot = if ($env:TEMP) { $env:TEMP } elseif ($env:TMPDIR) { $env:TMPDIR } else { '/tmp' }
$outDir = Join-Path $tempRoot ("iw-buildscript-test-" + [guid]::NewGuid().ToString('N'))
New-Item -ItemType Directory -Path $outDir -Force | Out-Null

try {
    # 1. AWS SaaS BuildScript
    $awsDef = Get-IntegrationWizardDefinition -Id 'aws-saas-connector'
    $awsCtx = @{ IscExternalId = 'ext-123'; Access = 'ReadOnly'; RoleName = 'SailPointAWSRole'; Region = 'us-east-1' }
    $awsPath = Join-Path $outDir 'aws-saas.ps1'
    New-IntegrationWizardBuildScript -Definition $awsDef -Context $awsCtx -OutputPath $awsPath
    $awsContent = Get-Content -LiteralPath $awsPath -Raw
    Assert-True ($awsContent -like '*aws iam create-role*') 'AWS SaaS script contains aws iam create-role CLI command'
    Assert-True ($awsContent -like '*sts:AssumeRole*') 'AWS SaaS script configures sts:AssumeRole'

    # 2. Azure BuildScript
    $azDef = Get-IntegrationWizardDefinition -Id 'azure-connector'
    $azCtx = @{ ApplicationName = 'MyEntraApp'; Access = 'ReadOnly'; TenantId = 'tenant-1' }
    $azPath = Join-Path $outDir 'azure.ps1'
    New-IntegrationWizardBuildScript -Definition $azDef -Context $azCtx -OutputPath $azPath
    $azContent = Get-Content -LiteralPath $azPath -Raw
    Assert-True ($azContent -like '*az ad app create*') 'Azure script contains az ad app create CLI command'
    Assert-True ($azContent -like '*az ad sp create*') 'Azure script contains az ad sp create CLI command'

    # 3. Google Cloud BuildScript
    $gDef = Get-IntegrationWizardDefinition -Id 'google-saas-connector'
    $gCtx = @{ OrganizationId = 'org-1'; ProjectId = 'proj-1'; ImpersonateUser = 'admin@corp.com'; Access = 'ReadOnly' }
    $gPath = Join-Path $outDir 'google.ps1'
    New-IntegrationWizardBuildScript -Definition $gDef -Context $gCtx -OutputPath $gPath
    $gContent = Get-Content -LiteralPath $gPath -Raw
    Assert-True ($gContent -like '*gcloud iam service-accounts create*') 'Google script contains gcloud iam service-accounts create CLI command'
    Assert-True ($gContent -like '*gcloud services enable*') 'Google script contains gcloud services enable CLI command'

    # 4. Salesforce BuildScript
    $sfDef = Get-IntegrationWizardDefinition -Id 'salesforce-connector'
    $sfCtx = @{ InstanceUrl = 'https://acme.my.salesforce.com'; ConsumerKey = 'key-1'; ConsumerSecret = 'sec-1'; Feature = 'AgentDiscovery' }
    $sfPath = Join-Path $outDir 'salesforce.ps1'
    New-IntegrationWizardBuildScript -Definition $sfDef -Context $sfCtx -OutputPath $sfPath
    $sfContent = Get-Content -LiteralPath $sfPath -Raw
    Assert-True ($sfContent -like '*Validating Salesforce Connected App*') 'Salesforce script validates connected app'
    Assert-True ($sfContent -like '*Agentforce*') 'Salesforce script configures Agentforce'

    # 5. GitHub BuildScript
    $ghDef = Get-IntegrationWizardDefinition -Id 'github-connector'
    $ghCtx = @{ Organization = 'acme-corp'; Feature = 'AgentDiscovery' }
    $ghPath = Join-Path $outDir 'github.ps1'
    New-IntegrationWizardBuildScript -Definition $ghDef -Context $ghCtx -OutputPath $ghPath
    $ghContent = Get-Content -LiteralPath $ghPath -Raw
    Assert-True ($ghContent -like '*Validating GitHub organization*') 'GitHub script validates org'
    Assert-True ($ghContent -like '*Copilot*') 'GitHub script configures Copilot'

    # 6. CrowdStrike BuildScript
    $csDef = Get-IntegrationWizardDefinition -Id 'crowdstrike-connector'
    $csCtx = @{ BaseUrl = 'https://api.crowdstrike.com'; ClientId = 'client-xyz'; Access = 'ReadWrite'; Feature = 'Discover,IdentityProtection' }
    $csPath = Join-Path $outDir 'crowdstrike.ps1'
    New-IntegrationWizardBuildScript -Definition $csDef -Context $csCtx -OutputPath $csPath
    $csContent = Get-Content -LiteralPath $csPath -Raw
    Assert-True ($csContent -like '*oauth2/token*') 'CrowdStrike script requests OAuth2 token'
    Assert-True ($csContent -like '*devices/queries/devices-scroll*') 'CrowdStrike script queries host devices'
    Assert-True ($csContent -like '*hosts:write*') 'CrowdStrike script verifies ReadWrite containment scope'
    Assert-True ($csContent -like '*Falcon Discover*') 'CrowdStrike script configures Falcon Discover'
    Assert-True ($csContent -like '*Identity Threat Protection*') 'CrowdStrike script configures ITDR'
}
finally {
    if (Test-Path -LiteralPath $outDir) {
        Remove-Item -LiteralPath $outDir -Recurse -Force -ErrorAction SilentlyContinue
    }
}

Write-Host "PASS ($script:AssertionCount assertions)"