PSISE_Addons.Tests.ps1

$Here = Split-Path -Parent $MyInvocation.MyCommand.Path
$RootLocation = Split-Path -Parent $here


$Scripts = Get-ChildItem "$here\" -Filter '*.ps1' -Recurse | Where-Object {$_.name -NotMatch "Tests.ps1"}
$Modules = Get-ChildItem "$here\" -Filter '*.psm1' -Recurse

if ($Modules.count -gt 0) {
Describe "Testing all Modules in this Repo to be be correctly formatted" {

    foreach($module in $modules)
    {

    Context "Testing Module - $($module.BaseName) for Standard Processing" {
    Import-Module $module.FullName
          It "Is valid Powershell (Has no script errors)" {

                $contents = Get-Content -Path $module.FullName -ErrorAction Stop
                $errors = $null
             $null = [System.Management.Automation.PSParser]::Tokenize($contents, [ref]$errors)
                $errors.Count | Should Be 0
            }
            It "Has a root module file ($module_name.psm1)" {        
            
        $module.FullName.Replace('psm1','psd1') | Should Exist
    }

    It "Has a manifest file ($($module.BaseName).psd1)" {
            
        $module.FullName.Replace('psm1','psd1') | Should Exist
    }

    It "Contains a root module path in the manifest" {
            
        $module.FullName.Replace('psm1','psd1') | Should Contain "$module_name.psm1"
    }

    It "Contains all needed properties in the Manifest for PSGallery Uploads" {
    
        $module.FullName.Replace('psm1','psd1') | Should Contain "Author = *"
    }

     It 'passes the PSScriptAnalyzer without Errors' {
        (Invoke-ScriptAnalyzer -Path $module.Directory -Recurse -Severity Error).Count | Should Be 0
    }

     It 'passes the PSScriptAnalyzer with less than 10 Warnings excluding PSUseShouldProcessForStateChangingFunctions Rule as it is currently Pants!' {
        (Invoke-ScriptAnalyzer -Path $module.Directory -Recurse -Severity Warning -ExcludeRule PSUseShouldProcessForStateChangingFunctions,PSUseSingularNouns).Count | Should BeLessThan 10 
    }
    }
    $functions = Get-Command -FullyQualifiedModule $module.BaseName 
    foreach($modulefunction in $functions)
    {
    
        Context "Testing that the function - $($modulefunction.Name) - is compliant" {
            It "Function $($modulefunction.Name) Has show-help comment block" {

                $modulefunction.Definition.Contains('<#') | should be 'True'
                $modulefunction.Definition.Contains('#>') | should be 'True'
            }

            It "Function $($modulefunction.Name) Has show-help comment block has a.SYNOPSIS" {

                $modulefunction.Definition.Contains('.SYNOPSIS') -or $modulefunction.Definition.Contains('.Synopsis') | should be 'True'
                

            }

            It "Function $($modulefunction.Name) Has show-help comment block has an example" {

                $modulefunction.Definition.Contains('.EXAMPLE') | should be 'True'
            }

            It "Function $($modulefunction.Name) Is an advanced function" {

                $modulefunction.CmdletBinding | should be 'True'
                $modulefunction.Definition.Contains('param') -or  $modulefunction.Definition.Contains('Param') | should be 'True'
            }
            }
        }
    }
 }
}

if ($scripts.count -gt 0) {
Describe "Testing all Scripts in this Repo to be be correctly formatted" {

    foreach($Script in $Scripts)
    {

    Context "Testing Script - $($Script.BaseName) for Standard Processing" {
    
          It "Is valid Powershell (Has no script errors)" {

                $contents = Get-Content -Path $script.FullName -ErrorAction Stop
                $errors = $null
                $null = [System.Management.Automation.PSParser]::Tokenize($contents, [ref]$errors)
                $errors.Count | Should Be 0
            }
            
     It 'passes the PSScriptAnalyzer without Errors' {
        (Invoke-ScriptAnalyzer -Path $script.FullName -Severity Error).Count | Should Be 0
    }

     It 'passes the PSScriptAnalyzer with less than 10 Warnings excluding PSUseShouldProcessForStateChangingFunctions Rule as it is currently Pants!' {
        (Invoke-ScriptAnalyzer -Path $script.FullName -Severity Warning -ExcludeRule PSUseShouldProcessForStateChangingFunctions).Count | Should BeLessThan 10 
    }

    It "Has show-help comment block" {

                $script.FullName | should contain '<#'
                $script.FullName | should contain '#>'
            }

            It "Has show-help comment block has a synopsis" {

                $script.FullName | should contain '\.SYNOPSIS'
            }

            It "Has show-help comment block has an example" {

                $script.FullName | should contain '\.EXAMPLE'
            }

            It "Is an advanced function" {

                $script.FullName | should contain 'function'
                $script.FullName | should contain 'cmdletbinding'
                $script.FullName | should contain 'param'
            }
            }

        }
    }
}