test/JumpCloud.1.1.0.Tests.ps1

#Tests for JumpCloud Module Version 1.1.0

# To run all the Pester Tests you will need to have a tenant that matches the below criteria.

# For Command Results Tests - Have at least 5 command results present in your Org
# For Commands Tests - Have at least 2 JumpCloud commands that are set to run via the 'Run on Trigger' event
# For Groups Tests - Have at least 2 JumpCloud User Groups and 2 JumpCloud System Groups
# For Systems Tests - Have at least 2 JumpCloud Systems present in your Org.
# For Users Tests - Have at least 2 JumpCloud Users present in your Org.

#Additionally you must populate the below variables to run successful tests using the -ByID parameter

$SystemID = '' # Enter the System ID for a system in your test tenant. **Note users will be added and removed from this system during the tests

$Username = 'pester.tester' # Create a user with username 'pester.tester'
$UserID = '' # Paste the UserID for the user with username pester.tester

$UserGroupName = 'PesterTest_UserGroup'  #Create a user group named PesterTest_UserGroup within your environment
$UserGroupID = ''  # Paste the corresponding GroupID for the user group named PesterTest_UserGroup

$SystemGroupName = 'PesterTest_SystemGroup' # Create a sytem group named PesterTest_SystemGroup within your environment
$SystemGroupID = ''  # Paste the corresponding GroupID for the sytem group named PesterTest_SystemGroup

$NewJCSystemGroup = 'NewSystemGroup' #Do not modify this
$NewJCUserGroup = 'NewUserGroup' #Do not modify this

$CSVPath = '' #Path to ImportExample_Pester_Tests_1.1.0.csv //REQUIRED update the system under 'SystemID' in the .CSV file.
           

#Test Functions

Function New-RandomUser  ()
{
    [CmdletBinding(DefaultParameterSetName = 'NoAttributes')]
    param
    (
        [Parameter(Mandatory, Position = 0)]
        [String]
        $Domain,

        [Parameter(ParameterSetName = 'Attributes')] ##Test this to see if this can be modified.
        [switch]
        $Attributes

    )

    if (($PSCmdlet.ParameterSetName -eq 'NoAttributes'))
    {
        $username = -join ((65..90) + (97..122) | Get-Random -Count 8 | ForEach-Object {[char]$_})
        $email = $username + "@$Domain.com"

        $RandomUser = [ordered]@{
            FirstName = 'Pester'
            LastName  = 'Test'
            Username  = $username
            Email     = $email
            Password  = 'Temp123!'
        }

        $NewRandomUser = New-Object psobject -Property $RandomUser
    }

    if (($PSCmdlet.ParameterSetName -eq 'Attributes'))
    {
        $username = -join ((65..90) + (97..122) | Get-Random -Count 8 | ForEach-Object {[char]$_})
        $email = $username + "@$Domain.com"

        $RandomUser = [ordered]@{
            FirstName                = 'Pester'
            LastName                 = 'Test'
            Username                 = $username
            Email                    = $email
            Password                 = 'Temp123!'
            NumberOfCustomAttributes = 3
            Attribute1_name          = 'Department'
            Attribute1_value         = 'Sales'
            Attribute2_name          = 'Office'
            Attribute2_value         = '456789'
            Attribute3_name          = 'Lang'
            Attribute3_value         = 'French'
        }
        $NewRandomUser = New-Object psobject -Property $RandomUser
    }


    return $NewRandomUser
}
Function New-RandomString ()
{
    [CmdletBinding()]

    param(

        [Parameter(Mandatory)] ##Test this to see if this can be modified.
        [ValidateRange(0, 52)]
        [Int]
        $NumberOfChars

    )
    begin {}
    process
    {
        $Random = -join ((65..90) + (97..122) | Get-Random -Count $NumberOfChars | % {[char]$_})
    }
    end {Return $Random}


}

$Random = New-RandomString '8'
$RandomEmail = "$Random@$Random.com"


