Tests/Public/Support/VoiceConfig/Get-TeamsPhoneNumber.Tests.ps1

# Module: TeamsFunctions
# Function: Test
# Author: David Eberhardt
# Updated: 05-AUG-2022





InModuleScope TeamsFunctions {
  BeforeAll {
    # Mocking basic connection commands to avoid connectivity related errors
    Mock Assert-AzureADConnection { return $true }
    Mock Assert-MicrosoftTeamsConnection { return $true }
    Mock Test-MicrosoftTeamsConnection { return $true }

    # Mocking Output for some functions
    function Get-CsOnlineLisLocation {
      param (
        $LocationId,
        $Location
      )
      if ( $LocationId.IsPresent ) {
        return '00000000-0000-0000-0000-000000000000'
      }
      elseif ( $Location.IsPresent ) {
        return '00000000-0000-0000-0000-000000000000'
      }
      else {
        return $null
      }
    }
    function Get-CsPhoneNumberAssignment {
      param (
        $TelephoneNumberStartsWith,
        $TelephoneNumber,
        $Location,
        $City,
        $CapabilitiesContain
      )
      $PhoneNumberObject = [PSCustomObject][ordered]@{
        TelephoneNumber         = $null
        NumberType              = 'DirectRouting'
        ActivationState         = $null
        AssignedPstnTargetId    = $null
        Capability              = @('ConferenceAssignment', 'VoiceApplicationAssignment', 'UserAssignment' )
        City                    = $null
        CivicAddressId          = '00000000-0000-0000-0000-000000000000'
        IsoCountryCode          = $null
        IsoSubdivision          = $null
        LocationId              = '00000000-0000-0000-0000-000000000000'
        LocationUpdateSupported = $true
        PortInOrderStatus       = $null
        PstnAssignmentStatus    = $null
        PstnPartnerId           = $null
        PstnPartnerName         = $null
      }
      switch ($PhoneNumber) {
        '1234567890' {
          $PhoneNumberObject.TelephoneNumber = '1234567890'
          return $PhoneNumberObject
        }
        '' {
          return $PhoneNumberObject
        }
        default {
          return $PhoneNumberObject
        }
      }
    }

  }

  Describe -Tags ('Unit', 'Acceptance') "Function 'Get-TeamsPhoneNumber'" {
    #TODO Test Cases need to cover All input optios as well as relevant mocking objects for queries against the tenant


    It "Given valid -PhoneNumber '<PhoneNumber>', it returns a PhoneNumberObject" -TestCases @(
      @{ PhoneNumber = '1234567890'; PhoneNumberObject = [TFPhoneNumberObject]@{
          PhoneNumber          = 1234567890
          NumberType           = 'DirectRouting'
          LocationId           = $null
          LocationName         = $null
          City                 = $null
          Capability           = @('ConferenceAssignment', 'VoiceApplicationAssignment', 'UserAssignment' )
          Assigned             = $false
          AssignedTo           = $null
          AssignedToSIP        = $null
          AssignedToObjectType = $null
          AssignedPstnTargetId = $null
        }
      }
      @{ PhoneNumber = '1234567890;ext=1234'; PhoneNumberObject = [TFPhoneNumberObject]@{
          PhoneNumber          = 1234567890
          NumberType           = 'DirectRouting'
          LocationId           = $null
          LocationName         = $null
          City                 = $null
          Capability           = @('ConferenceAssignment', 'VoiceApplicationAssignment', 'UserAssignment' )
          Assigned             = $false
          AssignedTo           = $null
          AssignedToSIP        = $null
          AssignedToObjectType = $null
          AssignedPstnTargetId = $null
        }
      }
      @{ PhoneNumber = ''  ; PhoneNumberObject = [TFPhoneNumberObject]@{
          PhoneNumber          = $null
          NumberType           = 'DirectRouting'
          LocationId           = $null
          LocationName         = $null
          City                 = $null
          Capability           = @('ConferenceAssignment', 'VoiceApplicationAssignment', 'UserAssignment' )
          Assigned             = $false
          AssignedTo           = $null
          AssignedToSIP        = $null
          AssignedToObjectType = $null
          AssignedPstnTargetId = $null
        }
      }
    ) {
      param ($PhoneNumber, $PhoneNumberObject)
      #BODGE 'Expected TFPhoneNumberObject, but got TFPhoneNumberObject' - why does the comparison not work?
      #Get-TeamsPhoneNumber $PhoneNumber -InformationAction SilentlyContinue | Should -Be $PhoneNumberObject
      (Get-TeamsPhoneNumber $PhoneNumber -InformationAction SilentlyContinue).PhoneNumber | Should -Be $PhoneNumberObject.PhoneNumber
    }
  }
}