Tests/Test-JokeAPI.Tests.ps1

Describe "Test-JokeAPI" {

    BeforeAll {
        $ValidUri = "https://official-joke-api.appspot.com/random_joke"
        $InvalidUri = "https://broken-link.com"
    }

    Context "Connectivity and Status Codes" {

        It "Returns True when the API returns Status 200" {
            Mock Invoke-WebRequest {
                return [PSCustomObject]@{ StatusCode = 200 }
            }

            $Result = Test-JokeAPI -Uri $ValidUri

            $Result | Should -Be $true
        }

        It "Returns False when the API returns a 404 Not Found" {
            Mock Invoke-WebRequest {
                return [PSCustomObject]@{ StatusCode = 404 }
            }

            $Result = Test-JokeAPI -Uri $InvalidUri 2>$null

            $Result | Should -Be $false
        }

        It "Returns False when a network exception occurs (e.g., DNS failure)" {
            Mock Invoke-WebRequest {
                throw [System.Net.WebException]::new("The remote name could not be resolved")
            }

            $Result = Test-JokeAPI -Uri "http://this-does-not-exist.local" 2>$null

            $Result | Should -Be $false
        }
    }

    Context "Internal Logic and Parameters" {

        It "Uses the HEAD method to minimize bandwidth" {
            Mock Invoke-WebRequest { return [PSCustomObject]@{ StatusCode = 200 } }

            $null = Test-JokeAPI -Uri $ValidUri

            Assert-MockCalled Invoke-WebRequest -ParameterFilter {
                $Method -eq 'HEAD'
            }
        }

        It "Correctly passes the custom Timeout value" {
            Mock Invoke-WebRequest { return [PSCustomObject]@{ StatusCode = 200 } }
            $CustomTimeout = 10

            $null = Test-JokeAPI -Uri $ValidUri -Timeout $CustomTimeout

            Assert-MockCalled Invoke-WebRequest -ParameterFilter {
                $TimeoutSec -eq 10
            }
        }

        It "Requires the Uri parameter" {
            { Test-JokeAPI } | Should -Throw "*Uri parameter is required*"
        }
    }
}