Describe 'Set-JCSystemUser' {

    It "Sets a standard user to an admin user using username" {
        
        Add-JCSystemUser -SystemID $SystemID -Username $Username -Administrator $False #Sets to standard user
        $CommandResults = Set-JCSystemUser -SystemID $SystemID -Username $Username -Administrator $True
        $CommandResults.Administrator | Should -Be $True
        $GetSystem = Get-JCSystemUser -SystemID $SystemID | ? Username -EQ $Username | Select Administrator
        $GetSystem.Administrator | Should -Be $True

    }

    It "Sets an admin user to a standard user using username" {
        
        Set-JCSystemUser -SystemID $SystemID -Username $Username -Administrator $True #Sets to standard user
        $CommandResults = Set-JCSystemUser -SystemID $SystemID -Username $Username -Administrator $False
        $CommandResults.Administrator | Should -Be $False
        $GetSystem = Get-JCSystemUser -SystemID $SystemID | ? Username -EQ $Username | Select Administrator
        $GetSystem.Administrator | Should -Be $False

    }

    It "Sets a standard user to an admin user using UserID" {
        
        Set-JCSystemUser -SystemID $SystemID -UserID $UserID -Administrator $False #Sets to standard user
        $CommandResults = Set-JCSystemUser -SystemID $SystemID -UserID $UserID -Administrator $True
        $CommandResults.Administrator | Should -Be $True
        $GetSystem = Get-JCSystemUser -SystemID $SystemID | ? Username -EQ $Username | Select Administrator
        $GetSystem.Administrator | Should -Be $True

    }

    It "Sets an admin user to a standard user using UserID" {
        
        Set-JCSystemUser -SystemID $SystemID -UserID $UserID -Administrator $True #Sets to standard user
        $CommandResults = Set-JCSystemUser -SystemID $SystemID -UserID $UserID -Administrator $False
        $CommandResults.Administrator | Should -Be $False
        $GetSystem = Get-JCSystemUser -SystemID $SystemID | ? Username -EQ $Username | Select Administrator
        $GetSystem.Administrator | Should -Be $False

    }


}

Describe 'Add-JCSystemUser 1.1.0 and Get-JCSystemUser 1.1.0' {

    IT "Adds a JumpCloud User to a JumpCloud System with admin `$False using username" {

        $User = New-RandomUserCustom -Domain 'pleasedelete' | New-JCUser

        $FalseUser = Add-JCSystemUser -Username $User.username -SystemID $SystemID -Administrator $False

        $FalseUser.Administrator | Should Be $False

        $GetUser = Get-JCSystemUser -SystemID $SystemID | ? Username -EQ $FalseUser.Username | Select-Object Administrator

        $GetUser.Administrator | Should Be $False

    }

    IT "Adds a JumpCloud User to a JumpCloud System with admin $False using username" {

        $User = New-RandomUserCustom -Domain 'pleasedelete' | New-JCUser

        $FalseUser = Add-JCSystemUser -Username $User.username -SystemID $SystemID -Administrator $False

        $FalseUser.Administrator | Should Be $False

        $GetUser = Get-JCSystemUser -SystemID $SystemID | ? Username -EQ $FalseUser.Username | Select-Object Administrator

        $GetUser.Administrator | Should Be $False

    }

    IT "Adds a JumpCloud User to a JumpCloud System with admin `$False using UserID" {

        $User = New-RandomUserCustom -Domain 'pleasedelete' | New-JCUser
    
        $FalseUser = Add-JCSystemUser -UserID $User._id -SystemID $SystemID -Administrator $False
    
        $FalseUser.Administrator | Should Be $False
    
        $GetUser = Get-JCSystemUser -SystemID $SystemID | ? Username -EQ $User.Username | Select-Object Administrator
    
        $GetUser.Administrator | Should Be $False
    
    }

    IT "Adds a JumpCloud User to a JumpCloud System with admin `$True using UserID" {

        $User = New-RandomUserCustom -Domain 'pleasedelete' | New-JCUser
    
        $TrueUser = Add-JCSystemUser -UserID $User._id -SystemID $SystemID -Administrator $True
    
        $TrueUser.Administrator | Should Be $True
    
        $GetUser = Get-JCSystemUser -SystemID $SystemID | ? Username -EQ $User.Username | Select-Object Administrator
    
        $GetUser.Administrator | Should Be $True
    
    }

    IT "Adds a JumpCloud User to a JumpCloud System with admin $True using username" {

        $User = New-RandomUserCustom -Domain 'pleasedelete' | New-JCUser
    
        $TrueUser = Add-JCSystemUser -Username $User.username -SystemID $SystemID -Administrator $True
    
        $TrueUser.Administrator | Should Be $True
    
        $GetUser = Get-JCSystemUser -SystemID $SystemID | ? Username -EQ $TrueUser.Username | Select-Object Administrator
    
        $GetUser.Administrator | Should Be $True
    
    }


} 

