tests/Unit.Tests.ps1

$script:ModuleName = 'BeardAnalysis'
# Removes all versions of the module from the session before importing
Get-Module $ModuleName | Remove-Module
$ModuleBase = Split-Path -Parent $MyInvocation.MyCommand.Path
# For tests in .\Tests subdirectory
if ((Split-Path $ModuleBase -Leaf) -eq 'Tests') {
    $ModuleBase = Split-Path $ModuleBase -Parent
}
## this variable is for the VSTS tasks and is to be used for refernecing any mock artifacts
$Env:ModuleBase = $ModuleBase
Import-Module $ModuleBase\$ModuleName.psd1 -PassThru -ErrorAction Stop | Out-Null
Describe "Basic function unit tests" -Tags Build , Unit {

}
InModuleScope -ModuleName $ModuleName -ScriptBlock {
    Describe "Tests for the Get-SpeakerBeard Command" -Tags Beard , Unit {
        It "Command Get-SpeakerBeard exists" {
            Get-Command Get-SpeakerBeard -ErrorAction SilentlyContinue | Should Not BE NullOrEmpty
        }
        Context "Get-SpeakerBeard Input" {
            BeforeAll {
                $MockFace = (Get-Content $Env:ModuleBase\tests\faces.JSON) -join "`n" | ConvertFrom-Json
                Mock Get-SpeakerFace {$MockFace}
            }
            ## For Checking parameters
            It 'When there is no speaker in the array should return a useful message' {
                Get-SpeakerBeard -Speaker 'Chrissy LeMaire' | Should Be 'No Speaker with a name like that - You entered Chrissy LeMaire'
            }
            It 'Checks the Mock was called for Speaker Face' {
                $assertMockParams = @{
                    'CommandName' = 'Get-SpeakerFace'
                    'Times'       = 1
                    'Exactly'     = $true
                }
                Assert-MockCalled @assertMockParams 
            }
    
        }
        Context "Get-SpeakerBeard Execution" {
            ## Ensuring the code follows the expected path
            BeforeAll {
                $MockFace = (Get-Content $ENV:ModuleBase\tests\faces.JSON) -join "`n" | ConvertFrom-Json
                Mock Get-SpeakerFace {$MockFace}
                Mock Start-Process {}
            }
            It 'Opens the image if ShowImage switch used' {
                Get-SpeakerBeard -Speaker Jaap -ShowImage | Should Be 0.2
            }
            It "Opens the image if ShowImage switch used and Detailed Switch" {
                $Result = (Get-SpeakerBeard -Speaker Jaap -Detailed -ShowImage)
                $Result.Name | Should Be 'JaapBrasser'
                $Result.Beard | Should Be 0.2
                $Result.ImageUrl | Should Be 'http://tugait.pt/2017/wp-content/uploads/2017/04/JaapBrasser-262x272.jpg'
            }
            It 'Checks the Mock was called for Speaker Face' {
                $assertMockParams = @{
                    'CommandName' = 'Get-SpeakerFace'
                    'Times'       = 2
                    'Exactly'     = $true
                }
                Assert-MockCalled @assertMockParams 
            }
            It 'Checks the Mock was called for Start-Process' {
                $assertMockParams = @{
                    'CommandName' = 'Start-Process'
                    'Times'       = 2
                    'Exactly'     = $true
                }
                Assert-MockCalled @assertMockParams 
            }
        }
        Context "Get-SpeakerBeard Output" {
            ## Probably most of tests here
            BeforeAll {
                $MockFace = (Get-Content $ENV:ModuleBase\tests\faces.JSON) -join "`n" | ConvertFrom-Json
                Mock Get-SpeakerFace {$MockFace}
            }
            It "Should Return the Beard Value for a Speaker" {
                Get-SpeakerBeard -Speaker Jaap | Should Be 0.2
            }
            It "Should Return Speaker Name, Beard Value and URL if Detailed Specified" {
                $Result = (Get-SpeakerBeard -Speaker Jaap -Detailed)
                $Result.Name | Should Be 'JaapBrasser'
                $Result.Beard | Should Be 0.2
                $Result.ImageUrl | Should Be 'http://tugait.pt/2017/wp-content/uploads/2017/04/JaapBrasser-262x272.jpg'
            }
            It 'Checks the Mock was called for Speaker Face' {
                $assertMockParams = @{
                    'CommandName' = 'Get-SpeakerFace'
                    'Times'       = 2
                    'Exactly'     = $true
                }
                Assert-MockCalled @assertMockParams 
            }
            It "Returns the Top 1 Ranked Beards" {
                (Get-SpeakerBeard -Top 1).beard.Count | Should Be 1
            }
            It "Returns the Bottom 1 Ranked Beards" {
                (Get-SpeakerBeard -Bottom 1).beard.Count | Should Be 1
            }
            It "Returns the Top 5 Ranked Beards" {
                (Get-SpeakerBeard -Top 5).beard.Count | Should Be 5
            }
            It "Returns the Bottom 5 Ranked Beards" {
                (Get-SpeakerBeard -Bottom 5).beard.Count | Should Be 5
            }
        }
    }
}