tests/Remove-StartMenuShortcut.Tests.ps1

BeforeAll {
    Import-Module "$PSScriptRoot/../easypeasy.psd1" -Force
    $script:wsh = New-Object -ComObject WScript.Shell
    $script:allUsers = $wsh.SpecialFolders("AllUsersPrograms")
    $script:userPrograms = $wsh.SpecialFolders("Programs")
}

Describe 'Remove-StartMenuShortcut' {

    Context 'the shortcut exists' {

        BeforeEach {
            Mock -ModuleName easypeasy Test-Path { $true }
            Mock -ModuleName easypeasy Remove-Item { }
            Mock -ModuleName easypeasy Get-ChildItem { }   # folder empty after removal
        }

        It 'removes the .lnk under the All Users Programs folder by default' {
            Remove-StartMenuShortcut -Name 'Foo'

            Should -Invoke -ModuleName easypeasy Remove-Item -Times 1 -Exactly `
                -ParameterFilter { $LiteralPath -eq "$allUsers\Foo\Foo.lnk" }
        }

        It 'uses -Folder for the containing folder when given' {
            Remove-StartMenuShortcut -Name 'Foo' -Folder 'Bar'

            Should -Invoke -ModuleName easypeasy Remove-Item -Times 1 -Exactly `
                -ParameterFilter { $LiteralPath -eq "$allUsers\Bar\Foo.lnk" }
        }

        It 'targets the current user Programs folder with -User' {
            Remove-StartMenuShortcut -Name 'Foo' -User

            Should -Invoke -ModuleName easypeasy Remove-Item -Times 1 -Exactly `
                -ParameterFilter { $LiteralPath -eq "$userPrograms\Foo\Foo.lnk" }
        }

        It 'removes the containing folder when it is now empty' {
            Remove-StartMenuShortcut -Name 'Foo'

            Should -Invoke -ModuleName easypeasy Remove-Item -Times 1 -Exactly `
                -ParameterFilter { $LiteralPath -eq "$allUsers\Foo" }
        }

        It 'keeps the containing folder when it still holds other items' {
            Mock -ModuleName easypeasy Get-ChildItem { 'C:\Old\Other.lnk' }

            Remove-StartMenuShortcut -Name 'Foo'

            Should -Invoke -ModuleName easypeasy Remove-Item -Times 0 -Exactly `
                -ParameterFilter { $LiteralPath -eq "$allUsers\Foo" }
        }

        It 'removes nothing under -WhatIf' {
            Remove-StartMenuShortcut -Name 'Foo' -WhatIf

            Should -Invoke -ModuleName easypeasy Remove-Item -Times 0 -Exactly
        }
    }

    Context 'the shortcut is absent' {

        BeforeEach {
            Mock -ModuleName easypeasy Test-Path { $false }
            Mock -ModuleName easypeasy Remove-Item { }
        }

        It 'throws and removes nothing' {
            { Remove-StartMenuShortcut -Name 'Foo' } | Should -Throw '*not found*'
            Should -Invoke -ModuleName easypeasy Remove-Item -Times 0 -Exactly
        }
    }
}