internal/functions/Get-CheckFile.ps1

<#
.SYNOPSIS
This will return all of the files that match a Check name - either by name or by pester tag

.DESCRIPTION
This will return all of the files that match a Check name - either by name or by pester tag

for either v4 or v5 Pester checks using the v5 switch

.PARAMETER Repo
The repo paths to check - normally defined by Get-CheckRepo

.PARAMETER Check
The Check

.PARAMETER v5
Are we looking for Pester v5 files or not

.EXAMPLE
Get-CheckFile -Check AutoClose

Gets the files for the AutoClose check

.NOTES
Internal - used in Invoke-DbcCheckv4 and Invoke-DbcCheckv5
#>

function Get-CheckFile {
    [CmdletBinding()]
    param(
        [Parameter(Mandatory = $true)]
        [String]$Repo,
        [Parameter(Mandatory = $true)]
        [String[]]$Check,
        [Parameter()]
        [switch]$v5
    )

    $script:selectedFiles = New-Object System.Collections.Generic.List[String]

    switch ($v5) {
        $false {
            if ($Check.Count -gt 0) {
                # specific checks were requested. find them.
                $TestsPath = Join-Path -Path $Repo -ChildPath '*.Tests.ps1'
                @(Get-ChildItem -Path $TestsPath ).ForEach{
                    # we do not want v5 files here
                    if ($psitem.Name -notmatch 'v5') {
                        $script:checksFile = $psitem.FullName

                        if ($Check -contains ($PSItem.Name -replace '.Tests.ps1', '')) {
                            # file matches by name
                            if (!($script:selectedFiles -contains $script:checksFile)) {
                                $script:selectedFiles.Add($script:checksFile)
                            }
                        } else {
                            @($check).ForEach{
                                if (@([System.IO.File]::ReadAllLines($script:checksFile) | Select-String -Pattern "^\s*Describe.*-Tags\s+.*($psitem)").Matches.Count) {
                                    # file matches by one of the tags
                                    if (!($script:selectedFiles -contains $script:checksFile)) {
                                        $script:selectedFiles.Add($script:checksFile)
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
        $true {
            $message = 'We are going to use v5 files'
            Write-PSFMessage -Message $message -Level Verbose
            if ($Check.Count -gt 0) {
                # specific checks were requested. find them.
                $message = 'Specific checks were requested. find them'
                Write-PSFMessage -Message $message -Level Verbose
                $message = 'Searching Path {0} for test files' -f $repo
                Write-PSFMessage -Message $message -Level Verbose
                $TestsPath = Join-Path -Path $Repo -ChildPath '*.Tests.ps1'
                @(Get-ChildItem -Path $TestsPath ).ForEach{
                    $message = 'Processing {0}' -f $psitem.Name
                    Write-PSFMessage -Message $message -Level Verbose
                    # but we only want v5 files
                    if ($psitem.Name -match 'v5') {

                        $message = '{0} is a v5 file' -f $psitem.Name
                        Write-PSFMessage -Message $message -Level Verbose

                        $script:checksFile = $psitem.FullName

                        if ($Check -contains ($PSItem.Name -replace 'v5.Tests.ps1', '')) {
                            $message = '{0} file matches check {1}' -f $psitem.Name, ($Check | Out-String)
                            Write-PSFMessage -Message $message -Level Verbose
                            # file matches by name
                            if (!($script:selectedFiles -contains $script:checksFile)) {
                                $script:selectedFiles.Add($script:checksFile)
                            }
                        } else {
                            $message = '{0} file does not match check {1} lets check for the tag' -f $psitem.Name, ($Check | Out-String)
                            Write-PSFMessage -Message $message -Level Verbose
                            $fileContent = [System.IO.File]::ReadAllLines($script:checksFile)
                            @($check).ForEach{
                                $message = 'Check file {0} for the tag {1}' -f $script:checksFile, $psitem
                                Write-PSFMessage -Message $message -Level Verbose
                                if (@($fileContent | Select-String -Pattern "^\s*Describe.*-Tag\s+.*($psitem)").Matches.Count) {
                                    $message = 'The file {0} has the tag {1}' -f $script:checksFile, $psitem
                                    Write-PSFMessage -Message $message -Level Verbose
                                    # file matches by one of the tags
                                    if (!($script:selectedFiles -contains $script:checksFile)) {
                                        $script:selectedFiles.Add($script:checksFile)
                                    }
                                } else {
                                    $message = 'The file {0} does not have the tag {1}' -f $script:checksFile, $psitem
                                    Write-PSFMessage -Message $message -Level Verbose
                                }
                            }
                        }
                    }
                }
            }
        }
    }
    return $script:selectedFiles
}