tests/Invoke-AWSVault.Tests.ps1

$DebugPreference = "Continue"

Describe "Invoke-AWSVault" {
  Import-Module .\posh-awsvault.psd1

  $global:TEST_VARS = @{
    AWS_PROFILE = "someprofile"
  }

  Mock Get-Item -ModuleName posh-awsvault -ParameterFilter { $Path -eq "Env:\AWS_PROFILE" } { @{ Value = $global:TEST_VARS.AWS_PROFILE } }
  Mock Set-Item -ModuleName posh-awsvault -ParameterFilter { $Path -like "Env:\AWS_PROFILE" } { $global:TEST_VARS.AWS_PROFILE = $Value }
  Mock Remove-Item -ModuleName posh-awsvault -ParameterFilter { $Path -eq "Env:\AWS_PROFILE" } { $global:TEST_VARS.AWS_PROFILE = $null }

  Mock Get-Command -ModuleName posh-awsvault { $Name }
  
  Context 'When Invoke-External is successful' {
    Mock Invoke-External -ModuleName posh-awsvault { 
      $global:TEST_VARS.AWS_PROFILE_WHEN_CALLED = $global:TEST_VARS.AWS_PROFILE
      Write-Debug "Invoke-External -Command $Command -Arguments $Arguments" 
    }

    Invoke-AWSVault somecommand someargument1 someargument2
    
    It "Passes the correct arguments to Invoke-External" {
      Assert-MockCalled Invoke-External -ModuleName posh-awsvault `
        -ParameterFilter { 
          $Command -eq "aws-vault" -and `
          (Compare-Object $Arguments @("exec", "someprofile", "somecommand", "someargument1", "someargument2")).Length -eq 0
        }
    }

    It "Unsets and resets AWS_PROFILE environment variable" {
      # Due to https://github.com/99designs/aws-vault/issues/410
      $global:TEST_VARS.AWS_PROFILE_WHEN_CALLED | Should -BeNullOrEmpty
      $global:TEST_VARS.AWS_PROFILE | Should -Be "someprofile"
    }
  }

  Context 'When Invoke-External throws' {
    Mock Invoke-External -ModuleName posh-awsvault { 
      $global:TEST_VARS.AWS_PROFILE_WHEN_CALLED = $global:TEST_VARS.AWS_PROFILE
      throw "This is an error."
    }

    It "Bubbles up the exception" {
      { Invoke-AWSVault somecommand someargument } | Should -Throw
    }

    It "Still resets the AWS_PROFILE environment variable" {
      $global:TEST_VARS.AWS_PROFILE | Should -Be "someprofile"
    }
  }

  Remove-Module posh-awsvault
}