Tests/OctopusServer.ps1

$currentFolder = Split-Path -Parent -Path $MyInvocation.MyCommand.Definition

$Module = 'Octopus'
$DSCResource = 'OctopusServer'
$moduleFolder = Split-Path -Parent -Path $currentFolder

Describe "$DSCResource Test-TargetResource"{

    
    Copy-Item "$moduleFolder\DSCResources\$DSCResource\$DSCResource.psm1" TestDrive:\script.ps1 -Force
   
    Mock Export-ModuleMember {return $true}

    . "TestDrive:\script.ps1"
    
    Context "Octopus server is installed and ensure is Present"{
        Mock Get-InstalledApp {
            $installedApps = New-Object psobject -Property @{
                                DisplayName = 'Octopus Deploy Server'
                                DisplayVersion = '1.2.2'
                                UninstallString = 'UninstallOcopus.exe'
                            }
            return $installedApps     
        }

        It "Should return true"{
            $secpasswd = ConvertTo-SecureString "MyPassword" -AsPlainText -Force
            $mycreds = New-Object System.Management.Automation.PSCredential("admin", $secpasswd)
            Test-TargetResource -ServerName $env:COMPUTERNAME -Port 8085 -Credentials $mycreds -Ensure "Present" | Should Be $True
        }
    }
    Context "Octopus server is not installed and ensure is present"{
        Mock Get-InstalledApp {
            $installedApps = New-Object psobject -Property @{
                                DisplayName = 'Other application'
                                DisplayVersion = '1.0.0'
                                UninstallString = 'uninstallapp.exe'
                            }
            return $installedApps     
        }

        It "Should return false"{
            $secpasswd = ConvertTo-SecureString "MyPassword" -AsPlainText -Force
            $mycreds = New-Object System.Management.Automation.PSCredential ("admin", $secpasswd)
            Test-TargetResource -ServerName $env:COMPUTERNAME -Port 8085 -Credentials $mycreds -Ensure "Present" | Should Be $False
        }
    }
    Context "Octopus server is installed and ensure is Absent"{
        Mock Get-InstalledApp {
            $installedApps = New-Object psobject -Property @{
                                DisplayName = 'Octopus Deploy Server'
                                DisplayVersion = '1.2.2'
                                UninstallString = 'UninstallOcopus.exe'
                            }
            return $installedApps     
        }

        It "Should return false"{
            $secpasswd = ConvertTo-SecureString "MyPassword" -AsPlainText -Force
            $mycreds = New-Object System.Management.Automation.PSCredential("admin", $secpasswd)
            Test-TargetResource -ServerName $env:COMPUTERNAME -Port 8085 -Credentials $mycreds -Ensure "Absent" | Should Be $False
        }
    }
    Context "Octopus server is not installed and ensure is Absent"{
        Mock Get-InstalledApp {
            $installedApps = New-Object psobject -Property @{
                                DisplayName = 'Other application'
                                DisplayVersion = '1.0.0'
                                UninstallString = 'uninstallapp.exe'
                            }
            return $installedApps     
        }

        It "Should return true"{
            $secpasswd = ConvertTo-SecureString "MyPassword" -AsPlainText -Force
            $mycreds = New-Object System.Management.Automation.PSCredential ("admin", $secpasswd)
            Test-TargetResource -ServerName $env:COMPUTERNAME -Port 8085 -Credentials $mycreds -Ensure "Absent" | Should Be $True
        }
    }
}


Describe "$DSCResource Get-TargetResource"{

    Copy-Item "$moduleFolder\DSCResources\$DSCResource\$DSCResource.psm1" TestDrive:\script.ps1 -Force
    Mock Export-ModuleMember {return $true}

    . "TestDrive:\script.ps1"

    Context "Octopus server is installed"{
        Mock Get-InstalledApp {
            $installedApps = New-Object psobject -Property @{
                                DisplayName = 'Octopus Deploy Server'
                                DisplayVersion = '1.2.2'
                                UninstallString = 'UninstallOcopus.exe'
                            }
            return $installedApps     
        }
        It "Should return hashtable with Ensure Present"{
            $value = Get-TargetResource -ServerName $env:COMPUTERNAME
            $value.Ensure | Should Be 'Present'
        }
    }
    Context "Octopus server is not installed"{
        Mock Get-InstalledApp {
            $installedApps = New-Object psobject -Property @{
                                DisplayName = 'Mock app'
                                DisplayVersion = '1.0.0'
                                UninstallString = 'MockApp.exe'
                            }
            return $installedApps     
        }
        It "Should return hashtable with Ensure Absent"{
            $value = Get-TargetResource -ServerName $env:COMPUTERNAME
            $value.Ensure | Should Be 'Absent'
        }
    }
}


Describe "$DSCResource Set-TargetResource"{

    Copy-Item "$moduleFolder\DSCResources\$DSCResource\$DSCResource.psm1" TestDrive:\script.ps1 -Force
    
    Mock Export-ModuleMember {return $true}
    . "TestDrive:\script.ps1"

    Mock Get-InstalledApp {
        $installedApps = New-Object psobject -Property @{
                            DisplayName = 'Octopus Deploy Server'
                            DisplayVersion = '1.2.2'
                            UninstallString = 'UninstallOcopus.exe'
                        }
        return $installedApps     
    }

    Context "Ensure is Present"{
        Mock Install-OctopusServer {} -Verifiable
        Mock Set-OctopusConfiguration {} -Verifiable
        It "Should call Install-OctopusServer and Set-OctopusConfiguration"{
            $secpasswd = ConvertTo-SecureString "MyPassword" -AsPlainText -Force
            $mycreds = New-Object System.Management.Automation.PSCredential ("admin", $secpasswd)
            Set-TargetResource -ServerName $env:COMPUTERNAME -Port 8085 -Credentials $mycreds -Ensure "Present"
            Assert-VerifiableMocks
        }
    }
    Context "Ensure is Absent"{
        Mock Uninstall-OctopusServer {} -Verifiable
        Mock Remove-OctopusConfiguration {} -Verifiable
        It "Should call Install-OctopusServer and Set-OctopusConfiguration"{
            $secpasswd = ConvertTo-SecureString "MyPassword" -AsPlainText -Force
            $mycreds = New-Object System.Management.Automation.PSCredential ("admin", $secpasswd)
            Set-TargetResource -ServerName $env:COMPUTERNAME -Port 8085 -Credentials $mycreds -Ensure "Absent"
            Assert-VerifiableMocks
        }
    }
}