Functions/Get-GSuiteAccessToken.Tests.ps1

Describe "GSuite/Get-GSuiteAccessToken" -Tag "task", "unit" {

    # Import the function to test
    . "$($PSScriptRoot)\Get-GSuiteAccessToken.ps1"

    # Declare external functions and mocks
    function Invoke-RestMethod {
        param ($Uri, $Headers, $Body, $Method)
        return @{
            expires_in   = 3600
            access_token = "token"
        }
    }

    context "when there are no issues" {
        # Declare mocks
        mock Invoke-RestMethod {
            param ($Uri, $Headers, $Body, $Method)
            return @{
                expires_in   = 3600
                access_token = "token"
            }
        }

        it "retrieves the authentication token given the input values" {
            # Call the function
            $output = Get-GSuiteAccessToken -ApplicationId "id" -ClientSecret "secret" `
                -RefreshToken "refreshToken" -ErrorAction SilentlyContinue -ErrorVariable errorVariable

            # Verify the mocks
            Assert-MockCalled Invoke-RestMethod -Times 1 -Exactly -ParameterFilter {
                $Uri -eq "https://www.googleapis.com/oauth2/v4/token" -and
                $Headers.'Content-Type' -eq "application/json" -and
                $Method -eq "POST" -and
                $Body -eq @{
                    client_id     = "id"
                    client_secret = "secret"
                    grant_type    = "refresh_token"
                    refresh_token = "refreshToken"
                } | ConvertTo-Json
            } -Scope it

            # Verify the output
            $output | Should Be "token"
            $errorVariable | Should BeNullOrEmpty
        }
    }

    context "when Invoke-RestMethod throws an exception" {
        # Declare mocks
        mock Invoke-RestMethod {
            throw "error"
        }

        it "outputs an error and returns null" {
            # Call the function
            $output = Get-GSuiteAccessToken -ApplicationId "id" -ClientSecret "secret" `
                -RefreshToken "refreshToken" -ErrorAction SilentlyContinue -ErrorVariable errorVariable 2>$null

            # Verify the output
            $output | Should Be $null
            $errorVariable | Should Not BeNullOrEmpty
        }
    }

    context "when Invoke-RestMethod does not return the token" {
        # Declare mocks
        mock Invoke-RestMethod {
            return @{
                expires_in = 3600
            }
        }

        it "outputs an error and returns null" {
            # Call the function
            $output = Get-GSuiteAccessToken -ApplicationId "id" -ClientSecret "secret" `
                -RefreshToken "refreshToken" -ErrorAction SilentlyContinue -ErrorVariable errorVariable 2>$null

            # Verify the output
            $output | Should Be $null
            $errorVariable | Should Not BeNullOrEmpty
        }
    }
}