Tests/Public/UserManagement/TeamsCallableEntity/Assert-TeamsCallableEntity.Tests.ps1

# Module: TeamsFunctions
# Function: Test
# Author: David Eberhardt
# Updated: 23-JUL-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 'Assert-TeamsCallableEntity'" {
    #TODO User Requires to be called with -RequireEV - Add additional checks for without?
    Context 'User - Assertion is not successful' {
      # Using Testing-MockedObjects.ps1: $CsOnlineUserBad1, $AzureAdUserLicenseBad1
      BeforeEach {
        Mock Get-CsOnlineUser { return $CsOnlineUserBad1 }
        Mock Get-AzureAdUserLicense { return $AzureAdUserLicenseBad1 }
        Mock Set-AzureAdUserLicenseServicePlan { throw }
        Mock Start-Sleep { return $null }
        Mock Test-TeamsUserLicense { return $false }
        Mock Enable-TeamsUserForEnterpriseVoice { return $false }
        #Mock Get-TeamsResourceAccount { return $false }
      }

      It 'should return FALSE (ParameterSet UserPrincipalName)' {
        $Identity = $CsOnlineUserBad1.UserPrincipalName
        #Assert-TeamsCallableEntity -UserPrincipalName $Identity -RequireEV @Params | Should -BeFalse
      }

      It 'should return FALSE (ParameterSet Object - UserObject)' {
        #Assert-TeamsCallableEntity -UserObject $CsOnlineUserBad1 -RequireEV @Params | Should -BeFalse
      }

      It 'should return FALSE (ParameterSet Object - UserObject + LicenseObject)' {
        #Assert-TeamsCallableEntity -UserObject $CsOnlineUserBad1 -LicenseObject $AzureAdUserLicenseBad1 -RequireEV @Params | Should -BeFalse
      }
    }

    Context 'User - ParameterSet UserPrincipalName - Assertion is not successful but can be remedied' {
      # Using Testing-MockedObjects.ps1: $CsOnlineUserToRemedy1, $AzureAdUserLicenseToRemedy1
      BeforeEach {
        Mock Get-CsOnlineUser { return $CsOnlineUserToRemedy1 }
        Mock Get-AzureAdUserLicense { return $AzureAdUserLicenseToRemedy1 }
        Mock Set-AzureAdUserLicenseServicePlan { return $null } # Remediation
        Mock Start-Sleep { return $null }
        Mock Test-TeamsUserLicense { return $true } # Remediation
        Mock Enable-TeamsUserForEnterpriseVoice { return $true } # Remediation
        #Mock Get-TeamsResourceAccount { return $false }
      }

      It 'should return TRUE (ParameterSet UserPrincipalName)' {
        $Identity = $CsOnlineUserToRemedy1.UserPrincipalName
        #Assert-TeamsCallableEntity -UserPrincipalName $Identity -RequireEV @Params | Should -BeTrue
      }

      It 'should return TRUE (ParameterSet Object - UserObject)' {
        #Assert-TeamsCallableEntity -UserObject $CsOnlineUserToRemedy1 -RequireEV @Params | Should -BeTrue
      }

      It 'should return TRUE (ParameterSet Object - UserObject + LicenseObject)' {
        #Assert-TeamsCallableEntity -UserObject $CsOnlineUserToRemedy1 -LicenseObject $AzureAdUserLicenseToRemedy1 -RequireEV @Params | Should -BeTrue
      }
    }

    Context 'User - ParameterSet UserPrincipalName - Assertion is successful' {
      # Using Testing-MockedObjects.ps1: $CsOnlineUserGood1, $AzureAdUserLicenseGood1
      BeforeEach {
        Mock Get-CsOnlineUser { return $CsOnlineUserGood1 }
        Mock Get-AzureAdUserLicense { return $AzureAdUserLicenseGood1 }
        Mock Set-AzureAdUserLicenseServicePlan { throw }
        #Mock Start-Sleep { return $null }
        #Mock Test-TeamsUserLicense { return $true }
        #Mock Enable-TeamsUserForEnterpriseVoice { return $false }
        #Mock Get-TeamsResourceAccount { return $false }
      }

      It 'should return TRUE (ParameterSet UserPrincipalName)' {
        $Identity = $CsOnlineUserGood1.UserPrincipalName
        #Assert-TeamsCallableEntity -UserPrincipalName $Identity -RequireEV @Params | Should -BeTrue
      }

      It 'should return TRUE (ParameterSet Object - UserObject)' {
        #Assert-TeamsCallableEntity -UserObject $CsOnlineUserGood1 -RequireEV @Params | Should -BeTrue
      }

      It 'should return TRUE (ParameterSet Object - UserObject + LicenseObject)' {
        #Assert-TeamsCallableEntity -UserObject $CsOnlineUserGood1 -LicenseObject $AzureAdUserLicenseGood1 -RequireEV @Params | Should -BeTrue
      }
    }

    ''
    Context 'ApplicationInstance - Assertion is not successful' {
      # Using Testing-MockedObjects.ps1: $CsOnlineUserRABad1, $AzureAdUserLicenseRABad1
      BeforeEach {
        Mock Get-CsOnlineUser { return $CsOnlineUserRABad1 }
        Mock Get-AzureAdUserLicense { return $AzureAdUserLicenseRABad1 }
        Mock Set-AzureAdUserLicenseServicePlan { throw }
        Mock Start-Sleep { return $null }
        Mock Test-TeamsUserLicense { return $false }
        Mock Enable-TeamsUserForEnterpriseVoice { return $false }
        #Mock Get-TeamsResourceAccount { return $false }
      }

      It 'should return FALSE (ParameterSet UserPrincipalName)' {
        $Identity = $CsOnlineUserRABad1.UserPrincipalName
        #Assert-TeamsCallableEntity -UserPrincipalName $Identity @Params | Should -BeFalse
      }

      It 'should return FALSE (ParameterSet Object - UserObject)' {
        #Assert-TeamsCallableEntity -UserObject $CsOnlineUserRABad1 @Params | Should -BeFalse
      }

      It 'should return FALSE (ParameterSet Object - UserObject + LicenseObject)' {
        #Assert-TeamsCallableEntity -UserObject $CsOnlineUserRABad1 -LicenseObject $AzureAdUserLicenseRABad1 @Params | Should -BeFalse
      }
    }

    Context 'ApplicationInstance - Assertion is not successful but can be remedied' {
      # Using Testing-MockedObjects.ps1: $CsOnlineUserRAToRemedy1, $AzureAdUserLicenseRAToRemedy1
      BeforeEach {
        Mock Get-CsOnlineUser { return $CsOnlineUserRAToRemedy1 }
        Mock Get-AzureAdUserLicense { return $AzureAdUserLicenseRAToRemedy1 }
        Mock Set-AzureAdUserLicenseServicePlan { return $null } # Remediation
        Mock Start-Sleep { return $null }
        Mock Test-TeamsUserLicense { return $true } # Remediation
        Mock Enable-TeamsUserForEnterpriseVoice { return $true } # Remediation
        #Mock Get-TeamsResourceAccount { return $false }
      }

      It 'should return TRUE (ParameterSet UserPrincipalName)' {
        $Identity = $CsOnlineUserRAToRemedy1.UserPrincipalName
        #Assert-TeamsCallableEntity -UserPrincipalName $Identity @Params | Should -BeTrue
      }

      It 'should return TRUE (ParameterSet Object - UserObject)' {
        #Assert-TeamsCallableEntity -UserObject $CsOnlineUserRAToRemedy1 @Params | Should -BeTrue
      }

      It 'should return TRUE (ParameterSet Object - UserObject + LicenseObject)' {
        #Assert-TeamsCallableEntity -UserObject $CsOnlineUserRAToRemedy1 -LicenseObject $AzureAdUserLicenseRAToRemedy1 @Params | Should -BeTrue
      }
    }

    Context 'ApplicationInstance - Assertion is successful' {
      # Using Testing-MockedObjects.ps1: $CsOnlineUserRAGood1, $AzureAdUserLicenseRAGood1
      BeforeEach {
        Mock Get-CsOnlineUser { return $CsOnlineUserRAGood1 }
        Mock Get-AzureAdUserLicense { return $AzureAdUserLicenseRAGood1 }
        Mock Set-AzureAdUserLicenseServicePlan { throw }
        #Mock Start-Sleep { return $null }
        #Mock Test-TeamsUserLicense { return $true }
        #Mock Enable-TeamsUserForEnterpriseVoice { return $false }
        #Mock Get-TeamsResourceAccount { return $false }
      }

      It 'should return TRUE (ParameterSet UserPrincipalName)' {
        $Identity = $CsOnlineUserRAGood1.UserPrincipalName
        #Assert-TeamsCallableEntity -UserPrincipalName $Identity @Params | Should -BeTrue
      }

      It 'should return TRUE (ParameterSet Object - UserObject)' {
        #Assert-TeamsCallableEntity -UserObject $CsOnlineUserRAGood1 @Params | Should -BeTrue
      }

      It 'should return TRUE (ParameterSet Object - UserObject + LicenseObject)' {
        #Assert-TeamsCallableEntity -UserObject $CsOnlineUserRAGood1 -LicenseObject $AzureAdUserLicenseRAGood1 @Params | Should -BeTrue
      }
    }
  }
}