Tests/Test.psm1

$PSScriptRoot = $MyInvocation.MyCommand.Path

$script:Az_Profile = 'Az.Accounts'
$script:Az_Resources = 'Az.Resources'
$script:Az_Compute ='Az.Compute'
$script:Az_Network = 'Az.Network'
$script:Az_Storage = 'Az.Storage'

function Invoke-AzurePSDriveTests([string]$subscriptionName = 'AutomationTeam')
{
    $testResultsFile = Microsoft.PowerShell.Management\Join-Path -Path $PSScriptRoot -ChildPath 'AzurePSDrive.TestResults.xml'

    Write-Host -ForegroundColor Green "Invoking Pester tests"
    # https://www.sapien.com/blog/2016/06/17/how-to-pass-parameters-to-a-pester-test-script/
    Invoke-Pester -Script @{Path = $PSScriptRoot; Parameters = @{subscriptionName = $subscriptionName}} -OutputFormat NUnitXml -OutputFile $testResultsFile

    $testResults += [xml](Get-Content -Raw -Path $testResultsFile)
    $failedTestCount = 0
    $testResults | ForEach-Object { $failedTestCount += ([int]$_.'test-results'.failures); $total += ([int]$_.'test-results'.total) }
   
    if ($failedTestCount -or $total -eq 0)
    {
        throw "$failedTestCount tests failed"
    }
}

function Publish-AzurePSDriveTestResults
{
    param($appVeyorID)

    $testResultsFile = Microsoft.PowerShell.Management\Join-Path -Path $PSScriptRoot -ChildPath 'AzurePSDrive.TestResults.xml'
    Get-ChildItem -Path $testResultsFile | ForEach-Object {
            (New-Object 'System.Net.WebClient').UploadFile("https://ci.appveyor.com/api/testresults/nunit/$appVeyorID", "$($_.FullName)")
    }
}

# Ensure all Test dependencies are installed on the machine
function Initialize-TestEnvironment
{
    if ($IsCoreCLR)
    {
        Initialize-TestEnvironmentPSCore
    }
    else
    {
        $dependencyInstalled = (Get-Module -ListAvailable $script:Az_Resources | ForEach-Object Version) -ge [version]"0.2"
        if (-not $dependencyInstalled)
        {
            Save-Module -Name $script:Az_Resources -MinimumVersion 0.2.0 -Force -Verbose -path "$($env:ProgramFiles)\WindowsPowerShell\Modules"
        }

        $dependencyInstalled = (Get-Module -ListAvailable $script:Az_Profile | ForEach-Object Version) -ge [version]"0.2"
        if (-not $dependencyInstalled)
        {
            Save-Module -Name $script:Az_Profile -MinimumVersion 0.2.0 -Force -Verbose -path "$($env:ProgramFiles)\WindowsPowerShell\Modules"
        }

        $dependencyInstalled = (Get-Module -ListAvailable $script:Az_Compute | ForEach-Object Version) -ge [version]"0.2"
        if (-not $dependencyInstalled)
        {
            Save-Module -Name $script:Az_Compute -MinimumVersion 0.2.0 -Force -Verbose -path "$($env:ProgramFiles)\WindowsPowerShell\Modules"
        }

        $dependencyInstalled = (Get-Module -ListAvailable $script:Az_Network | ForEach-Object Version) -ge [version]"0.2"
        if (-not $dependencyInstalled)
        {
            Save-Module -Name $script:Az_Network -MinimumVersion 0.2.0 -Force -Verbose -path "$($env:ProgramFiles)\WindowsPowerShell\Modules"
        }

        $dependencyInstalled = (Get-Module -ListAvailable $script:Az_Storage | ForEach-Object Version) -ge [version]"0.2"
        if (-not $dependencyInstalled)
        {
            Save-Module -Name $script:Az_Storage -MinimumVersion 0.2.0 -Force -Verbose -path "$($env:ProgramFiles)\WindowsPowerShell\Modules"
        }

        $SHiPSInstalled = Get-Module -ListAvailable -Name SHiPS 
        if (-not $SHiPSInstalled)
        {
            Save-Module -Name SHiPS -Force -path "$($env:ProgramFiles)\WindowsPowerShell\Modules"
        }

        Import-Module -Name $script:Az_Resources -Force -Verbose
        Import-Module -Name $script:Az_Profile -Force -Verbose
        Import-Module -Name $script:Az_Compute -Force -Verbose
        Import-Module -Name $script:Az_Network -Force -Verbose
        Import-Module -Name $script:Az_Storage -Force -Verbose    
    }

    Import-Module -Name SHiPS -Force -Verbose
    & $script:Az_Profile\Disable-AzDataCollection
}

# Ensure all Test dependencies are installed when using PowerShell Core based environment
function Initialize-TestEnvironmentPSCore
{
    Install-Module -Name $script:Az_Resources -Force -Verbose
    Install-Module -Name $script:Az_Profile -Force -Verbose
    Install-Module -Name $script:Az_Compute -Force -Verbose
    Install-Module -Name $script:Az_Network -Force -Verbose
    Install-Module -Name $script:Az_Storage -Force -Verbose    
}


# Login to Az using Service Principal
function Login-Az
{
    # These values are supplied from the environment, such as using Appveyor encryption
    # https://www.appveyor.com/docs/build-configuration/#secure-variables

    $azureAdAppId = $env:azureADAppId
    $password = $env:azurePassword
    $tenantId = $env:azureTenantId

    $secureString = ConvertTo-SecureString -String $password -AsPlainText -Force
    $cred = New-Object System.Management.Automation.PSCredential($azureAdAppId, $secureString)

    & $script:Az_Profile\Login-AzAccount -ServicePrincipal -Credential $cred -TenantId $tenantId -Verbose -ErrorAction Stop
}