functions/AnyInterestingPRs.Tests.ps1

$here = Split-Path -Parent $MyInvocation.MyCommand.Path
$sut = (Split-Path -Leaf $MyInvocation.MyCommand.Path) -replace '\.Tests\.', '.'
. "$here\$sut"

. "$here\ParsePrTitle.ps1"
. "$here\IsPackageInteresting.ps1"
. "$here\GetSemVerIncrement.ps1"

Describe 'AnyInterestingPRs Tests' -Tag Unit {

    Context 'No PRs' {
        It 'should run without error when no PRs are specified (empty array)' {
            $res = AnyInterestingPRs -Titles @() -MaxSemVerIncrement 'minor' -PackageWildcardExpressions @()
        }

        It 'should run without error when no PRs are specified (null array)' {
            $res = AnyInterestingPRs -Titles $null -MaxSemVerIncrement 'minor' -PackageWildcardExpressions @()
        }
    }
    Context 'Single PR' {
        It 'should return false when no patterns are specified' {
            $res = AnyInterestingPRs -Titles @('Bump Corvus.Extensions.Newtonsoft.Json from 0.9.0 to 0.9.1 in /Solutions/dependency-playground') `
                                                    -MaxSemVerIncrement 'minor' `
                                                    -PackageWildcardExpressions @()
            $res | Should -BeOfType [boolean]
            $res | Should -Be $false
        }

        It 'should return false when matching patterns are specified with a SemVer increment more than MaxSemVerIncrement' {
            $res = AnyInterestingPRs -Titles @('Bump Corvus.Extensions.Newtonsoft.Json from 0.9.0 to 1.0.0 in /Solutions/dependency-playground') `
                                                    -MaxSemVerIncrement 'minor' `
                                                    -PackageWildcardExpressions @('Corvus.*')
            $res | Should -BeOfType [boolean]
            $res | Should -Be $false
        }

        It 'should return false when matching patterns are specified but no PR matches the pattern' {
            $res = AnyInterestingPRs -Titles @('Bump Newtonsoft.Json from 0.9.0 to 0.9.1 in /Solutions/dependency-playground') `
                                                    -MaxSemVerIncrement 'minor' `
                                                    -PackageWildcardExpressions @('Corvus.*')
            $res | Should -BeOfType [boolean]
            $res | Should -Be $false
        }

        It 'should return true when matching patterns are specified with a SemVer increment less than MaxSemVerIncrement (<maxSemVerIncrement>)' -TestCases @(
            @{ titles = @('Bump Corvus.Extensions.Newtonsoft.Json from 0.9.0 to 0.10.0 in /Solutions/dependency-playground'); maxSemVerIncrement = 'major'; packageWildcardExpressions = @('Corvus.*'); }
            @{ titles = @('Bump Corvus.Extensions.Newtonsoft.Json from 0.9.0 to 0.9.1 in /Solutions/dependency-playground'); maxSemVerIncrement = 'minor'; packageWildcardExpressions = @('Corvus.*'); }
        ) {
            param (
                [string[]] $titles,
                [string] $maxSemVerIncrement,
                [string[]] $packageWildcardExpressions
            )

            $res = AnyInterestingPRs `
                    -Titles $titles `
                    -MaxSemVerIncrement $maxSemVerIncrement `
                    -PackageWildcardExpressions $packageWildcardExpressions
            $res | Should -BeOfType [boolean]
            $res | Should -Be $true
        }

        It 'should return true when matching patterns are specified with a SemVer increment equal to MaxSemVerIncrement (<maxSemVerIncrement>)' -TestCases @(
            @{ titles = @('Bump Corvus.Extensions.Newtonsoft.Json from 0.9.0 to 1.0.0 in /Solutions/dependency-playground'); maxSemVerIncrement = 'major'; packageWildcardExpressions = @('Corvus.*'); }
            @{ titles = @('Bump Corvus.Extensions.Newtonsoft.Json from 0.9.0 to 0.10.0 in /Solutions/dependency-playground'); maxSemVerIncrement = 'minor'; packageWildcardExpressions = @('Corvus.*'); }
            @{ titles = @('Bump Corvus.Extensions.Newtonsoft.Json from 0.9.0 to 0.9.1 in /Solutions/dependency-playground'); maxSemVerIncrement = 'patch'; packageWildcardExpressions = @('Corvus.*'); }
        ) {
            param (
                [string[]] $titles,
                [string] $maxSemVerIncrement,
                [string[]] $packageWildcardExpressions
            )

            $res = AnyInterestingPRs `
                    -Titles $titles `
                    -MaxSemVerIncrement $maxSemVerIncrement `
                    -PackageWildcardExpressions $packageWildcardExpressions
            $res | Should -BeOfType [boolean]
            $res | Should -Be $true
        }
    }

    Context 'Multiple PRs' {
        It 'should return false when no patterns are specified' {
            $res = AnyInterestingPRs -Titles @(
                'Bump Corvus.Extensions.Newtonsoft.Json from 0.9.0 to 0.9.1 in /Solutions/dependency-playground',
                'Bump Newtonsoft.Json from 0.9.0 to 0.9.1 in /Solutions/dependency-playground') `
                                                    -MaxSemVerIncrement 'minor' `
                                                    -PackageWildcardExpressions @()
            $res | Should -BeOfType [boolean]
            $res | Should -Be $false
        }

        It 'should return false when matching patterns are specified with a SemVer increment more than MaxSemVerIncrement' {
            $res = AnyInterestingPRs -Titles  @(
                'Bump Corvus.Extensions.Newtonsoft.Json from 0.9.0 to 1.0.0 in /Solutions/dependency-playground',
                'Bump Newtonsoft.Json from 0.9.0 to 0.9.1 in /Solutions/dependency-playground') `
                                                    -MaxSemVerIncrement 'minor' `
                                                    -PackageWildcardExpressions @('Corvus.*')
            $res | Should -BeOfType [boolean]
            $res | Should -Be $false
        }

        It 'should return false when matching patterns are specified but no PR matches the pattern' {
            $res = AnyInterestingPRs -Titles @(
                'Bump Foo.Bar from 0.9.0 to 0.9.1 in /Solutions/dependency-playground',
                'Bump Newtonsoft.Json from 0.9.0 to 0.9.1 in /Solutions/dependency-playground') `
                                                    -MaxSemVerIncrement 'minor' `
                                                    -PackageWildcardExpressions @('Corvus.*')
            $res | Should -BeOfType [boolean]
            $res | Should -Be $false
        }

        It 'should return true when matching patterns are specified with a SemVer increment less than MaxSemVerIncrement (<maxSemVerIncrement>)' -TestCases @(
            @{ titles = @('Bump Corvus.Extensions.Newtonsoft.Json from 0.9.0 to 0.10.0 in /Solutions/dependency-playground', 'Bump Newtonsoft.Json from 0.9.0 to 0.10.0 in /Solutions/dependency-playground'); maxSemVerIncrement = 'major'; packageWildcardExpressions = @('Corvus.*'); }
            @{ titles = @('Bump Corvus.Extensions.Newtonsoft.Json from 0.9.0 to 0.9.1 in /Solutions/dependency-playground', 'Bump Newtonsoft.Json from 0.9.0 to 0.10.0 in /Solutions/dependency-playground'); maxSemVerIncrement = 'minor'; packageWildcardExpressions = @('Corvus.*'); }
        ) {
            param (
                [string[]] $titles,
                [string] $maxSemVerIncrement,
                [string[]] $packageWildcardExpressions
            )

            $res = AnyInterestingPRs `
                    -Titles $titles `
                    -MaxSemVerIncrement $maxSemVerIncrement `
                    -PackageWildcardExpressions $packageWildcardExpressions
            $res | Should -BeOfType [boolean]
            $res | Should -Be $true
        }

        It 'should return true when matching patterns are specified with a SemVer increment equal to MaxSemVerIncrement (<maxSemVerIncrement>)' -TestCases @(
            @{ titles = @('Bump Corvus.Extensions.Newtonsoft.Json from 0.9.0 to 1.0.0 in /Solutions/dependency-playground', 'Bump Newtonsoft.Json from 0.9.0 to 0.10.0 in /Solutions/dependency-playground'); maxSemVerIncrement = 'major'; packageWildcardExpressions = @('Corvus.*'); }
            @{ titles = @('Bump Corvus.Extensions.Newtonsoft.Json from 0.9.0 to 0.10.0 in /Solutions/dependency-playground', 'Bump Newtonsoft.Json from 0.9.0 to 0.10.0 in /Solutions/dependency-playground'); maxSemVerIncrement = 'minor'; packageWildcardExpressions = @('Corvus.*'); }
            @{ titles = @('Bump Corvus.Extensions.Newtonsoft.Json from 0.9.0 to 0.9.1 in /Solutions/dependency-playground', 'Bump Newtonsoft.Json from 0.9.0 to 0.10.0 in /Solutions/dependency-playground'); maxSemVerIncrement = 'patch'; packageWildcardExpressions = @('Corvus.*'); }
        ) {
            param (
                [string[]] $titles,
                [string] $maxSemVerIncrement,
                [string[]] $packageWildcardExpressions
            )

            $res = AnyInterestingPRs `
                    -Titles $titles `
                    -MaxSemVerIncrement $maxSemVerIncrement `
                    -PackageWildcardExpressions $packageWildcardExpressions
            $res | Should -BeOfType [boolean]
            $res | Should -Be $true
        }
    }

    Context 'User PRs' {
        It 'should return false when processing a normal user-initiated PR' {
            $res = AnyInterestingPRs -Titles @('Fixes a nasty bug!') `
                                    -MaxSemVerIncrement 'patch' `
                                    -PackageWildcardExpressions @("Endjin.*","Corvus.*")
            $res | Should -BeOfType [boolean]
            $res | Should -Be $false  
        }
    }


}