Describe 'Get-JCGroup 1.1.0' {

    It "Gets a JumpCloud UserGroup by Name and Displays Attributes" {
        
        $Posix = Get-JCGroup -Type User -Name $UserGroupName

        $Posix.posixGroups.id | Should -Not -BeNullOrEmpty
        $Posix.posixGroups.name | Should -Not -BeNullOrEmpty
    }

}

Describe 'Import-JCUserFromCSV' {

    IT "Imports users from the ImportExample_Pester_Test using -Force" {

        $UserImport = Import-JCUsersFromCSV -CSVFilePath  $CSVpath -force

    }


    IT "Verifies a.user user" {

        $User = Get-JCUser -Username 'a.user' | ? Username -EQ 'a.user'

        $User.activated | Should be $True 

    }

    IT "Verifies ia.user user" {

        $User = Get-JCUser -Username 'ia.user' | ? Username -EQ 'ia.user'


        $User.activated | Should be $False
    }

    IT "Verifies a.bound.std user" {

        $User = Get-JCUser -Username 'a.bound.std' | ? Username -EQ 'a.bound.std'

        $User.activated | Should be $True

        $Bound = Get-JCSystemUser -SystemID $SystemID | ? username -EQ 'a.bound.std'

        $Bound.DirectBind | Should Be $True

        $Bound.Administrator | Should Be $False

    }

    IT "Verifies a.bound.true1 user" {

        $User = Get-JCUser -Username 'a.bound.true1' | ? username -EQ 'a.bound.true1'

        $User.activated | Should be $True

        $Bound = Get-JCSystemUser -SystemID $SystemID | ? username -EQ 'a.bound.true1'

        $Bound.DirectBind | Should Be $True

        $Bound.Administrator | Should Be $True

    }

    IT "Verifies a.bound.false1 user" {

        $User = Get-JCUser -Username 'a.bound.false1' | ? username -EQ 'a.bound.false1'

        $User.activated | Should be $True

        $Bound = Get-JCSystemUser -SystemID $SystemID | ? username -EQ 'a.bound.false1'

        $Bound.DirectBind | Should Be $True

        $Bound.Administrator | Should Be $False

    }

    IT "Verifies a.bound.true2 user" {

        $User = Get-JCUser -Username 'a.bound.true2' | ? username -EQ 'a.bound.true2'

        $User.activated | Should be $True

        $Bound = Get-JCSystemUser -SystemID $SystemID | ? username -EQ 'a.bound.true2'

        $Bound.DirectBind | Should Be $True

        $Bound.Administrator | Should Be $True

    }

    IT "Verifies a.bound.false2 user" {

        $User = Get-JCUser -Username 'a.bound.false2' | ? username -EQ 'a.bound.false2'

        $User.activated | Should be $True

        $Bound = Get-JCSystemUser -SystemID $SystemID | ? username -EQ 'a.bound.false2'

        $Bound.DirectBind | Should Be $True

        $Bound.Administrator | Should Be $False

    }

    IT "Verifies ia.bound.std user" {

        $User = Get-JCUser -Username 'ia.bound.std' | ? username -EQ 'ia.bound.std'
    
        $User.activated | Should be $False
    
        $Bound = Get-JCSystemUser -SystemID $SystemID | ? username -EQ 'ia.bound.std'
    
        $Bound.DirectBind | Should Be $True
    
        $Bound.Administrator | Should Be $False
    
    }
    
    IT "Verifies ia.bound.true1 user" {
    
        $User = Get-JCUser -Username 'ia.bound.true1' | ? username -EQ 'ia.bound.true1'
    
        $User.activated | Should be $False
    
        $Bound = Get-JCSystemUser -SystemID $SystemID | ? username -EQ 'ia.bound.true1'
    
        $Bound.DirectBind | Should Be $True
    
        $Bound.Administrator | Should Be $True
    
    }
    
    IT "Verifies ia.bound.false1 user" {
    
        $User = Get-JCUser -Username 'ia.bound.false1' | ? username -EQ 'ia.bound.false1'
    
        $User.activated | Should be $False
    
        $Bound = Get-JCSystemUser -SystemID $SystemID | ? username -EQ 'ia.bound.false1'
    
        $Bound.DirectBind | Should Be $True
    
        $Bound.Administrator | Should Be $False
    
    }
    
    IT "Verifies ia.bound.true2 user" {
    
        $User = Get-JCUser -Username 'ia.bound.true2'
    
        $User.activated | Should be $False
    
        $Bound = Get-JCSystemUser -SystemID $SystemID | ? username -EQ 'ia.bound.true2'
    
        $Bound.DirectBind | Should Be $True
    
        $Bound.Administrator | Should Be $True
    
    }
    
    IT "Verifies ia.bound.false2 user" {
    
        $User = Get-JCUser -Username 'ia.bound.false2' | ? username -EQ 'ia.bound.false2'
    
        $User.activated | Should be $False
    
        $Bound = Get-JCSystemUser -SystemID $SystemID | ? username -EQ 'ia.bound.false2'
    
        $Bound.DirectBind | Should Be $True
    
        $Bound.Administrator | Should Be $False
    
    }

    IT "Verifies a.1group user" {
    
        $User = Get-JCUser -Username 'a.1group' | ? username -EQ 'a.1group'
    
        $User.activated | Should be $True
    
        $Groups = Get-JCGroup -Type User | Get-JCUserGroupMember | ? Username -EQ 'a.1group'
    
        $Groups.GroupName.count | Should Be 1
    
    }

    IT "Verifies ia.1group user" {
    
        $User = Get-JCUser -Username 'ia.1group' | ? username -EQ 'ia.1group'
    
        $User.activated | Should be $False
    
        $Groups = Get-JCGroup -Type User | Get-JCUserGroupMember | ? Username -EQ 'ia.1group'
    
        $Groups.GroupName.count | Should Be 1
    
    }

    IT "Verifies a.2group user" {
    
        $User = Get-JCUser -Username 'a.2group' | ? Username -EQ 'a.2group'
    
        $User.activated | Should be $True
    
        $Groups = Get-JCGroup -Type User | Get-JCUserGroupMember | ? Username -EQ 'a.2group'
    
        $Groups.count | Should Be 2
    
    }

    IT "Verifies ia.2group user" {
    
        $User = Get-JCUser -Username 'ia.2group' | ? username -EQ 'ia.2group'
    
        $User.activated | Should be $False
    
        $Groups = Get-JCGroup -Type User | Get-JCUserGroupMember | ? Username -EQ 'ia.2group'
    
        $Groups.count | Should Be 2
    
    }

    IT "Verifies a.2group user" {
    
        $User = Get-JCUser -Username 'a.2group' | ? username -EQ 'a.2group'
    
        $User.activated | Should be $True
    
        $Groups = Get-JCGroup -Type User | Get-JCUserGroupMember | ? Username -EQ 'a.2group'
    
        $Groups.count | Should Be 2
    
    }

    IT "Verifies ia.2group user" {
    
        $User = Get-JCUser -Username 'ia.2group' | ? username -EQ 'ia.2group'
    
        $User.activated | Should be $False
    
        $Groups = Get-JCGroup -Type User | Get-JCUserGroupMember | ? Username -EQ 'ia.2group'
    
        $Groups.count | Should Be 2
    
    }

    IT "Verifies a.5group user" {
    
        $User = Get-JCUser -Username 'a.5group' | ? username -EQ 'a.5group'
    
        $User.activated | Should be $True
    
        $Groups = Get-JCGroup -Type User | Get-JCUserGroupMember | ? Username -EQ 'a.5group'
    
        $Groups.count | Should Be 5
    
    }
    
    IT "Verifies ia.5group user" {
    
        $User = Get-JCUser -Username 'ia.5group' | ? Username -EQ 'ia.5group'
    
        $User.activated | Should be $False
    
        $Groups = Get-JCGroup -Type User | Get-JCUserGroupMember | ? Username -EQ 'ia.5group'
    
        $Groups.count | Should Be 5
    
    }

    IT "Verifies a.1attr user" {
    
        $User = Get-JCUser -Username 'a.1attr' | ? username -EQ 'a.1attr'
    
        $User.activated | Should be $True
     
        $User.attributes._id.count | Should Be 1
    
    }
    
    IT "Verifies ia.1attr user" {
    
        $User = Get-JCUser -Username 'ia.1attr' | ? username -Eq 'ia.1attr'
    
        $User.activated | Should be $False
    
        $attrs = 
    
        $User.attributes._id.count | Should Be 1
    
    }

    IT "Verifies a.2attr user" {
    
        $User = Get-JCUser -Username 'a.2attr' | ? username -EQ 'a.2attr'
    
        $User.activated | Should be $True
     
        $User.attributes._id.count | Should Be 2
    
    }
    
    IT "Verifies ia.2attr user" {
    
        $User = Get-JCUser -Username 'ia.2attr' | ? username -EQ 'ia.2attr'
    
        $User.activated | Should be $False
    
        $attrs = 
    
        $User.attributes._id.count | Should Be 2
    
    }

    IT "Verifies a.5attr user" {
    
        $User = Get-JCUser -Username 'a.5attr' | ? username -EQ 'a.5attr'
    
        $User.activated | Should be $True
     
        $User.attributes._id.count | Should Be 5
    
    }
    
    IT "Verifies ia.5attr user" {
    
        $User = Get-JCUser -Username 'ia.5attr' | ? username -EQ 'ia.5attr'
    
        $User.activated | Should be $False
    
        $attrs = 
    
        $User.attributes._id.count | Should Be 5
    
    }

    IT "Verifies a.all" {

        $User = Get-JCUser -Username 'a.all' | ? username -EQ 'a.all'
    
        $User.activated | Should be $True
     
        $User.attributes._id.count | Should Be 5

        $Groups = Get-JCGroup -Type User | Get-JCUserGroupMember | ? Username -EQ 'a.all'
    
        $Groups.count | Should Be 5

        $Bound = Get-JCSystemUser -SystemID $SystemID | ? username -EQ 'a.all'
    
        $Bound.DirectBind | Should Be $True
    
        $Bound.Administrator | Should Be $True

    }

    IT "Verifies ia.all" {

        $User = Get-JCUser -Username 'ia.all' | ? username -EQ 'ia.all'
    
        $User.activated | Should be $False
     
        $User.attributes._id.count | Should Be 5

        $Groups = Get-JCGroup -Type User | Get-JCUserGroupMember | ? Username -EQ 'ia.all'
    
        $Groups.count | Should Be 5

        $Bound = Get-JCSystemUser -SystemID $SystemID | ? username -EQ 'ia.all'
    
        $Bound.DirectBind | Should Be $True
    
        $Bound.Administrator | Should Be $True


    }
    



}


# Cleans up newly created users from CSV import by deleteing them

Get-JCUser | ? Email -like *pleasedelete* | Remove-JCUser -force