Tests/xDSCFirewall.Tests.ps1

#requires -Version 1.0
Import-Module -Name .\DSCResources\xDSCFirewall\xDSCFirewall.psm1

$Global:DSCModuleName      = 'xDSCFirewall'
$Global:DSCResourceName    = 'xDSCFirewall'

InModuleScope -ModuleName XDSCFirewall -ScriptBlock {
  $Firewall = New-Object -TypeName PSObject -Property @{
    Enabled               = $true
    LogAllowed            = $false
    LogBlocked            = $true
    LogIgnored            = 'NotConfigured'
    LogMaxSizeKilobytes   = '4096'
    DefaultInboundAction  = 'Block'
    DefaultOutboundAction = 'Allow'
  }

  Describe -Name 'Testing if functions return correct objects' -Fixture {
    It -name 'Get-TargetResource returns a hashtable' -test {
      Get-TargetResource -Zone Public -Ensure Present | Should Be 'System.Collections.Hashtable'
    }

    It -name 'Test-TargetResource returns true or false' -test {
      (Test-TargetResource -Zone Public -Ensure 'Present').GetType() -as [string] | Should Be 'bool'
    }
  }

  Describe -Name "$($Global:DSCResourceName)\Get-TargetResource" -Fixture {
    $Firewall.Enabled = $false
    Mock -CommandName Get-NetFirewallProfile -MockWith {
      $Firewall
    }
    It -name 'Firewall disabled Get-TargetResource should return absent in hash table' -test {
      (Get-TargetResource -Zone Public -Ensure Present).Ensure | Should Be 'Absent'
    }

    $Firewall.Enabled = $true
    Mock -CommandName Get-NetFirewallProfile -MockWith {
      $Firewall
    }
    It -name 'Firewall enabled Get-TargetResource should return present in hash table' -test {
      (Get-TargetResource -Zone Public -Ensure Present).Ensure | Should Be 'Present'
    }
  }
  Describe -Name "Disabling Firewall with $($Global:DSCResourceName)\Set-TargetResource" -Fixture {
    It -name 'Disabling firewall and configuring with values' -test {
      Set-TargetResource -Zone Public -Ensure Absent -LogAllowed False -LogBlocked True -LogIgnored NotConfigured -LogMaxSizeKilobytes 4096 -DefaultInboundAction Block -DefaultOutboundAction Allow
    }
    Context -Name "Testing ensure/absent logic for $($Global:DSCResourceName)\Test-TargetResource on a disabled firewall zone" -Fixture {
      It -name 'Testing Test-TargetResource present logic should return false' -test {
        Test-TargetResource -Zone Public -Ensure Present -LogBlocked True -LogAllowed False -LogIgnored NotConfigured -LogMaxSizeKilobytes 4096 -DefaultInboundAction Block -DefaultOutboundAction Allow | Should Be 'False'
      }
      It -name 'Testing Test-TargetResource absent logic should return true' -test {
        Test-TargetResource -Zone Public -Ensure Absent -LogBlocked True -LogAllowed False -LogIgnored NotConfigured -LogMaxSizeKilobytes 4096 -DefaultInboundAction Block -DefaultOutboundAction Allow | Should Be 'True'
      }
    }
    Context -Name "Testing $($Global:DSCResourceName)\Test-TargetResource operater logic for absent" -Fixture {
      It -name "LogBlocked shouldn't match so should return false" -test {
        Test-TargetResource -Zone Public -Ensure Absent -LogBlocked False -LogAllowed False -LogIgnored NotConfigured -LogMaxSizeKilobytes 4096 -DefaultInboundAction Block -DefaultOutboundAction Allow | Should Be 'False'
      }
      It -name "LogAllowed shouldn't match so should return false" -test {
        Test-TargetResource -Zone Public -Ensure Absent -LogBlocked True -LogAllowed True -LogIgnored NotConfigured -LogMaxSizeKilobytes 4096 -DefaultInboundAction Block -DefaultOutboundAction Allow | Should Be 'False'
      }
      It -name "LogIgnored shouldn't match so should return false" -test {
        Test-TargetResource -Zone Public -Ensure Absent -LogAllowed False -LogBlocked True -LogIgnored False -LogMaxSizeKilobytes 4096 -DefaultInboundAction Block -DefaultOutboundAction Allow | Should Be 'False'
      }
      It -name "LogMaxSizeKilobytes shouldn't match so should return false" -test {
        Test-TargetResource -Zone Public -Ensure Absent -LogAllowed False -LogBlocked True -LogIgnored NotConfigured -LogMaxSizeKilobytes 1024 -DefaultInboundAction Block -DefaultOutboundAction Allow | Should Be 'False'
      }
      It -name "DefaultInboundAction shouldn't match so should return false" -test {
        Test-TargetResource -Zone Public -Ensure Absent -LogAllowed False -LogBlocked True -LogIgnored NotConfigured -LogMaxSizeKilobytes 4096 -DefaultInboundAction Allow -DefaultOutboundAction Allow | Should Be 'False'
      }
      It -name "DefaultInboundAction shouldn't match so should return false" -test {
        Test-TargetResource -Zone Public -Ensure Absent -LogAllowed False -LogBlocked True -LogIgnored NotConfigured -LogMaxSizeKilobytes 4096 -DefaultInboundAction Block -DefaultOutboundAction Block | Should Be 'False'
      }
    }
  }
  Describe -Name "Enabling Firewall with $($Global:DSCResourceName)\Set-TargetResource" -Fixture {
    It -name 'Enabling firewall and configuring with values' -test {
      Set-TargetResource -Zone Public -Ensure Present -LogAllowed False -LogBlocked True -LogIgnored NotConfigured -LogMaxSizeKilobytes 4096 -DefaultInboundAction Block -DefaultOutboundAction Allow
    }
    Context -Name 'Testing ensure/absent logic for Test-TargetResource on a enabled firewall zone' -Fixture {
      It -name 'Testing Test-TargetResource present logic should return true' -test {
        Test-TargetResource -Zone Public -Ensure Present -LogAllowed False -LogBlocked True -LogIgnored NotConfigured -LogMaxSizeKilobytes 4096 -DefaultInboundAction Block -DefaultOutboundAction Allow | Should Be 'true'
      }
      It -name 'Testing Test-TargetResource absent logic should return false' -test {
        Test-TargetResource -Zone Public -Ensure Absent -LogBlocked True -LogAllowed False -LogIgnored NotConfigured -LogMaxSizeKilobytes 4096 -DefaultInboundAction Block -DefaultOutboundAction Allow | Should Be 'false'
      }
    }
    Context -Name "Testing $($Global:DSCResourceName)\Test-TargetResource operater logic for present" -Fixture {
      It -name "LogBlocked shouldn't match so should return false" -test {
        Test-TargetResource -Zone Public -Ensure Present -LogBlocked False -LogAllowed False -LogIgnored NotConfigured -LogMaxSizeKilobytes 4096 -DefaultInboundAction Block -DefaultOutboundAction Allow | Should Be 'False'
      }
      It -name "LogAllowed shouldn't match so should return false" -test {
        Test-TargetResource -Zone Public -Ensure Present -LogBlocked True -LogAllowed True -LogIgnored NotConfigured -LogMaxSizeKilobytes 4096 -DefaultInboundAction Block -DefaultOutboundAction Allow | Should Be 'False'
      }
      It -name "LogIgnored shouldn't match so should return false" -test {
        Test-TargetResource -Zone Public -Ensure Present -LogAllowed False -LogBlocked True -LogIgnored False -LogMaxSizeKilobytes 4096 -DefaultInboundAction Block -DefaultOutboundAction Allow | Should Be 'False'
      }
      It -name "LogMaxSizeKilobytes shouldn't match so should return false" -test {
        Test-TargetResource -Zone Public -Ensure Present -LogAllowed False -LogBlocked True -LogIgnored NotConfigured -LogMaxSizeKilobytes 1024 -DefaultInboundAction Block -DefaultOutboundAction Allow | Should Be 'False'
      }
      It -name "DefaultInboundAction shouldn't match so should return false" -test {
        Test-TargetResource -Zone Public -Ensure Present -LogAllowed False -LogBlocked True -LogIgnored NotConfigured -LogMaxSizeKilobytes 4096 -DefaultInboundAction Allow -DefaultOutboundAction Allow | Should Be 'False'
      }
      It -name "DefaultInboundAction shouldn't match so should return false" -test {
        Test-TargetResource -Zone Public -Ensure Present -LogAllowed False -LogBlocked True -LogIgnored NotConfigured -LogMaxSizeKilobytes 4096 -DefaultInboundAction Block -DefaultOutboundAction Block | Should Be 'False'
      }
    }
  }
  Describe -Name "Setting firewall back to defaults with $($Global:DSCResourceName)\Set-TargetResource" -Fixture {
    It -name 'Enabling firewall with default values' -test {
      Set-TargetResource -Zone Public -Ensure Present -LogAllowed False -LogBlocked False -LogIgnored NotConfigured -LogMaxSizeKilobytes 4096 -DefaultInboundAction NotConfigured -DefaultOutboundAction NotConfigured
    }
    Context -Name "Testing ensure/absent logic for $($Global:DSCResourceName)\Test-TargetResource on a enabled firewall zone" -Fixture {
      It -name 'Testing Test-TargetResource present logic should return true' -test {
        Test-TargetResource -Zone Public -Ensure Present -LogAllowed False -LogBlocked False -LogIgnored NotConfigured -LogMaxSizeKilobytes 4096 -DefaultInboundAction NotConfigured -DefaultOutboundAction NotConfigured | Should Be 'true'
      }
      It -name 'Testing Test-TargetResource absent logic should return false' -test {
        Test-TargetResource -Zone Public -Ensure Absent -LogAllowed False -LogBlocked False -LogIgnored NotConfigured -LogMaxSizeKilobytes 4096 -DefaultInboundAction NotConfigured -DefaultOutboundAction NotConfigured | Should Be 'false'
      }
    }
    Context -Name "Testing $($Global:DSCResourceName)\Test-TargetResource operater logic for present" -Fixture {
      It -name "LogBlocked shouldn't match so should return false" -test {
        Test-TargetResource -Zone Public -Ensure Present -LogBlocked False -LogAllowed False -LogIgnored NotConfigured -LogMaxSizeKilobytes 4096 -DefaultInboundAction Block -DefaultOutboundAction Allow | Should Be 'False'
      }
      It -name "LogAllowed shouldn't match so should return false" -test {
        Test-TargetResource -Zone Public -Ensure Present -LogBlocked True -LogAllowed True -LogIgnored NotConfigured -LogMaxSizeKilobytes 4096 -DefaultInboundAction Block -DefaultOutboundAction Allow | Should Be 'False'
      }
      It -name "LogIgnored shouldn't match so should return false" -test {
        Test-TargetResource -Zone Public -Ensure Present -LogAllowed False -LogBlocked True -LogIgnored False -LogMaxSizeKilobytes 4096 -DefaultInboundAction Block -DefaultOutboundAction Allow | Should Be 'False'
      }
      It -name "LogMaxSizeKilobytes shouldn't match so should return false" -test {
        Test-TargetResource -Zone Public -Ensure Present -LogAllowed False -LogBlocked True -LogIgnored NotConfigured -LogMaxSizeKilobytes 1024 -DefaultInboundAction Block -DefaultOutboundAction Allow | Should Be 'False'
      }
      It -name "DefaultInboundAction shouldn't match so should return false" -test {
        Test-TargetResource -Zone Public -Ensure Present -LogAllowed False -LogBlocked True -LogIgnored NotConfigured -LogMaxSizeKilobytes 4096 -DefaultInboundAction Allow -DefaultOutboundAction Allow | Should Be 'False'
      }
      It -name "DefaultInboundAction shouldn't match so should return false" -test {
        Test-TargetResource -Zone Public -Ensure Present -LogAllowed False -LogBlocked True -LogIgnored NotConfigured -LogMaxSizeKilobytes 4096 -DefaultInboundAction Block -DefaultOutboundAction Block | Should Be 'False'
      }
    }
  }
}