tests/VersionAndDbFilters.Tests.ps1

BeforeAll {
    $script:RepoRoot = Split-Path -Parent $PSScriptRoot
    Get-ChildItem (Join-Path $script:RepoRoot 'Private') -Filter *.ps1 | ForEach-Object { . $_.FullName }

    function New-TestStub {
        param($Feature = '', $Main = '', $NextMain = '', $LocalDbs = @())
        [pscustomobject]@{
            name       = 'RT_Stub'
            minVersion = [pscustomobject]@{ featureRelease = $Feature; mainRelease = $Main; nextMainRelease = $NextMain }
            localDbs   = [string[]]@($LocalDbs)
        }
    }
}

Describe 'ConvertTo-QAFrameworkVersion' {
    It 'turns the CU number into the revision' {
        ConvertTo-QAFrameworkVersion -Version '10.1.0.0-CU5' | Should -Be ([version]'10.1.0.5')
    }

    It 'is case insensitive on the CU marker' {
        ConvertTo-QAFrameworkVersion -Version '10.0.12.0-cu3' | Should -Be ([version]'10.0.12.3')
    }

    It 'throws on a malformed version' -ForEach @(
        @{ Value = 'RandomString' }
        @{ Value = 'RandomString-Same-Format' }
        @{ Value = '12231-Same-CU12' }
        @{ Value = '10.1.2.0-5649-0' }
        @{ Value = '' }
    ) {
        { ConvertTo-QAFrameworkVersion -Version $Value } | Should -Throw
    }
}

Describe 'Test-QAFrameworkIsMainRelease' {
    It 'treats a zero build number as a main release' {
        Test-QAFrameworkIsMainRelease -DataMinerVersion ([version]'10.5.0.0') | Should -BeTrue
        Test-QAFrameworkIsMainRelease -DataMinerVersion ([version]'10.5.13.0') | Should -BeFalse
    }
}

Describe 'Test-QAFrameworkFeatureReleaseCompatible' {
    # Ported from UnitTest_TestRunnerTypes TestFilterTests.FeatureReleaseCompatible.
    It 'matches the legacy result for <DataMiner> / <Minimum>' -ForEach @(
        @{ DataMiner = '10.0.13.0'; Minimum = '9.6.10.0-CU1';  Expected = $true }
        @{ DataMiner = '10.0.13.0'; Minimum = '9.5.12.0-CU0';  Expected = $true }
        @{ DataMiner = '10.0.13.0'; Minimum = '10.0.13.0-CU0'; Expected = $true }
        @{ DataMiner = '10.0.13.1'; Minimum = '10.0.13.0-CU1'; Expected = $true }
        @{ DataMiner = '10.1.5.0';  Minimum = '10.1.12.0-CU0'; Expected = $false }
        @{ DataMiner = '10.1.13.0'; Minimum = '10.0.12.0-CU0'; Expected = $true }
        @{ DataMiner = '10.1.13.0'; Minimum = '10.1.13.0-CU0'; Expected = $true }
        @{ DataMiner = '10.0.13.0'; Minimum = '10.1.0.0-cu0';  Expected = $false }
        @{ DataMiner = '10.0.1.0';  Minimum = '10.0.12.0-cu0'; Expected = $false }
        @{ DataMiner = '9.6.13.1';  Minimum = '10.0.12.0-cu0'; Expected = $false }
        @{ DataMiner = '10.1.10.0'; Minimum = '10.0.12.0-cu0'; Expected = $true }
        @{ DataMiner = '10.0.13.0'; Minimum = '10.1.12.0-cu0'; Expected = $false }
        @{ DataMiner = '10.0.13.0'; Minimum = '';              Expected = $true }
        @{ DataMiner = '10.5.13.0'; Minimum = $null;           Expected = $true }
    ) {
        Test-QAFrameworkFeatureReleaseCompatible -DataMinerVersion ([version]$DataMiner) -MinimalFeatureVersion $Minimum |
            Should -Be $Expected
    }
}

