tests/functions/Request-MtGitHubAppOrganizationInstall.Tests.ps1

BeforeAll {
    Import-Module "$PSScriptRoot/../../Maester.psd1" -Force
}

Describe 'Request-MtGitHubAppOrganizationInstall' {
    BeforeEach {
        $script:readHostCallCount = 0
        Mock Get-MtUserInteractive -ModuleName Maester { $true }
    }

    It 'Explains the install step, opens the browser only after confirmation, and returns true' {
        Mock Read-Host -ModuleName Maester {
            $script:readHostCallCount++
            if ($script:readHostCallCount -eq 1) { return 'Y' }
            return ''
        }
        Mock Open-MtBrowserUrl -ModuleName Maester { $true }

        InModuleScope Maester {
            $result = Request-MtGitHubAppOrganizationInstall -Organization 'myorg' -InstallUrl 'https://github.com/apps/maester-cli/installations/new' -Reason 'forbidden' 6>$null
            $result | Should -BeTrue
        }

        Should -Invoke Open-MtBrowserUrl -ModuleName Maester -Times 1 -Exactly -ParameterFilter {
            $Uri -eq 'https://github.com/apps/maester-cli/installations/new'
        }
        Should -Invoke Read-Host -ModuleName Maester -Times 1 -Exactly -ParameterFilter {
            $Prompt -eq 'Open the GitHub App install page now? [Y/n]'
        }
        Should -Invoke Read-Host -ModuleName Maester -Times 2 -Exactly
    }

    It 'Defaults to opening the browser when the user presses Enter at the confirmation prompt' {
        Mock Read-Host -ModuleName Maester { '' }
        Mock Open-MtBrowserUrl -ModuleName Maester { $true }

        InModuleScope Maester {
            $result = Request-MtGitHubAppOrganizationInstall -Organization 'myorg' -InstallUrl 'https://github.com/apps/maester-cli/installations/new' -Reason 'forbidden' 6>$null
            $result | Should -BeTrue
        }

        Should -Invoke Open-MtBrowserUrl -ModuleName Maester -Times 1 -Exactly -ParameterFilter {
            $Uri -eq 'https://github.com/apps/maester-cli/installations/new'
        }
        Should -Invoke Read-Host -ModuleName Maester -Times 1 -Exactly -ParameterFilter {
            $Prompt -eq 'Open the GitHub App install page now? [Y/n]'
        }
        Should -Invoke Read-Host -ModuleName Maester -Times 2 -Exactly
    }

    It 'Does not open the browser when the user declines and returns false' {
        Mock Read-Host -ModuleName Maester { 'N' }
        Mock Open-MtBrowserUrl -ModuleName Maester { throw 'Browser must not open when the user declines.' }

        InModuleScope Maester {
            $result = Request-MtGitHubAppOrganizationInstall -Organization 'myorg' -InstallUrl 'https://github.com/apps/maester-cli/installations/new' -Reason 'forbidden' 6>$null
            $result | Should -BeFalse
        }

        Should -Invoke Open-MtBrowserUrl -ModuleName Maester -Times 0 -Exactly
        Should -Invoke Read-Host -ModuleName Maester -Times 1 -Exactly
    }

    It 'Returns false without prompting in non-interactive sessions' {
        Mock Get-MtUserInteractive -ModuleName Maester { $false }
        Mock Read-Host -ModuleName Maester { throw 'Read-Host must not be called in non-interactive sessions.' }
        Mock Open-MtBrowserUrl -ModuleName Maester { throw 'Browser must not open in non-interactive sessions.' }

        InModuleScope Maester {
            $result = Request-MtGitHubAppOrganizationInstall -Organization 'myorg' -InstallUrl 'https://github.com/apps/maester-cli/installations/new' 6>$null
            $result | Should -BeFalse
        }

        Should -Invoke Read-Host -ModuleName Maester -Times 0 -Exactly
        Should -Invoke Open-MtBrowserUrl -ModuleName Maester -Times 0 -Exactly
    }
}