Tests/Get-DhcpScopeUsage.Tests.ps1

#region Discovery
$ModuleName = 'PS2HTMLTable'
if (Get-Module $ModuleName) {
    Remove-Module -Name $ModuleName -Force
}
#endregion Discovery

BeforeAll {
    $ModuleName = 'PS2HTMLTable'
    $ModuleRoot = Split-Path $PSScriptRoot
    Import-Module -Name "$ModuleRoot\$ModuleName"
}
AfterAll {
    if (Get-Module $ModuleName) {
        Remove-Module -Name $ModuleName -Force
    }
}

Describe "$ModuleName Get-DhcpScopeUsage Example Tests"  {
    BeforeAll {
        $paramsPercentInUse = @{
            # Column name
            Column = "% In Use"
            # Test criteria: Is value greater than or equal to Argument?
            ScriptBlock = {[double]$args[0] -ge [double]$args[1]}
            # CSS attribute to add if ScriptBlock is true
            CSSAttribute = "style"
            # Format column with 2 decimal places and add a percent symbol
            StringFormat = "{0:N2} %"
        }
    
        $MyCSS = '
        body {
            color: #333333;
            font-family: Calibri,Tahoma,Arial,Verdana;
            font-size: 11pt;
            margin: 0px;
            padding: 0px;
        }
        h3 {
            margin: 0px 0px 5px 0px;
        }
        h4 {
            margin: 0px;
        }
        table {
            border-collapse: collapse;
            border-bottom: solid black 1px;
        }
        th {
            text-align: center;
            font-weight: bold;
            border-top: 1px solid black;
            border-bottom: 1px solid black;
            white-space: nowrap;
            padding: 0px 10px 0px 10px;
        }
        td {
            padding: 2px 10px 2px 10px;
            text-align: center;
            white-space: nowrap;
        }
        .odd {
            background-color: #ffffff;
        }
        .even {
            background-color: #dddddd;
        }'

        Mock -CommandName Get-DHCPServerv4Scope -MockWith {
            9..0 | ForEach-Object {
                [PSCustomObject]@{
                    ScopeId         =   "192.168.$_.0"
                    Name            =   "VLAN $_"
                    State           =   "Active"
                    LeaseDuration   =   New-TimeSpan -Days 8
                    SubnetMask      =   "255.255.255.0"
                    StartRange      =   "192.168.$_.1"
                    EndRange        =   "192.168.$_.254"
                }
            }
        }
        Mock -CommandName Get-DhcpServerv4ScopeStatistics -MockWith {
            [PSCustomObject]@{
                Free            =   197
                InUse           =   57
                PercentageInUse =   22.44094
            }
        } -ParameterFilter {$ScopeId -eq "192.168.0.0"}
        Mock -CommandName Get-DhcpServerv4ScopeStatistics -MockWith {
            [PSCustomObject]@{
                Free            =   14
                InUse           =   240
                PercentageInUse =   94.48818
            }
        } -ParameterFilter {$ScopeId -eq "192.168.1.0"}
        Mock -CommandName Get-DhcpServerv4ScopeStatistics -MockWith {
            [PSCustomObject]@{
                Free            =   242
                InUse           =   12
                PercentageInUse =   4.72440
            }
        } -ParameterFilter {$ScopeId -eq "192.168.2.0"}
        Mock -CommandName Get-DhcpServerv4ScopeStatistics -MockWith {
            [PSCustomObject]@{
                Free            =   249
                InUse           =   5
                PercentageInUse =   1.96850
            }
        } -ParameterFilter {$ScopeId -eq "192.168.3.0"}
        Mock -CommandName Get-DhcpServerv4ScopeStatistics -MockWith {
            [PSCustomObject]@{
                Free            =   197
                InUse           =   57
                PercentageInUse =   22.44094
            }
        } -ParameterFilter {$ScopeId -eq "192.168.4.0"}
        Mock -CommandName Get-DhcpServerv4ScopeStatistics -MockWith {
            [PSCustomObject]@{
                Free            =   204
                InUse           =   50
                PercentageInUse =   19.68503
            }
        } -ParameterFilter {$ScopeId -eq "192.168.5.0"}
        Mock -CommandName Get-DhcpServerv4ScopeStatistics -MockWith {
            [PSCustomObject]@{
                Free            =   253
                InUse           =   1
                PercentageInUse =   0.39370
            }
        } -ParameterFilter {$ScopeId -eq "192.168.6.0"}
        Mock -CommandName Get-DhcpServerv4ScopeStatistics -MockWith {
            [PSCustomObject]@{
                Free            =   217
                InUse           =   37
                PercentageInUse =   14.56692
            }
        } -ParameterFilter {$ScopeId -eq "192.168.7.0"}
        Mock -CommandName Get-DhcpServerv4ScopeStatistics -MockWith {
            [PSCustomObject]@{
                Free            =   253
                InUse           =   1
                PercentageInUse =   0.39370
            }
        } -ParameterFilter {$ScopeId -eq "192.168.8.0"}
        Mock -CommandName Get-DhcpServerv4ScopeStatistics -MockWith {
            [PSCustomObject]@{
                Free            =   212
                InUse           =   42
                PercentageInUse =   16.53543
            }
        } -ParameterFilter {$ScopeId -eq "192.168.9.0"}

        Mock -CommandName Get-DhcpServerv4Reservation -MockWith {
        } #-ParameterFilter {$ScopeId -eq "192.168.9.0"}
        Mock -CommandName Get-DhcpServerv4Reservation -MockWith {
            1..3 | ForEach-Object {
                [PSCustomObject]@{
                    Name = 'Value'
                }
            }
        } -ParameterFilter {$ScopeId -eq "192.168.2.0"}
        Mock -CommandName Get-DhcpServerv4Reservation -MockWith {
            1..2 | ForEach-Object {
                [PSCustomObject]@{
                    Name = 'Value'
                }
            }
        } -ParameterFilter {$ScopeId -eq "192.168.3.0"}
        Mock -CommandName Get-DhcpServerv4Reservation -MockWith {
            1..4 | ForEach-Object {
                [PSCustomObject]@{
                    Name = 'Value'
                }
            }
        } -ParameterFilter {$ScopeId -eq "192.168.7.0"}
        Mock -CommandName Get-DhcpServerv4Reservation -MockWith {
            1..4 | ForEach-Object {
                [PSCustomObject]@{
                    Name = 'Value'
                }
            }
        } -ParameterFilter {$ScopeId -eq "192.168.9.0"}
        $ScopesArray = @()
        $Scopes = Get-DHCPServerv4Scope -ComputerName $ComputerName
        #Assert-MockCalled -CommandName 'Get-DHCPServerv4Scope' -Times 1 -Scope It
        #$Scopes.Count | Should -Be 10
        foreach ($Scope in $Scopes) {
            $Statistics = Get-DhcpServerv4ScopeStatistics -ComputerName $ComputerName -ScopeId $Scope.ScopeId
            $ScopeObj = [PSCustomObject]@{
                "ID"                = $Scope.ScopeId
                "Name"              = $Scope.Name
                "State"             = $Scope.State
                "Lease Duration"    = $Scope.LeaseDuration
                "Subnet Mask"       = $Scope.SubnetMask
                "Start Range"       = $Scope.StartRange
                "End Range"         = $Scope.EndRange
                "Total Addresses"   = $($Statistics.Free + $Statistics.InUse)
                "Reserved"          = @(Get-DhcpServerv4Reservation -ComputerName $ComputerName -ScopeId $Scope.ScopeId).Count
                "In Use"            = $Statistics.InUse
                "Available"         = $Statistics.Free
                "% In Use"          = $([math]::Round($Statistics.PercentageInUse, 2))
            }
            $ScopesArray += $ScopeObj
        }
    }
    It 'validates example script output' {
        #Assert-MockCalled -CommandName 'Get-DhcpServerv4Reservation' -Times 10 -Scope It
        #$ScopesArray | Should -BeNullOrEmpty
        $HTML = New-HTMLHead -Style $MyCSS
        $HTMLTable = $ScopesArray | Sort-Object Id | New-HTMLTable -HTMLDecode -SetAlternating
        $HTMLTable = Add-HTMLTableColor -HTML $HTMLTable -Argument 80 -CSSAttributeValue "background:#ed5e3c;" @paramsPercentInUse -ApplyFormat
        $HTML += $HTMLTable
        $HTML = $HTML | Close-HTML -Validate
        $HTML | Should -BeExactly @'
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"[]>
<html xmlns="http://www.w3.org/1999/xhtml" lang="en">
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <style>
 
        body {
            color: #333333;
            font-family: Calibri,Tahoma,Arial,Verdana;
            font-size: 11pt;
            margin: 0px;
            padding: 0px;
        }
        h3 {
            margin: 0px 0px 5px 0px;
        }
        h4 {
            margin: 0px;
        }
        table {
            border-collapse: collapse;
            border-bottom: solid black 1px;
        }
        th {
            text-align: center;
            font-weight: bold;
            border-top: 1px solid black;
            border-bottom: 1px solid black;
            white-space: nowrap;
            padding: 0px 10px 0px 10px;
        }
        td {
            padding: 2px 10px 2px 10px;
            text-align: center;
            white-space: nowrap;
        }
        .odd {
            background-color: #ffffff;
        }
        .even {
            background-color: #dddddd;
        }
</style>
  </head>
  <body>
    <table>
      <colgroup>
        <col />
        <col />
        <col />
        <col />
        <col />
        <col />
        <col />
        <col />
        <col />
        <col />
        <col />
        <col />
      </colgroup>
      <tr>
        <th>ID</th>
        <th>Name</th>
        <th>State</th>
        <th>Lease Duration</th>
        <th>Subnet Mask</th>
        <th>Start Range</th>
        <th>End Range</th>
        <th>Total Addresses</th>
        <th>Reserved</th>
        <th>In Use</th>
        <th>Available</th>
        <th>% In Use</th>
      </tr>
      <tr class="even first-child">
        <td valign="top">192.168.0.0</td>
        <td valign="top">VLAN 0</td>
        <td valign="top">Active</td>
        <td valign="top">8.00:00:00</td>
        <td valign="top">255.255.255.0</td>
        <td valign="top">192.168.0.1</td>
        <td valign="top">192.168.0.254</td>
        <td valign="top">254</td>
        <td valign="top">0</td>
        <td valign="top">57</td>
        <td valign="top">197</td>
        <td valign="top">22.44 %</td>
      </tr>
      <tr class="odd">
        <td valign="top">192.168.1.0</td>
        <td valign="top">VLAN 1</td>
        <td valign="top">Active</td>
        <td valign="top">8.00:00:00</td>
        <td valign="top">255.255.255.0</td>
        <td valign="top">192.168.1.1</td>
        <td valign="top">192.168.1.254</td>
        <td valign="top">254</td>
        <td valign="top">0</td>
        <td valign="top">240</td>
        <td valign="top">14</td>
        <td valign="top" style="background:#ed5e3c;">94.49 %</td>
      </tr>
      <tr class="even">
        <td valign="top">192.168.2.0</td>
        <td valign="top">VLAN 2</td>
        <td valign="top">Active</td>
        <td valign="top">8.00:00:00</td>
        <td valign="top">255.255.255.0</td>
        <td valign="top">192.168.2.1</td>
        <td valign="top">192.168.2.254</td>
        <td valign="top">254</td>
        <td valign="top">3</td>
        <td valign="top">12</td>
        <td valign="top">242</td>
        <td valign="top">4.72 %</td>
      </tr>
      <tr class="odd">
        <td valign="top">192.168.3.0</td>
        <td valign="top">VLAN 3</td>
        <td valign="top">Active</td>
        <td valign="top">8.00:00:00</td>
        <td valign="top">255.255.255.0</td>
        <td valign="top">192.168.3.1</td>
        <td valign="top">192.168.3.254</td>
        <td valign="top">254</td>
        <td valign="top">2</td>
        <td valign="top">5</td>
        <td valign="top">249</td>
        <td valign="top">1.97 %</td>
      </tr>
      <tr class="even">
        <td valign="top">192.168.4.0</td>
        <td valign="top">VLAN 4</td>
        <td valign="top">Active</td>
        <td valign="top">8.00:00:00</td>
        <td valign="top">255.255.255.0</td>
        <td valign="top">192.168.4.1</td>
        <td valign="top">192.168.4.254</td>
        <td valign="top">254</td>
        <td valign="top">0</td>
        <td valign="top">57</td>
        <td valign="top">197</td>
        <td valign="top">22.44 %</td>
      </tr>
      <tr class="odd">
        <td valign="top">192.168.5.0</td>
        <td valign="top">VLAN 5</td>
        <td valign="top">Active</td>
        <td valign="top">8.00:00:00</td>
        <td valign="top">255.255.255.0</td>
        <td valign="top">192.168.5.1</td>
        <td valign="top">192.168.5.254</td>
        <td valign="top">254</td>
        <td valign="top">0</td>
        <td valign="top">50</td>
        <td valign="top">204</td>
        <td valign="top">19.69 %</td>
      </tr>
      <tr class="even">
        <td valign="top">192.168.6.0</td>
        <td valign="top">VLAN 6</td>
        <td valign="top">Active</td>
        <td valign="top">8.00:00:00</td>
        <td valign="top">255.255.255.0</td>
        <td valign="top">192.168.6.1</td>
        <td valign="top">192.168.6.254</td>
        <td valign="top">254</td>
        <td valign="top">0</td>
        <td valign="top">1</td>
        <td valign="top">253</td>
        <td valign="top">0.39 %</td>
      </tr>
      <tr class="odd">
        <td valign="top">192.168.7.0</td>
        <td valign="top">VLAN 7</td>
        <td valign="top">Active</td>
        <td valign="top">8.00:00:00</td>
        <td valign="top">255.255.255.0</td>
        <td valign="top">192.168.7.1</td>
        <td valign="top">192.168.7.254</td>
        <td valign="top">254</td>
        <td valign="top">4</td>
        <td valign="top">37</td>
        <td valign="top">217</td>
        <td valign="top">14.57 %</td>
      </tr>
      <tr class="even">
        <td valign="top">192.168.8.0</td>
        <td valign="top">VLAN 8</td>
        <td valign="top">Active</td>
        <td valign="top">8.00:00:00</td>
        <td valign="top">255.255.255.0</td>
        <td valign="top">192.168.8.1</td>
        <td valign="top">192.168.8.254</td>
        <td valign="top">254</td>
        <td valign="top">0</td>
        <td valign="top">1</td>
        <td valign="top">253</td>
        <td valign="top">0.39 %</td>
      </tr>
      <tr class="odd last-child">
        <td valign="top">192.168.9.0</td>
        <td valign="top">VLAN 9</td>
        <td valign="top">Active</td>
        <td valign="top">8.00:00:00</td>
        <td valign="top">255.255.255.0</td>
        <td valign="top">192.168.9.1</td>
        <td valign="top">192.168.9.254</td>
        <td valign="top">254</td>
        <td valign="top">4</td>
        <td valign="top">42</td>
        <td valign="top">212</td>
        <td valign="top">16.54 %</td>
      </tr>
    </table>
  </body>
</html>
'@

    }
}