Describe 'Test-QAFrameworkMainReleaseCompatible' {
    # Ported from UnitTest_TestRunnerTypes TestFilterTests.MainReleaseCompatible.
    It 'matches the legacy result for <DataMiner> / <Main> / <NextMain>' -ForEach @(
        @{ DataMiner = '10.0.0.20'; Main = '9.6.0.0-CU18';  NextMain = '10.0.0.0-CU19'; Expected = $true }
        @{ DataMiner = '10.0.0.20'; Main = '9.6.0.0-CU18';  NextMain = '10.0.0.0-CU20'; Expected = $true }
        @{ DataMiner = '10.0.0.20'; Main = '10.0.0.0-CU20'; NextMain = '10.1.0.0-CU19'; Expected = $true }
        @{ DataMiner = '9.6.0.2';   Main = '9.6.0.0-CU1';   NextMain = '10.0.0.0-CU19'; Expected = $true }
        @{ DataMiner = '9.6.0.20';  Main = '9.6.0.0-CU18';  NextMain = '10.0.0.0-CU19'; Expected = $true }
        @{ DataMiner = '9.6.0.50';  Main = '9.5.0.0-CU56';  NextMain = '9.6.0.0-CU7';   Expected = $true }
        @{ DataMiner = '9.5.0.4';   Main = '9.6.0.0-CU18';  NextMain = '10.0.0.0-CU19'; Expected = $false }
        @{ DataMiner = '10.0.0.20'; Main = '9.6.0.0-CU81';  NextMain = '10.0.0.0-CU21'; Expected = $false }
        @{ DataMiner = '10.0.0.20'; Main = '10.0.0.0-CU21'; NextMain = '10.1.0.0-CU2';  Expected = $false }
        @{ DataMiner = '10.0.13.0'; Main = '';              NextMain = '';              Expected = $false }
        @{ DataMiner = '10.1.13.0'; Main = $null;           NextMain = $null;           Expected = $false }
        @{ DataMiner = '10.5.0.0';  Main = '';              NextMain = '10.5.0.0-CU0';  Expected = $true }
        @{ DataMiner = '10.5.0.0';  Main = '';              NextMain = '10.5.0.0-CU30'; Expected = $false }
        @{ DataMiner = '10.5.0.4';  Main = '';              NextMain = '10.1.0.0-CU0';  Expected = $true }
        @{ DataMiner = '10.5.0.0';  Main = '10.5.0.0-CU0';  NextMain = '';              Expected = $true }
        @{ DataMiner = '10.5.0.0';  Main = '10.5.0.0-CU30'; NextMain = '';              Expected = $false }
        @{ DataMiner = '10.5.0.4';  Main = '10.1.0.0-CU0';  NextMain = '';              Expected = $true }
    ) {
        Test-QAFrameworkMainReleaseCompatible -DataMinerVersion ([version]$DataMiner) -MinimalMainVersion $Main -MinimalNextMainVersion $NextMain |
            Should -Be $Expected
    }

    It 'throws on malformed input like the legacy runner' -ForEach @(
        @{ Main = 'RandomString'; NextMain = 'random' }
        @{ Main = 'RandomString-Same-Format'; NextMain = 'test' }
        @{ Main = '10.1.2.0-5649-0'; NextMain = '10.4.3.2-CU4' }
    ) {
        { Test-QAFrameworkMainReleaseCompatible -DataMinerVersion ([version]'10.5.13.0') -MinimalMainVersion $Main -MinimalNextMainVersion $NextMain } |
            Should -Throw
    }
}

Describe 'Test-QAFrameworkVersionCompatible' {
    It 'uses the main release rules on a main release agent' {
        $test = New-TestStub -Main '10.5.0.0-CU30'
        Test-QAFrameworkVersionCompatible -DataMinerVersion ([version]'10.5.0.0') -Test $test | Should -BeFalse
        Test-QAFrameworkVersionCompatible -DataMinerVersion ([version]'10.5.0.40') -Test $test | Should -BeTrue
    }

    It 'uses the feature release rules on a feature release agent' {
        $test = New-TestStub -Feature '10.1.12.0-CU0' -Main '10.5.0.0-CU30'
        Test-QAFrameworkVersionCompatible -DataMinerVersion ([version]'10.1.5.0') -Test $test | Should -BeFalse
        Test-QAFrameworkVersionCompatible -DataMinerVersion ([version]'10.1.13.0') -Test $test | Should -BeTrue
    }

    It 'accepts a test without any version requirement' {
        Test-QAFrameworkVersionCompatible -DataMinerVersion ([version]'10.5.0.0') -Test (New-TestStub) | Should -BeTrue
    }

    It 'excludes a test with a malformed version instead of failing the run' {
        $test = New-TestStub -Feature 'NotAVersion'
        Test-QAFrameworkVersionCompatible -DataMinerVersion ([version]'10.5.13.0') -Test $test -WarningAction SilentlyContinue |
            Should -BeFalse
    }
}

Describe 'Test-QAFrameworkLocalDbCompatible' {
    It 'accepts a test without LocalDB entries on any database' {
        Test-QAFrameworkLocalDbCompatible -ClusterDbmsType 'Cassandra' -Test (New-TestStub) | Should -BeTrue
    }

    It 'accepts a matching database regardless of casing' {
        Test-QAFrameworkLocalDbCompatible -ClusterDbmsType 'cassandra' -Test (New-TestStub -LocalDbs @('MySQL', 'Cassandra')) | Should -BeTrue
    }

    It 'rejects a non-matching database' {
        Test-QAFrameworkLocalDbCompatible -ClusterDbmsType 'Cassandra' -Test (New-TestStub -LocalDbs @('MySQL')) | Should -BeFalse
    }

    It 'keeps the test when the cluster database is unknown' {
        Test-QAFrameworkLocalDbCompatible -ClusterDbmsType '' -Test (New-TestStub -LocalDbs @('MySQL')) | Should -BeTrue
    }
}