Tests/LMCollector.Tests.ps1
Describe 'Collector Testing New/Get/Set/Remove for Groups and Collectors' { BeforeAll { Import-Module $Module -Force Connect-LMAccount -AccessId $AccessId -AccessKey $AccessKey -AccountName $AccountName -DisableConsoleLogging -SkipCredValidation $Script:TimeNow = Get-Date -UFormat %m%d%Y-%H%M } Describe 'New-LMCollectorGroup' { It 'When given mandatory parameters, returns a created collector group with matching values' { $TestProperties = @{ "location" = "datacenter-test-$Script:TimeNow" "environment" = "testing" } $Script:NewCollectorGroup = New-LMCollectorGroup -Name "Collector.Group.Build.Test-$Script:TimeNow" -Description "Test collector group for Pester tests" -Properties $TestProperties -AutoBalance $true -AutoBalanceInstanceCountThreshold 5000 $Script:NewCollectorGroup | Should -Not -BeNullOrEmpty $Script:NewCollectorGroup.name | Should -Be "Collector.Group.Build.Test-$Script:TimeNow" $Script:NewCollectorGroup.description | Should -Be "Test collector group for Pester tests" $Script:NewCollectorGroup.autoBalance | Should -Be $true $Script:NewCollectorGroup.autoBalanceInstanceCountThreshold | Should -Be 5000 $Script:NewCollectorGroup.customProperties | Should -Not -BeNullOrEmpty ($Script:NewCollectorGroup.customProperties | Measure-Object).Count | Should -Be 2 } } Describe 'Get-LMCollectorGroup' { It 'When given no parameters, returns all collector groups' { $CollectorGroups = Get-LMCollectorGroup ($CollectorGroups | Measure-Object).Count | Should -BeGreaterThan 0 } It 'When given an id should return that collector group' { $CollectorGroup = Get-LMCollectorGroup -Id $Script:NewCollectorGroup.Id -ErrorAction Stop ($CollectorGroup | Measure-Object).Count | Should -BeExactly 1 $CollectorGroup.name | Should -Be $Script:NewCollectorGroup.name $CollectorGroup.description | Should -Be $Script:NewCollectorGroup.description } It 'When given a name should return that collector group' { $CollectorGroup = Get-LMCollectorGroup -Name $Script:NewCollectorGroup.name -ErrorAction Stop ($CollectorGroup | Measure-Object).Count | Should -BeExactly 1 $CollectorGroup.id | Should -Be $Script:NewCollectorGroup.id } } Describe 'New-LMCollector' { It 'When given mandatory parameters, returns a created collector with matching values' { $TestProperties = @{ "test.property" = "value-$Script:TimeNow" "build.test" = "true" } $Script:NewCollector = New-LMCollector -Description "Collector.Build.Test-$Script:TimeNow" -CollectorGroupId $Script:NewCollectorGroup.id -Properties $TestProperties -EnableFailBack $true -SuppressAlertClear $false $Script:NewCollector | Should -Not -BeNullOrEmpty $Script:NewCollector.description | Should -Be "Collector.Build.Test-$Script:TimeNow" $Script:NewCollector.collectorGroupId | Should -Be $Script:NewCollectorGroup.id $Script:NewCollector.enableFailBack | Should -Be $true $Script:NewCollector.suppressAlertClear | Should -Be $false $Script:NewCollector.customProperties | Should -Not -BeNullOrEmpty ($Script:NewCollector.customProperties | Measure-Object).Count | Should -Be 4 } } Describe 'Get-LMCollector' { It 'When given no parameters, returns all collectors' { $Collectors = Get-LMCollector $Collectors | Should -Not -BeNullOrEmpty } It 'When given an id should return that collector' { $Collector = Get-LMCollector -Id $Script:NewCollector.Id -ErrorAction Stop ($Collector | Measure-Object).Count | Should -BeExactly 1 $Collector.description | Should -Be $Script:NewCollector.description $Collector.collectorGroupId | Should -Be $Script:NewCollector.collectorGroupId } } Describe 'Set-LMCollector' { It 'When given parameters, updates collector with matching values' { $UpdatedDescription = "Collector.Build.Test-Updated-$Script:TimeNow" $UpdatedProperties = @{ "test.property.updated" = "updated-value-$Script:TimeNow" "updated.test" = "true" } $UpdatedCollector = Set-LMCollector -Id $Script:NewCollector.id -Description $UpdatedDescription -Properties $UpdatedProperties -EnableFailBack $false -SuppressAlertClear $true $UpdatedCollector | Should -Not -BeNullOrEmpty $UpdatedCollector.description | Should -Be $UpdatedDescription $UpdatedCollector.enableFailBack | Should -Be $false $UpdatedCollector.suppressAlertClear | Should -Be $true $UpdatedCollector.customProperties | Should -Not -BeNullOrEmpty ($UpdatedCollector.customProperties | Measure-Object).Count | Should -Be 4 # Verify the updated property values $testProperty = $UpdatedCollector.customProperties | Where-Object { $_.name -eq "test.property.updated" } $testProperty | Should -Not -BeNullOrEmpty $testProperty.value | Should -Be "updated-value-$Script:TimeNow" } } Describe 'Get-LMCollectorVersions' { It 'When called, returns available collector versions' { $Versions = Get-LMCollectorVersion $Versions | Should -Not -BeNullOrEmpty ($Versions | Measure-Object).Count | Should -BeGreaterThan 10 } It 'When called with TopVersions, returns top collector versions' { $TopVersions = Get-LMCollectorVersion -TopVersions $TopVersions | Should -Not -BeNullOrEmpty ($TopVersions | Measure-Object).Count | Should -BeLessThan 6 } } Describe 'Get-LMCollectorInstaller' { It 'When given a collector id, validates installer functionality without full download' { # Test by starting the download but canceling it quickly to avoid bandwidth usage # Use appropriate temp directory for different environments $TempDir = if ($env:RUNNER_TEMP) { $env:RUNNER_TEMP # GitHub Actions } elseif ($env:TMPDIR) { $env:TMPDIR # macOS/Linux } elseif ($env:TEMP) { $env:TEMP # Windows } else { [System.IO.Path]::GetTempPath() # Fallback } $TempPath = Join-Path $TempDir "test_installer_$($Script:NewCollector.id).exe" # Use a job to start download and cancel it quickly $Job = Start-Job -ScriptBlock { param($CollectorId, $TempPath, $Module) Import-Module $Module -Force try { # This will start the download but we'll kill it from the parent Get-LMCollectorInstaller -Id $CollectorId -Size "medium" -OSandArch "Win64" -UseEA $false -DownloadPath (Split-Path $TempPath) } catch { # Expected when job is stopped return $_.Exception.Message } } -ArgumentList $Script:NewCollector.id, $TempPath, $Module # Wait a moment to let the download start, then stop it Start-Sleep -Milliseconds 1500 Stop-Job $Job Remove-Job $Job -Force -Confirm:$false # Clean up any partial download if (Test-Path $TempPath) { $FileSize = (Get-Item $TempPath).Length Remove-Item $TempPath -Force -ErrorAction SilentlyContinue # If we got any data, the URL and authentication worked $FileSize | Should -BeGreaterOrEqual 0 Write-Host "Installer download started successfully (downloaded $FileSize bytes before cancellation)" -ForegroundColor Green } else { # Fallback: just verify the expected path construction $ExpectedPath = Join-Path $TempDir "LogicMonitor_Collector_Win64_medium_$($Script:NewCollector.id).exe" $ExpectedPath | Should -Not -BeNullOrEmpty Write-Host "Installer path construction validated: $ExpectedPath" -ForegroundColor Yellow } } } Describe 'Remove-LMCollector' { It 'When given a collector id, removes the collector from LogicMonitor' { $RemoveResult = Remove-LMCollector -Id $Script:NewCollector.Id -ErrorAction Stop -Confirm:$false $RemoveResult | Should -Not -BeNullOrEmpty $RemoveResult.Id | Should -Be $Script:NewCollector.Id $RemoveResult.Message | Should -Match "Successfully removed" } } Describe 'Remove-LMCollectorGroup' { It 'When given a collector group id, removes the group from LogicMonitor' { $RemoveResult = Remove-LMCollectorGroup -Id $Script:NewCollectorGroup.Id -ErrorAction Stop -Confirm:$false $RemoveResult | Should -Not -BeNullOrEmpty $RemoveResult.Id | Should -Be $Script:NewCollectorGroup.Id $RemoveResult.Message | Should -Match "Successfully removed" } } AfterAll { Disconnect-LMAccount } } |