Public/Add-EntraIDAutomationAccountMSIAccessTokenProfile.tests.ps1

BeforeAll {
    $Script:Module = Import-Module "$PSScriptRoot/../" -Force -PassThru
    $Script:SystemAssignedManagedIdentityClientId = "11223344-5566-7788-99aa-bbccddeeff00"
    $Script:UserAssignedManagedIdentityClientId = "abcdefab-cdef-cdef-cdef-abcdefabcdef"
    $Script:TrustingApplicationClientId = "00112233-4455-6677-8899-aabbccddeeff"
    $Script:TenantId = "12345678-1234-1234-1234-123456789012"
}

Describe "Add-EntraIDAutomationAccountMSIAccessTokenProfile.1" -Tag Mocked {
    It "Fails when running without the IDENTITY_HEADER" {
        $ENV:IDENTITY_HEADER = $null
        $Name = (New-Guid).ToString()
        
        { Add-EntraIDAutomationAccountMSIAccessTokenProfile -Name $Name } | Should -Throw
    }

    It "Fails when running without the IDENTITY_ENDPOINT" {
        $ENV:IDENTITY_HEADER = "..."
        $ENV:IDENTITY_ENDPOINT = $null
        $Name = (New-Guid).ToString()
        
        { Add-EntraIDAutomationAccountMSIAccessTokenProfile -Name $Name } | Should -Throw
    }
}

Describe "Add-EntraIDAutomationAccountMSIAccessTokenProfile.2" -Tag Mocked {
    BeforeAll {
        Mock -ModuleName $Script:Module.Name -CommandName Invoke-RestMethod -ParameterFilter { $Uri -like "http://dummy.fortytwo.io/" } -MockWith {
            Write-Verbose "Mocked Invoke-RestMethod called with Uri: $Uri" -Verbose

            if($headers.'X-IDENTITY-HEADER' -ne "some_value") {
                throw "Invalid IDENTITY_HEADER"
            }

            $clientid = $Body["client_id"] ?? $Script:SystemAssignedManagedIdentityClientId
            $resource = $Body["resource"] ?? "https://graph.microsoft.com"

            return @{
                access_token = New-DummyJWT -Aud $resource -Iss "https://sts.windows.net/$($Script:TenantId)/" -Sub $clientid -Verbose
                expires_in   = "3599"
                expires_on   = (Get-Date -Date (Get-Date).AddHours(1) -UFormat %s)
            }
        }

        Mock -ModuleName $Script:Module.Name -CommandName Invoke-RestMethod -ParameterFilter { $Uri -like "https://login.microsoftonline.com/$($Script:TenantId)/oauth2/token" } -MockWith {
            Write-Verbose "Mocked Invoke-RestMethod called with Uri: $Uri" -Verbose
            
            $ClientId = $Body["client_id"]
            $scope = $Body["scope"] ?? "https://graph.microsoft.com/.default"

            return @{
                access_token = New-DummyJWT -Aud ($scope.Replace("/.default","")) -Iss "https://sts.windows.net/$($Script:TenantId)/" -Sub $clientid -Verbose
                expires_in   = "3599"
                expires_on   = (Get-Date -Date (Get-Date).AddHours(1) -UFormat %s)
            }
        }
    }

    It "Returns an access token for system assigned managed identity when environment variables are set" {
        $ENV:IDENTITY_HEADER = "some_value"
        $ENV:IDENTITY_ENDPOINT = "http://dummy.fortytwo.io/"
        $Name = (New-Guid).ToString()

        { Add-EntraIDAutomationAccountMSIAccessTokenProfile -Name $Name } | Should -Not -Throw
        $AccessToken = Get-EntraIDAccessToken -Profile $Name | ConvertFrom-EntraIDAccessToken

        $AccessToken.Payload.iss | Should -BeLike "*$($Script:TenantId)*"
        $AccessToken.Payload.aud | Should -Be "https://graph.microsoft.com"
        $AccessToken.Payload.sub | Should -Be $Script:SystemAssignedManagedIdentityClientId
    }

    It "Returns an access token for user assigned managed identity when environment variables are set" {
        $ENV:IDENTITY_HEADER = "some_value"
        $ENV:IDENTITY_ENDPOINT = "http://dummy.fortytwo.io/"
        $Name = (New-Guid).ToString()

        { Add-EntraIDAutomationAccountMSIAccessTokenProfile -Name $Name -ClientId $Script:UserAssignedManagedIdentityClientId } | Should -Not -Throw
        $AccessToken = Get-EntraIDAccessToken -Profile $Name | ConvertFrom-EntraIDAccessToken

        $AccessToken.Payload.iss | Should -BeLike "*$($Script:TenantId)*"
        $AccessToken.Payload.aud | Should -Be "https://graph.microsoft.com"
        $AccessToken.Payload.sub | Should -Be $Script:UserAssignedManagedIdentityClientId
    }

    It "Returns an access token for the trusting application when environment variables are set" {
        $ENV:IDENTITY_HEADER = "some_value"
        $ENV:IDENTITY_ENDPOINT = "http://dummy.fortytwo.io/"
        $Name = (New-Guid).ToString()

        { Add-EntraIDAutomationAccountMSIAccessTokenProfile -Name $Name -TenantId $Script:TenantId -TrustingApplicationClientId $Script:TrustingApplicationClientId -ClientId $Script:UserAssignedManagedIdentityClientId } | Should -Not -Throw
        $AccessToken = Get-EntraIDAccessToken -Profile $Name | ConvertFrom-EntraIDAccessToken

        $AccessToken.Payload.iss | Should -BeLike "*$($Script:TenantId)*"
        $AccessToken.Payload.aud | Should -Be "https://graph.microsoft.com"
        $AccessToken.Payload.sub | Should -Be $Script:TrustingApplicationClientId
    }
}