Public/AppPool.ps1

<#
.SYNOPSIS
    Test an Application Pool
.DESCRIPTION
    Used To Determine if Application Pool is Running and Validate Various Properties
.PARAMETER Target
    The name of the App Pool to be Tested
.PARAMETER Property
    The Property to be expanded. If Ommitted, Property Will Default to Status. Can handle nested objects within properties
.PARAMETER Should
    A Script Block defining a Pester Assertion.
.EXAMPLE
    AppPool TestSite { Should be Started }
.EXAMPLE
    AppPool TestSite ManagedPipelineMode { Should be 'Integrated' }
.EXAMPLE
    AppPool TestSite ProcessModel.IdentityType { Should be 'ApplicationPoolIdentity'}
.NOTES
    Assertions: be
#>

function AppPool {
    [CmdletBinding(DefaultParameterSetName="Default")]
    param(
        [Parameter(Mandatory, Position=1, ParameterSetName="Default")]
        [Parameter(Mandatory, Position=1, ParameterSetName="Property")]
        [Alias("Path")]
        [string]$Target,

        [Parameter(Position=2, ParameterSetName="Property")]
        [string]$Property,

        [Parameter(Mandatory, Position=2, ParameterSetName="Default")]
        [Parameter(Mandatory, Position=3, ParameterSetName="Property")]
        [scriptblock]$Should
    )

    $IISAdmin = Get-Module -ListAvailable | ? { $_.Name -match 'IISAdministration' }
    if ($IISAdmin) {
      Import-Module IISAdministration
    }
    else {
      . $GetIISAppPool
    }

    $expression = $null
    $params = $null

    if (-not $PSBoundParameters.ContainsKey('Property')) {
      $Property = 'State'
      $PSBoundParameters.add('Property', $Property)
      $expression = { Get-IISAppPool -Name '$Target' -ErrorAction SilentlyContinue+ }
      $params = Get-PoshspecParam -TestName AppPool -TestExpression $expression @PSBoundParameters
    }

    if ($Property -like '*.*') {
      $lastIndexOfPeriod = $Property.LastIndexOf('.')
      $Qualifier = $Property.substring(0, $lastIndexOfPeriod)
      $NewProperty = $Property.substring($lastIndexOfPeriod + 1)
      $expression = { (Get-IISAppPool -Name '$Target' -ErrorAction SilentlyContinue).$Qualifier }
      $paramsHash = @{
        Target = $Target
        TestName = "AppPool"
        TestExpression = $expression
        Property = $NewProperty
        Should = $Should
        Qualifier = $Qualifier
      }
      $params = Get-PoshspecParam @paramsHash
    }

    else {
      $expression = { Get-IISAppPool -Name '$Target' -ErrorAction SilentlyContinue }
      $params = Get-PoshspecParam -TestName AppPool -TestExpression $expression @PSBoundParameters
    }

    Invoke-PoshspecExpression @params
}

$GetIISAppPool = {
  function Get-IisAppPool
  {
    [CmdletBinding()]
    Param
    (
      [Parameter(Mandatory=$true,
                 Position=1)]
      [string]$Name
    )

    Begin
    {
      [System.Reflection.Assembly]::LoadFrom("$($Env:windir)\system32\inetsrv\Microsoft.Web.Administration.dll") | Out-Null
      $ServerManager = [Microsoft.Web.Administration.ServerManager]::OpenRemote("localhost")
    }

    Process
    {
      try
      {
        Write-Verbose "Getting application pool $Name"
        Write-Output $ServerManager.ApplicationPools[$Name]
      }

      catch
      {
        Write-Warning $Error[0]
      }
    }

    End
    {
      $ServerManager.Dispose()
    }
  }
}