Tests/Private/Set-TFPhoneNumber.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 }

    # Splatting Parameters
    $Params = @{
      WarningAction     = 'SilentlyContinue'
      InformationAction = 'SilentlyContinue'
    }

    # Dot Sourcing Mock Objects
    . "$(Get-ParentDirectoryPath -TargetParentDirectory 'Tests' -DirectoryName $PSScriptRoot)\Public\Testing-MockedObjects.ps1"
  }

  Describe -Tags ('Unit', 'Acceptance') "Function 'Set-TFPhoneNumber'" {
    BeforeEach {
      Mock Remove-CsPhoneNumberAssignment { return $null }
      Mock Set-CsPhoneNumberAssignment { return $null }

      function Get-TeamsPhoneNumber ($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
        }
        switch ($PhoneNumber) {
          '1234567890' {
            $PhoneNumberObject.PhoneNumber = '1234567890'
            return $PhoneNumberObject
          }
          '1234567890;ext=1234' {
            $PhoneNumberObject.PhoneNumber = '1234567890'
            return $PhoneNumberObject
          }
          '' {
            return $PhoneNumberObject
          }
          default {
            return $PhoneNumberObject
          }
        }
      }
    }

    Context 'CmdLet should fail' {
      BeforeEach {
        $PhoneNumber = '1234567890'
      }
      It 'should detect mismatching objects' {
        { Set-TFPhoneNumber -UserObject $CsOnlineUserBad1 -Userlicense $AzureAdUserLicenseGood1 -PhoneNumber $PhoneNumber } | Should -Throw
      }

      It 'should throw an Error if unlicensed' {
        { Set-TFPhoneNumber -UserObject $CsOnlineUserBad1 -Userlicense $AzureAdUserLicenseBad1 -PhoneNumber $PhoneNumber } | Should -Throw
      }
    }

    Context 'CmdLet should succeed' {
      BeforeEach {
        $PhoneNumber = '1234567890'
        Mock Set-AzureAdUserLicenseServicePlan { return $null }
        Mock Get-AzureAdUserLicense { return $AzureAdUserLicenseGood1 }
      }
      It 'should enable a disabled PhoneSystem Service Plan' {
        { Set-TFPhoneNumber -UserObject $CsOnlineUserToRemedy1 -Userlicense $AzureAdUserLicenseToRemedy1 -PhoneNumber $PhoneNumber } | Should -Not -Throw
      }
    }

    Context 'PhoneNumber is provided in different formats' {
      It "should apply valid -PhoneNumber '<PhoneNumber>'" -TestCases @(
        @{ PhoneNumber = '1234567890' }
        @{ PhoneNumber = '1234567890;ext=1234' }
        @{ PhoneNumber = '' }
      ) {
        param ($PhoneNumber)
        { Set-TFPhoneNumber -UserObject $CsOnlineUserGood1 -Userlicense $AzureAdUserLicenseGood1 -PhoneNumber $PhoneNumber } | Should -Not -Throw
      }
    }
  }
}