Tests/Import-OriAzBopPsd.tests.ps1

. $PSScriptRoot\..\Private\Invoke-ResolveDependency.ps1
. $PSScriptRoot\..\Public\Wait-OriAzBopModuleComplete.ps1
. $PSScriptRoot\..\Public\Register-OriAzBopRepository.ps1
. $PSScriptRoot\..\Public\Install-OriAzBopPrerequisity.ps1
. $PSScriptRoot\..\Private\Invoke-OriAzExrExceptionRetry.ps1
. $PSScriptRoot\..\Public\Import-OriAzBopPsd.ps1

Describe 'OriAzBopBoostrapOriPsgallery\Import-OriAzBopPsd' {
    
  Context 'Succesfull excution Module is not yet installed, install with prefix' {    

    Mock -CommandName Invoke-WebRequest -Verifiable -MockWith {
      # Some source for Invoke-Expression
      return ";"
    }
    $testPath = "TestDrive:\test.psd1"
    Set-Content $testPath -value "my test text."

    Mock -CommandName Install-OriAzBopPrerequisity -Verifiable
    Mock -CommandName Register-OriAzBopRepository -Verifiable
    Mock -CommandName Invoke-ResolveDependency -Verifiable
    Mock -CommandName Wait-OriAzBopModuleComplete -Verifiable
    Mock -CommandName Import-Module -Verifiable
    Mock -CommandName Write-Verbose -Verifiable

    it 'Should be succesfully processed' {
      {
        $password = ConvertTo-SecureString 'xbchuuuuhaaaatest' -AsPlainText -Force
        $RepositoryCredential = New-Object System.Management.Automation.PSCredential 'PackageManage@oriflame.net', $password 

        $testPath = "TestDrive:\test.psd1"

        Import-OriAzBopPsd `
          -Path $testPath `
          -Credential $RepositoryCredential `
          -Prefix "XXX"

      } | Should -Not -Throw
    }      
      
    Assert-MockCalled Invoke-WebRequest -Times 1 -Exactly -ParameterFilter {
      $Uri -eq "https://raw.githubusercontent.com/microsoft/artifacts-credprovider/master/helpers/installcredprovider.ps1"
    }
      
    Assert-MockCalled Install-OriAzBopPrerequisity -Times 1 -Exactly -ParameterFilter {
      $Name -eq "PowerShellGet" -and $MinimumVersion -eq [Version]::new(2, 2, 5)
    }

    Assert-MockCalled Install-OriAzBopPrerequisity -Times 1 -Exactly -ParameterFilter {
      $Name -eq "PackageManagement" -and $MinimumVersion -eq [Version]::new(1, 4, 7)
    }
    Assert-MockCalled Register-OriAzBopRepository -Times 1 -Exactly -ParameterFilter {
      $PsProjectName.Contains("PackageManagementFeed") -and `
        $NugetProjectName.Contains("DeploymentPackages") -and `
        ![string]::IsNullOrEmpty($RepositoryCredential)
    }
    Assert-MockCalled Invoke-ResolveDependency -Times 1 -Exactly -ParameterFilter {
      $InstalledLocation -eq "TestDrive:\test.psd1" `
        -and ![string]::IsNullOrEmpty($Credential) `
        -and $Repository -eq "PackageManagementFeed" `
    }
    Assert-MockCalled Wait-OriAzBopModuleComplete -Times 1 -Exactly
    Assert-MockCalled Import-Module -Times 1 -Exactly -ParameterFilter {
      $Prefix -eq "XXX"
    }

    Assert-MockCalled Write-Verbose -Times 1 -Exactly -ParameterFilter {
      $Message -eq "-- End of Import-OriAzBopPsd --"
    }
       
    Assert-VerifiableMock
  
  }

  Context 'Succesfull excution Module is not yet installed, install without prefix' {    

    Mock -CommandName Invoke-WebRequest -Verifiable -MockWith {
      # Some source for Invoke-Expression
      return ";"
    }
    $testPath = "TestDrive:\test.psd1"
    Set-Content $testPath -value "my test text."

    Mock -CommandName Install-OriAzBopPrerequisity -Verifiable
    Mock -CommandName Register-OriAzBopRepository -Verifiable
    Mock -CommandName Invoke-ResolveDependency -Verifiable
    Mock -CommandName Wait-OriAzBopModuleComplete -Verifiable
    Mock -CommandName Import-Module -Verifiable
    Mock -CommandName Write-Verbose -Verifiable

    it 'Should be succesfully processed' {
      {
        $password = ConvertTo-SecureString 'xbchuuuuhaaaatest' -AsPlainText -Force
        $RepositoryCredential = New-Object System.Management.Automation.PSCredential 'PackageManage@oriflame.net', $password 

        $testPath = "TestDrive:\test.psd1"

        Import-OriAzBopPsd `
          -Path $testPath `
          -Credential $RepositoryCredential

      } | Should -Not -Throw
    }      
      
    Assert-MockCalled Invoke-WebRequest -Times 1 -Exactly -ParameterFilter {
      $Uri -eq "https://raw.githubusercontent.com/microsoft/artifacts-credprovider/master/helpers/installcredprovider.ps1"
    }
      
    Assert-MockCalled Install-OriAzBopPrerequisity -Times 1 -Exactly -ParameterFilter {
      $Name -eq "PowerShellGet" -and $MinimumVersion -eq [Version]::new(2, 2, 5)
    }

    Assert-MockCalled Install-OriAzBopPrerequisity -Times 1 -Exactly -ParameterFilter {
      $Name -eq "PackageManagement" -and $MinimumVersion -eq [Version]::new(1, 4, 7)
    }
    Assert-MockCalled Register-OriAzBopRepository -Times 1 -Exactly -ParameterFilter {
      $PsProjectName.Contains("PackageManagementFeed") -and `
        $NugetProjectName.Contains("DeploymentPackages") -and `
        ![string]::IsNullOrEmpty($RepositoryCredential)
    }
    Assert-MockCalled Invoke-ResolveDependency -Times 1 -Exactly -ParameterFilter {
      $InstalledLocation -eq "TestDrive:\test.psd1" `
        -and ![string]::IsNullOrEmpty($Credential) `
        -and $Repository -eq "PackageManagementFeed" `
    }
    Assert-MockCalled Wait-OriAzBopModuleComplete -Times 1 -Exactly
    Assert-MockCalled Import-Module -Times 1 -Exactly -ParameterFilter {
      [string]::IsNullOrEmpty($Prefix) 
    }

    Assert-MockCalled Write-Verbose -Times 1 -Exactly -ParameterFilter {
      $Message -eq "-- End of Import-OriAzBopPsd --"
    }
       
    Assert-VerifiableMock
  
  }

  Context 'Succesfull excution Module is not yet installed skip install credentail provider' {    

    Mock -CommandName Invoke-WebRequest -MockWith {
      # Some source for Invoke-Expression
      return ";"
    }
    $testPath = "TestDrive:\test.psd1"
    Set-Content $testPath -value "my test text."

    Mock -CommandName Install-OriAzBopPrerequisity -Verifiable
    Mock -CommandName Register-OriAzBopRepository -Verifiable
    Mock -CommandName Invoke-ResolveDependency -Verifiable
    Mock -CommandName Wait-OriAzBopModuleComplete -Verifiable
    Mock -CommandName Import-Module -Verifiable
    Mock -CommandName Write-Verbose -Verifiable

    it 'Should be succesfully processed' {
      {
        $password = ConvertTo-SecureString 'xbchuuuuhaaaatest' -AsPlainText -Force
        $RepositoryCredential = New-Object System.Management.Automation.PSCredential 'PackageManage@oriflame.net', $password 

        $testPath = "TestDrive:\test.psd1"

        Import-OriAzBopPsd `
          -Path $testPath `
          -Credential $RepositoryCredential `
          -SkipInstallCredProvider

      } | Should -Not -Throw
    }      
      
    Assert-MockCalled Invoke-WebRequest -Times 0 -Exactly -ParameterFilter {
      $Uri -eq "https://raw.githubusercontent.com/microsoft/artifacts-credprovider/master/helpers/installcredprovider.ps1"
    }
      
    Assert-MockCalled Install-OriAzBopPrerequisity -Times 1 -Exactly -ParameterFilter {
      $Name -eq "PowerShellGet" -and $MinimumVersion -eq [Version]::new(2, 2, 5)
    }

    Assert-MockCalled Install-OriAzBopPrerequisity -Times 1 -Exactly -ParameterFilter {
      $Name -eq "PackageManagement" -and $MinimumVersion -eq [Version]::new(1, 4, 7)
    }
    Assert-MockCalled Register-OriAzBopRepository -Times 1 -Exactly -ParameterFilter {
      $PsProjectName.Contains("PackageManagementFeed") -and `
        $NugetProjectName.Contains("DeploymentPackages") -and `
        ![string]::IsNullOrEmpty($RepositoryCredential)
    }
    Assert-MockCalled Invoke-ResolveDependency -Times 1 -Exactly -ParameterFilter {
      $InstalledLocation -eq "TestDrive:\test.psd1" `
        -and ![string]::IsNullOrEmpty($Credential) `
        -and $Repository -eq "PackageManagementFeed" `
    }
    Assert-MockCalled Wait-OriAzBopModuleComplete -Times 1 -Exactly
    Assert-MockCalled Import-Module -Times 1 -Exactly

    Assert-MockCalled Write-Verbose -Times 1 -Exactly -ParameterFilter {
      $Message -eq "-- End of Import-OriAzBopPsd --"
    }
       
    Assert-VerifiableMock
  
  }

  Context 'Succesfull excution Module is not yet installed with skip import' {    

    Mock -CommandName Invoke-WebRequest -Verifiable -MockWith {
      # Some source for Invoke-Expression
      return ";"
    }
    $testPath = "TestDrive:\test.psd1"
    Set-Content $testPath -value "my test text."

    Mock -CommandName Install-OriAzBopPrerequisity -Verifiable
    Mock -CommandName Register-OriAzBopRepository -Verifiable
    Mock -CommandName Invoke-ResolveDependency -Verifiable
    Mock -CommandName Wait-OriAzBopModuleComplete
    Mock -CommandName Import-Module
    Mock -CommandName Write-Verbose -Verifiable

    it 'Should be succesfully processed' {
      {
        $password = ConvertTo-SecureString 'xbchuuuuhaaaatest' -AsPlainText -Force
        $RepositoryCredential = New-Object System.Management.Automation.PSCredential 'PackageManage@oriflame.net', $password 

        $testPath = "TestDrive:\test.psd1"

        Import-OriAzBopPsd `
          -Path $testPath `
          -Credential $RepositoryCredential `
          -SkipImport

      } | Should -Not -Throw
    }      
    
    Assert-MockCalled Invoke-WebRequest -Times 1 -Exactly -ParameterFilter {
      $Uri -eq "https://raw.githubusercontent.com/microsoft/artifacts-credprovider/master/helpers/installcredprovider.ps1"
    }
    
    Assert-MockCalled Install-OriAzBopPrerequisity -Times 1 -Exactly -ParameterFilter {
      $Name -eq "PowerShellGet" -and $MinimumVersion -eq [Version]::new(2, 2, 5)
    }

    Assert-MockCalled Install-OriAzBopPrerequisity -Times 1 -Exactly -ParameterFilter {
      $Name -eq "PackageManagement" -and $MinimumVersion -eq [Version]::new(1, 4, 7)
    }
    
    Assert-MockCalled Register-OriAzBopRepository -Times 1 -Exactly -ParameterFilter {
      $PsProjectName.Contains("PackageManagementFeed") -and `
        $NugetProjectName.Contains("DeploymentPackages") -and `
        ![string]::IsNullOrEmpty($RepositoryCredential)
    }
    Assert-MockCalled Invoke-ResolveDependency -Times 1 -Exactly -ParameterFilter {
      $InstalledLocation -eq "TestDrive:\test.psd1" `
        -and ![string]::IsNullOrEmpty($Credential) `
        -and $Repository -eq "PackageManagementFeed" `
    }
    Assert-MockCalled Wait-OriAzBopModuleComplete -Times 0 -Exactly
    Assert-MockCalled Import-Module -Times 0 -Exactly

    Assert-MockCalled Write-Verbose -Times 1 -Exactly -ParameterFilter {
      $Message -eq "-- End of Import-OriAzBopPsd --"
    }
     
    Assert-VerifiableMock

  }

}