Tests/cChocoFeature_Tests.ps1

# Copyright (c) 2017 Chocolatey Software, Inc.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.


$ResourceName = ((Split-Path $MyInvocation.MyCommand.Path -Leaf) -split '_')[0]
$ResourceFile = (Get-DscResource -Name $ResourceName).Path

$TestsPath    = (split-path -path $MyInvocation.MyCommand.Path -Parent)
$ResourceFile = Get-ChildItem -Recurse $TestsPath\.. -File | Where-Object {$_.name -eq "$ResourceName.psm1"}

Import-Module -Name $ResourceFile.FullName


#---------------------------------#
# Pester tests for cChocoInstall #
#---------------------------------#
Describe "Testing cChocoFeature" {

    Context "Test-TargetResource" {

        mock -ModuleName cChocoFeature -CommandName Get-ChocoFeature -MockWith {
            @([pscustomobject]@{
                Name = "allowGlobalConfirmation"
                State = "Enabled"
                Description = "blah"
            },
            [pscustomobject]@{
                Name = "powershellhost"
                State = "Disabled"
                Description = "blah"
            } )| Where-Object { $_.Name -eq $FeatureName }
        } -Verifiable


        it 'Test-TargetResource returns true when Present and Enabled.' {
            Test-TargetResource -FeatureName 'allowGlobalConfirmation' -Ensure 'Present' | should be $true
        }

        it 'Test-TargetResource returns false when Present and Disabled' {
            Test-TargetResource -FeatureName 'powershellhost' -Ensure 'Present' | should be $false
        }

        it 'Test-TargetResource returns false when Absent and Enabled' {
            Test-TargetResource -FeatureName 'allowGlobalConfirmation' -Ensure 'Absent' | Should be $false
        }

        it 'Test-TargetResource returns true when Absent and Disabled' {
            Test-TargetResource -FeatureName 'powershellhost' -Ensure 'Absent' | should be $true
        }

    }

    Context "Set-TargetResource" {

        InModuleScope -ModuleName cChocoFeature -ScriptBlock {
            function choco {}
            mock choco {} 
        }

        Set-TargetResource -FeatureName "TestFeature" -Ensure "Present"

        it "Present - Should have called choco, with enable" { 
            Assert-MockCalled -CommandName choco -ModuleName cChocoFeature -ParameterFilter {
                $args -contains "enable"
            }
        }

        Set-TargetResource -FeatureName "TestFeature" -Ensure "Absent"

        it "Absent - Should have called choco, with disable" {
            Assert-MockCalled -CommandName choco -ModuleName cChocoFeature -ParameterFilter {
                $args -contains "disable"
            }
        }
    }
}