Tests/UtilityFunctions.Tests.ps1
Import-Module "$PSScriptRoot/../ChocoForge.psd1" -Force Describe 'UtilityFunctions' { BeforeAll { $global:sample = @( [PSCustomObject]@{ html_url = 'https://github.com/FirebirdSQL/firebird/releases/tag/v5.0.2' tag_name = 'v5.0.2' name = 'Firebird 5.0.2' prerelease = $false published_at = '2025-02-12T11:19:52Z' assets = @( [PSCustomObject]@{ name = 'Firebird-5.0.2.1613-0-android-arm32-withDebugSymbols.tar.gz' size = 64526011 digest = $null browser_download_url = 'https://github.com/FirebirdSQL/firebird/releases/download/v5.0.2/Firebird-5.0.2.1613-0-android-arm32-withDebugSymbols.tar.gz' }, [PSCustomObject]@{ name = 'Firebird-5.0.2.1613-0-android-arm32.tar.gz' size = 23030688 digest = $null browser_download_url = 'https://github.com/FirebirdSQL/firebird/releases/download/v5.0.2/Firebird-5.0.2.1613-0-android-arm32.tar.gz' }, [PSCustomObject]@{ name = 'Firebird-5.0.2.1613-0-android-arm64-large.tar.gz' size = 150000000 digest = $null browser_download_url = 'https://github.com/FirebirdSQL/firebird/releases/download/v5.0.2/Firebird-5.0.2.1613-0-android-arm64-large.tar.gz' } ) }, [PSCustomObject]@{ html_url = 'https://github.com/FirebirdSQL/firebird/releases/tag/v4.0.5' tag_name = 'v4.0.5' name = 'Firebird 4.0.5' prerelease = $false published_at = '2024-08-08T14:09:32Z' assets = @( [PSCustomObject]@{ name = 'Firebird-4.0.5.3140-0-Win32-pdb.exe' size = 12345678 digest = $null browser_download_url = 'https://github.com/FirebirdSQL/firebird/releases/download/v4.0.5/Firebird-4.0.5.3140-0-Win32-pdb.exe' } ) }, [PSCustomObject]@{ html_url = 'https://github.com/FirebirdSQL/firebird/releases/tag/v3.0.12' tag_name = 'v3.0.12' name = 'Firebird 3.0.12' prerelease = $false published_at = '2024-08-08T14:20:47Z' assets = @() } ) } InModuleScope 'ChocoForge' { It 'Filters by exact tag name' { $filter = @{ tag_name = 'v5.0.2' } $result = Select-ObjectLike -InputObject $global:sample -Filter $filter $result | Should -Not -BeNullOrEmpty ($result.tag_name | Where-Object { $_ -ne 'v5.0.2' }) | Should -BeNullOrEmpty } It 'Filters by prerelease false' { $filter = @{ prerelease = $false } $result = Select-ObjectLike -InputObject $global:sample -Filter $filter $result | Should -Not -BeNullOrEmpty ($result.prerelease | Where-Object { $_ -ne $false }) | Should -BeNullOrEmpty } It 'Filters by published_at greater than a date' { $filter = @{ published_at = @{ op = 'gt'; value = '2025-01-01' } } $result = Select-ObjectLike -InputObject $global:sample -Filter $filter $result | Should -Not -BeNullOrEmpty ($result.published_at | Where-Object { [datetime]$_ -le [datetime]'2025-01-01' }) | Should -BeNullOrEmpty } It 'Filters by asset name (exact match)' { $filter = @{ assets = @{ name = 'Firebird-5.0.2.1613-0-android-arm32.tar.gz' } } $result = Select-ObjectLike -InputObject $global:sample -Filter $filter $result | Should -Not -BeNullOrEmpty foreach ($r in $result) { ($r.assets | Where-Object { $_.name -eq 'Firebird-5.0.2.1613-0-android-arm32.tar.gz' }) | Should -Not -BeNullOrEmpty } } It 'Filters by asset size greater than 100MB' { # Filter releases with HAVE AT LEAST ONE asset larger than 100MB $filter = @{ assets = @{ size = @{ op = 'gt'; value = 100000000 } } } $result = Select-ObjectLike -InputObject $global:sample -Filter $filter $result | Should -Not -BeNullOrEmpty foreach ($r in $result) { ($r.assets | Where-Object { $_.size -gt 100000000 }) | Should -Not -BeNullOrEmpty } } It 'Filters by regex on tag_name' { $filter = @{ tag_name = @{ op = 'match'; value = '^v5\.' } } $result = Select-ObjectLike -InputObject $global:sample -Filter $filter $result | Should -Not -BeNullOrEmpty foreach ($r in $result) { $r.tag_name | Should -Match '^v5\.' } ($result.tag_name | Where-Object { $_ -notmatch '^v5\.' }) | Should -BeNullOrEmpty } It 'Returns nothing for non-matching filter' { $filter = @{ tag_name = 'nonexistent' } $result = Select-ObjectLike -InputObject $global:sample -Filter $filter $result | Should -BeNullOrEmpty } } } |