public/New-PR.Tests.ps1

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

Get-Module Generate-DockerImageVariants -ErrorAction SilentlyContinue | Remove-Module -Force
Get-Module PowerShellForGitHub -ErrorAction SilentlyContinue | Remove-Module -Force

Describe "New-PR" -Tag 'Unit' {

    function Execute-Command {}
    function Generate-DockerImageVariants {}
    function Set-GitHubConfiguration {}
    function Get-GitHubMilestone {}
    function New-GitHubMilestone {}
    function Get-GitHubPullRequest {}
    function New-GitHubPullRequest {}
    function Update-GitHubIssue {}
    function Get-FakeMilestone {
        [PSCustomObject]@{
            title = 'next-release'
            number = 123
        }
    }
    $env:GITHUB_TOKEN = 'foo'
    $version = [version]'1.0.0'
    $versionNew = [version]'2.0.0'

    Context '-Verb add' {

        function Get-FakePR {
            [PSCustomObject]@{
                number = 123
                base = [pscustomobject]@{
                    ref = 'master'
                }
                head = [pscustomobject]@{
                    ref = "enhancement/add-v$version-variants"
                }
            }
        }

        It 'Creates new milestone and PR' {
            Mock Get-GitHubMilestone {}
            Mock New-GitHubMilestone { Get-FakeMilestone }
            Mock Get-GitHubPullRequest {}
            Mock New-GitHubPullRequest { Get-FakePR }

            New-PR -Version $version -Verb add -ErrorAction Stop

            Assert-MockCalled Get-GitHubMilestone -Scope It -Times 1
            Assert-MockCalled New-GitHubMilestone -Scope It -Times 1
            Assert-MockCalled Get-GitHubPullRequest -Scope It -Times 1
            Assert-MockCalled New-GitHubPullRequest -Scope It -Times 1
        }

        It 'Uses existing milestone and existing PR' {
            Mock Get-GitHubMilestone { Get-FakeMilestone }
            Mock New-GitHubMilestone {}
            Mock Get-GitHubPullRequest { Get-FakePR }
            Mock New-GitHubPullRequest {}

            New-PR -Version $version -Verb add -ErrorAction Stop

            Assert-MockCalled Get-GitHubMilestone -Scope It -Times 1
            Assert-MockCalled New-GitHubMilestone -Scope It -Times 0
            Assert-MockCalled Get-GitHubPullRequest -Scope It -Times 1
            Assert-MockCalled New-GitHubPullRequest -Scope It -Times 0
        }
    }

    Context '-Verb update' {

        function Get-FakePR {
            [PSCustomObject]@{
                number = 123
                base = [pscustomobject]@{
                    ref = 'master'
                }
                head = [pscustomobject]@{
                    ref = "enhancement/bump-v$( $Version.Major ).$( $Version.Minor )-variants-to-$( $VersionNew )"
                }
            }
        }

        It 'Creates new milestone and PR' {
            Mock Get-GitHubMilestone {}
            Mock New-GitHubMilestone { Get-FakeMilestone }
            Mock Get-GitHubPullRequest {}
            Mock New-GitHubPullRequest { Get-FakePR }

            New-PR -Version $version -VersionNew $VersionNew -Verb update -ErrorAction Stop

            Assert-MockCalled Get-GitHubMilestone -Scope It -Times 1
            Assert-MockCalled New-GitHubMilestone -Scope It -Times 1
            Assert-MockCalled Get-GitHubPullRequest -Scope It -Times 1
            Assert-MockCalled New-GitHubPullRequest -Scope It -Times 1
        }

        It 'Uses existing milestone and existing PR' {
            Mock Get-GitHubMilestone { Get-FakeMilestone }
            Mock New-GitHubMilestone {}
            Mock Get-GitHubPullRequest { Get-FakePR }
            Mock New-GitHubPullRequest {}

            New-PR -Version $version -VersionNew $VersionNew -Verb update -ErrorAction Stop

            Assert-MockCalled Get-GitHubMilestone -Scope It -Times 1
            Assert-MockCalled New-GitHubMilestone -Scope It -Times 0
            Assert-MockCalled Get-GitHubPullRequest -Scope It -Times 1
            Assert-MockCalled New-GitHubPullRequest -Scope It -Times 0
        }
    }
}