ps/Modules/Alkami.PowerShell.ServerManagement/Public/Set-FileBeats.tests.ps1
2023-05-30 22:51:22 -07:00

220 lines
9.9 KiB
PowerShell

. $PSScriptRoot\..\..\Load-PesterModules.ps1
$here = Split-Path -Parent $MyInvocation.MyCommand.Path
$sut = (Split-Path -Leaf $MyInvocation.MyCommand.Path) -replace '\.tests\.', '.'
$functionPath = Join-Path -Path $here -ChildPath $sut
Write-Host "Overriding SUT: $functionPath"
Import-Module $functionPath -Force
$moduleForMock = ""
#region Set-FileBeats
Describe "Set-FileBeats" {
# Variables for the Tests
# Output for Validation Purposes
[array]$global:OutFile = @()
# Legit Ports to Pass to the Tests
[array]$validPorts = @(5045, 5046, 5047, 5048)
# Temp file to write content to
$tempPath = [System.IO.Path]::GetTempFileName()
Write-Warning ("Using temp path: $tempPath for tests")
# Sample File Content to Update
$sampleFile = @"
#================================ Outputs =====================================
#----------------------------- Logstash output --------------------------------
output.logstash:
# The Logstash hosts
# This value should be modified during install to point to the logstash dns, with the port for the appropriate environment
hosts: ["orb.os-logstash.haystack.prod.alkami.net:PORT"]
# This is Custom Testing Stuff.
"@
#TODO: Actually fake this instead of the redirection for $fileBeatsDefaultSourceConfigPath
#TODO: Mock Get-Content with ParamFilter and use one to return $sampleFile and $templateFile(TBD)
#TODO: Abandon the filesystem entirely. Either Out-File/Write-AllLines() works or it doesn't
# Either way, it's out of scope and mocking/faking will suit our needs AND be faster
#$newTempFile = [System.IO.Path]::GetTempFileName()
#$FAKE_SourceConfigurationPath = (Get-ChildItem $newTempFile).Directory.FullName
#$templateFile(TBD) | Out-File (Join-Path $FAKE_SourceConfigurationPath "filebeat.yml") -Force
$hereParent = Split-Path -Path $here -Parent
$fileBeatsDefaultSourceConfigPath = Join-Path -Path $hereParent -ChildPath "FileBeatConfiguration"
Mock -ModuleName $moduleForMock -CommandName Test-IsMicroServer { return $false }
Mock -ModuleName $moduleForMock -CommandName Test-IsAws { return $true }
# Clean the TempPath File as Needed
function Clean-TempPath {
if (Test-Path $tempPath) {
Remove-Item $tempPath -Force
}
}
Context "When a Port is Specified" {
It "Writes a Warning if the Port Doesn't Match an Environment" {
{ (Set-FileBeats -Port 9999 3>&1) -match "Could Not Find an Environment Matching Port 9999" } | Should -BeTrue
}
It "Uses the Specified Port in the Configuration" {
$sampleFile | Out-File $tempPath -Force
$global:OutFile = $null
Mock -ModuleName $moduleForMock -CommandName Out-File { $global:OutFile = $_ }
foreach ($testPort in $validPorts) {
Set-FileBeats -Port $testPort -ConfigFilePath $tempPath -SourceConfigurationPath $fileBeatsDefaultSourceConfigPath
$global:OutFile -match "orb.os-logstash.haystack.prod.alkami.net:$testPort" | Should -BeTrue
}
}
}
Context "When a ConfigPath is Specified" {
# Must use explicit PARAM for "SourceConfigurationPath" because ps1 path is deeper than psm1 path
It "Should Throw if the File Does Not Exist" {
{ Set-FileBeats -Port $validPorts[0] -TargetConfigPath "aisjdfioajsofijasdoifasd" } | Should -Throw
}
It "Should Throw if the Parameter is a Path" {
{ Set-FileBeats -Port $validPorts[0] -TargetConfigPath "C:\Windows" } | Should -Throw
}
It "Should Use the Specified Path" {
Clean-TempPath
$sampleFile | Out-File $tempPath -Force
Set-FileBeats -Port $validPorts[0] -TargetConfigPath $tempPath -SourceConfigurationPath $fileBeatsDefaultSourceConfigPath
$tempPath | Should -FileContentMatch "orb.os-logstash.haystack.prod.alkami.net:$($validPorts[0])"
}
}
Context "When a Custom Source Configuration File is Provided" {
It "Should Throw if the File Doesn't Exist" {
$nonExistantFile = [System.IO.Path]::GetTempFileName()
{ Set-FileBeats -Port $validPorts[0] -SourceConfigurationPath $nonExistantFile } | Should -Throw
}
It "Should Use the Custom Source File" {
$newTempFile = [System.IO.Path]::GetTempFileName()
$tempConfigPath = (Get-ChildItem $newTempFile).Directory.FullName
$sampleFile | Out-File (Join-Path $tempConfigPath "filebeat.yml") -Force
Set-FileBeats -Port $validPorts[0] -SourceConfigurationPath $tempConfigPath -TargetConfigPath $newTempFile
$newTempFile | Should -FileContentMatch "This is Custom Testing Stuff"
}
}
Context "Server Role Instrumentation" {
It "Should Use the Parameter as Provided from the Command Line" {
Clean-TempPath
$sampleFile | Out-File $tempPath -Force
Set-FileBeats -Port $validPorts[0] -ServerRole "Foo" -TargetConfigPath $tempPath -SourceConfigurationPath $fileBeatsDefaultSourceConfigPath
$tempPath | Should -FileContentMatch "serverRole: Foo"
}
It "Should Use 'Web' if IfWebServer is True and No Parameter is Provided" {
Mock -ModuleName $moduleForMock -CommandName Test-IsAppServer { return $false }
Mock -ModuleName $moduleForMock -CommandName Test-IsWebServer { return $true }
Clean-TempPath
$sampleFile | Out-File $tempPath -Force
Set-FileBeats -Port $validPorts[0] -TargetConfigPath $tempPath -SourceConfigurationPath $fileBeatsDefaultSourceConfigPath
$tempPath | Should -FileContentMatch "serverRole: Web"
}
It "Should Use 'App' if IfAppServer is True and No Parameter is Provided" {
Mock -ModuleName $moduleForMock -CommandName Test-IsAppServer { return $true }
Mock -ModuleName $moduleForMock -CommandName Test-IsWebServer { return $false }
Clean-TempPath
$sampleFile | Out-File $tempPath -Force
Set-FileBeats -Port $validPorts[0] -TargetConfigPath $tempPath -SourceConfigurationPath $fileBeatsDefaultSourceConfigPath
$tempPath | Should -FileContentMatch "serverRole: App"
}
It "Should Use 'Unknown' if IfAppServer is false and Test-IsWebServer is false and No Parameter is Provided" {
Mock -ModuleName $moduleForMock -CommandName Test-IsAppServer { return $false }
Mock -ModuleName $moduleForMock -CommandName Test-IsWebServer { return $false }
Clean-TempPath
$sampleFile | Out-File $tempPath -Force
Set-FileBeats -Port $validPorts[0] -TargetConfigPath $tempPath -SourceConfigurationPath $fileBeatsDefaultSourceConfigPath
$tempPath | Should -FileContentMatch "serverRole: Unknown"
}
It "Should Use 'Unknown' if IfAppServer / Test-IsWebServer throws and No Parameter is Provided" {
Clean-TempPath
$sampleFile | Out-File $tempPath -Force
Set-FileBeats -Port $validPorts[0] -TargetConfigPath $tempPath -SourceConfigurationPath $fileBeatsDefaultSourceConfigPath
$tempPath | Should -FileContentMatch "serverRole: Unknown"
}
}
Context "Server Group Instrumentation" {
It "Should Use the Parameter as Provided from the Command Line" {
Clean-TempPath
$sampleFile | Out-File $tempPath -Force
Set-FileBeats -Port $validPorts[0] -ServerGroup "Foo" -TargetConfigPath $tempPath -SourceConfigurationPath $fileBeatsDefaultSourceConfigPath
$tempPath | Should -FileContentMatch "serverGroup: 'Foo'"
}
It "Should Use the Environmental Variable POD if Present" {
# REQUIRES Admin - WILL FAIL IN VSCODE
[Environment]::SetEnvironmentVariable("POD", "FooBar", [System.EnvironmentVariableTarget]::Machine)
$sampleFile | Out-File $tempPath -Force
Set-FileBeats -Port $validPorts[0] -TargetConfigPath $tempPath -SourceConfigurationPath $fileBeatsDefaultSourceConfigPath
# REQUIRES Admin - WILL FAIL IN VSCODE
[Environment]::SetEnvironmentVariable("POD", $null, [System.EnvironmentVariableTarget]::Machine)
$tempPath | Should -FileContentMatch "serverGroup: 'FooBar'"
}
it "Should use 'unknown' if no parameter as provided and the env variable is not set" {
Clean-TempPath
$samplefile | Out-File $temppath -Force
Set-FileBeats -Port $validports[0] -TargetConfigPath $temppath -SourceConfigurationPath $fileBeatsDefaultSourceConfigPath
$tempPath | Should -FileContentMatch "serverGroup: 'Unknown'"
}
}
Context "Server Timezone Instrumentation" {
It "Should Use the Parameter as Provided from the Command Line" {
Clean-TempPath
$sampleFile | Out-File $tempPath -Force
Set-FileBeats -Port $validPorts[0] -Timezone "Foo" -TargetConfigPath $tempPath -SourceConfigurationPath $fileBeatsDefaultSourceConfigPath
$tempPath | Should -FileContentMatch "timezone: Foo"
}
It "Should Be Chicago if not in AWS" {
Mock -ModuleName $moduleForMock -CommandName Test-IsAws { $false }
Clean-TempPath
$sampleFile | Out-File $tempPath -Force
Set-FileBeats -Port $validPorts[0] -TargetConfigPath $tempPath -SourceConfigurationPath $fileBeatsDefaultSourceConfigPath
$tempPath | Should -FileContentMatch "timezone: America/Chicago"
}
It "Should Be UTC if in AWS" {
Mock -ModuleName $moduleForMock -CommandName Test-IsAws { $True }
Clean-TempPath
$sampleFile | Out-File $tempPath -Force
Set-FileBeats -Port $validPorts[0] -TargetConfigPath $tempPath -SourceConfigurationPath $fileBeatsDefaultSourceConfigPath
$tempPath | Should -FileContentMatch "timeZone: UTC"
}
}
}
#endregion Set-FileBeats