Tests/Integration/ADGroupMember.tests.ps1

[CmdletBinding()]
param (
    [Parameter()]
    [string] $Server,
    
    [Parameter(Mandatory)]
    [PSCredential] $PSCredential
)

# HACK this is the only way I can figure out how to get the cred parameters into Pester BeforeAll context.
$global:Credential = $PSCredential

Import-Module $PSScriptRoot\..\.. -Force -Verbose:$false

Describe 'ADGroup Membership' -Tags Integration {
    BeforeAll {
        [Diagnostics.CodeAnalysis.SuppressMessage("UseDeclaredVarsMoreThanAssignments","", Scope="member")]
        $ConnectionParam = @{
            Server = $Server
            Credential = $global:Credential
        }
    }

    It 'Can Add-ADGroupMember and test using Get-ADGroup' {
        # prepare
        $groupCode = 2
        $testGroup = "parentGroup$groupCode"
        $newGroup = New-ADGroup @ConnectionParam -Name $testGroup -Verbose:$VerbosePreference -PassThru
        $newGroup.member.Count | Should -Be 0

        $testUser1Name = "childUser1ForGroup$groupCode"
        $testUser1 = New-ADUser @ConnectionParam -Name $testUser1Name -Verbose:$VerbosePreference -PassThru
        $testUser2Name = "childUser2ForGroup$groupCode"
        $newUser2 = New-ADUser @ConnectionParam -Name $testUser2Name -Verbose:$VerbosePreference -PassThru

        # act
        Add-ADGroupMember @ConnectionParam -Identity $newGroup.distinguishedName -Members $testUser1.distinguishedName, $newUser2.distinguishedName

        # examine

        ## test fetch from AD
        $loadedADGroup = Get-ADGroup @ConnectionParam -Identity $newGroup.distinguishedName
        $loadedADGroup.member | Should -Contain "CN=childUser1ForGroup$groupCode,CN=Users,DC=samdom,DC=example,DC=com"
        $loadedADGroup.member | Should -Contain "CN=childUser2ForGroup$groupCode,CN=Users,DC=samdom,DC=example,DC=com"
        $loadedADGroup.member.Count | Should -Be 2
    }

    It 'Can Add-ADGroupMember to existing ADGroup' {
        # prepare
        $groupCode = 2
        $testGroupName = "parentGroup$groupCode"
        $newGroup = New-ADGroup @ConnectionParam -Name $testGroupName -Verbose:$VerbosePreference -PassThru
        $newGroup.member.Count | Should -Be 0

        $testUser1Name = "childUser1ForGroup$groupCode"
        $testUser1 = New-ADUser @ConnectionParam -Name $testUser1Name -Verbose:$VerbosePreference -PassThru
        $testUser2Name = "childUser2ForGroup$groupCode"
        $newUser2 = New-ADUser @ConnectionParam -Name $testUser2Name -Verbose:$VerbosePreference -PassThru

        Add-ADGroupMember @ConnectionParam -Identity $testGroupName -Members $testUser1.distinguishedName, $newUser2.distinguishedName

        # act
        $testUser3Name = "childUser3ForGroup$groupCode"
        $testUser3 = New-ADUser @ConnectionParam -Name $testUser3Name -Verbose:$VerbosePreference -PassThru
        Add-ADGroupMember @ConnectionParam -Identity $testGroupName -Members $testUser3.distinguishedName

        # examine

        ## test fetch from AD
        $loadedADGroup = Get-ADGroup @ConnectionParam -Identity $newGroup.distinguishedName
        $loadedADGroup.member | Should -Contain "CN=childUser1ForGroup$groupCode,CN=Users,DC=samdom,DC=example,DC=com"
        $loadedADGroup.member | Should -Contain "CN=childUser2ForGroup$groupCode,CN=Users,DC=samdom,DC=example,DC=com"
        $loadedADGroup.member | Should -Contain "CN=childUser3ForGroup$groupCode,CN=Users,DC=samdom,DC=example,DC=com"
        $loadedADGroup.member.Count | Should -Be 3
    }

    It 'Can Remove-ADGroupMember' {
        # prepare
        $groupCode = 3
        $testGroupName = "parentGroup$groupCode"
        $newGroup = New-ADGroup @ConnectionParam -Name $testGroupName -Verbose:$VerbosePreference -PassThru
        $newGroup.member.Count | Should -Be 0

        $testUser1Name = "childUser1ForGroup$groupCode"
        $testUser1 = New-ADUser @ConnectionParam -Name $testUser1Name -Verbose:$VerbosePreference -PassThru
        $testUser2Name = "childUser2ForGroup$groupCode"
        $newUser2 = New-ADUser @ConnectionParam -Name $testUser2Name -Verbose:$VerbosePreference -PassThru

        Add-ADGroupMember @ConnectionParam -Identity $newGroup.distinguishedName -Members $testUser1.distinguishedName, $newUser2.distinguishedName

        # act
        Remove-ADGroupMember @ConnectionParam -Identity $newGroup.distinguishedName -Members $testUser1.distinguishedName

        # examine

        ## test fetch from AD
        $loadedADGroup = Get-ADGroup @ConnectionParam -Identity $newGroup.distinguishedName
        $loadedADGroup.member | Should -Not -Contain "CN=childUser1ForGroup$groupCode,CN=Users,DC=samdom,DC=example,DC=com"
        $loadedADGroup.member | Should -Contain "CN=childUser2ForGroup$groupCode,CN=Users,DC=samdom,DC=example,DC=com"
        $loadedADGroup.member.Count | Should -Be 1
    }

    AfterEach {
        Write-Verbose "Cleanup in $($MyInvocation.MyCommand.ScriptBlock.File | Split-Path -Leaf)."
        & "$PSScriptRoot\Shared\Clear-TestObjects.ps1"
    }
}