Make module name matching for get-module -FullyQualifiedName… (#10329)

This commit is contained in:
Travis Plunk
2019-08-12 14:45:08 -07:00
committed by Aditya Patwardhan
parent 3444925019
commit 11d8cd3230
2 changed files with 63 additions and 6 deletions
@@ -573,9 +573,11 @@ namespace Microsoft.PowerShell.Commands
IDictionary<string, ModuleSpecification> moduleSpecTable,
PSModuleInfo module)
{
const WildcardOptions options = WildcardOptions.IgnoreCase | WildcardOptions.CultureInvariant;
foreach (ModuleSpecification moduleSpec in moduleSpecTable.Values)
{
if (moduleSpec.Name == module.Name || moduleSpec.Name == module.Path || module.Path.Contains(moduleSpec.Name))
WildcardPattern namePattern = WildcardPattern.Get(moduleSpec.Name, options);
if (namePattern.IsMatch(module.Name) || moduleSpec.Name == module.Path || module.Path.Contains(moduleSpec.Name))
{
yield return moduleSpec;
}
@@ -33,6 +33,35 @@ Describe "Get-Module -ListAvailable" -Tags "CI" {
@{ ModPath = "$TestDrive\Modules\Zoo\Too\Zoo.psm1"; Name = 'Zoo'; Version = '0.0'; Count = 1 }
)
$listModuleNameTestCases = @(
@{
Name = 'Foo'
TestCaseName = 'Match case'
ExpectedName = 'Foo'
ModuleVersion = '2.0'
}
@{
Name = 'foo'
TestCaseName = 'Mismatched case'
ExpectedName = 'Foo'
ModuleVersion = '2.0'
}
)
$loadedModuleNameTestCases = @(
@{
Name = 'Microsoft.PowerShell.Managemen*'
TestCaseName = 'Wildcard'
ExpectedName = 'Microsoft.PowerShell.Management'
ModuleVersion = '6.1.0.0'
}
@{
Name = 'microsoft.powershell.managemen*'
TestCaseName = 'Mismatched case'
ExpectedName = 'Microsoft.PowerShell.Management'
ModuleVersion = '6.1.0.0'
}
)
$env:PSModulePath = Join-Path $testdrive "Modules"
}
@@ -114,12 +143,38 @@ Describe "Get-Module -ListAvailable" -Tags "CI" {
$modules[4].Path | Should -BeExactly (Resolve-Path "$testdrive\Modules\Zoo\Too\Zoo.psm1").Path
}
It "Get-Module -FullyQualifiedName <FullyQualifiedName> -ListAvailable" {
$moduleSpecification = @{ModuleName = "Foo"; ModuleVersion = "2.0"}
It "Get-Module -FullyQualifiedName @{ModuleName = '<Name>' ; ModuleVersion = '<ModuleVersion>'} -ListAvailable - <TestCaseName>" -TestCases $listModuleNameTestCases {
param(
[Parameter(Mandatory = $true)]
$Name,
$TestCaseName,
[Parameter(Mandatory = $true)]
$ExpectedName,
$ModuleVersion
)
$moduleSpecification = @{ModuleName = $name ; ModuleVersion = $ModuleVersion}
$modules = Get-Module -FullyQualifiedName $moduleSpecification -ListAvailable
$modules | Should -HaveCount 1
$modules.Name | Should -BeExactly "Foo"
$modules.Version | Should -BeExactly "2.0"
$modules.Name | Should -BeExactly $ExpectedName
$modules.Version | Should -BeExactly $ModuleVersion
}
It "Get-Module -FullyQualifiedName @{ModuleName = '<Name>' ; ModuleVersion = '<ModuleVersion>'} - <TestCaseName>" -TestCases $loadedModuleNameTestCases {
param(
[Parameter(Mandatory = $true)]
$Name,
$TestCaseName,
[Parameter(Mandatory = $true)]
$ExpectedName,
$ModuleVersion
)
$moduleSpecification = @{ModuleName = $name ; ModuleVersion = $ModuleVersion}
$modules = Get-Module -FullyQualifiedName $moduleSpecification
$modules | Should -HaveCount 1
$modules.Name | Should -BeExactly $ExpectedName
$modules.Version | Should -BeExactly $ModuleVersion
}
It "Get-Module <Name> -Refresh -ListAvailable" {
@@ -219,7 +274,7 @@ Describe "Get-Module -ListAvailable" -Tags "CI" {
It "'Get-Module -ListAvailable' should not load the module assembly" {
## $fullName should be null and thus the result should just be the module's name.
$result = pwsh -c "`$env:PSModulePath = '$tempModulePath'; `$module = Get-Module -ListAvailable; `$fullName = [System.AppDomain]::CurrentDomain.GetAssemblies() | Where-Object Location -eq $assemblyPath | Foreach-Object FullName; `$module.Name + `$fullName"
$result = pwsh -noprofile -c "`$env:PSModulePath = '$tempModulePath'; `$module = Get-Module -ListAvailable; `$fullName = [System.AppDomain]::CurrentDomain.GetAssemblies() | Where-Object Location -eq $assemblyPath | Foreach-Object FullName; `$module.Name + `$fullName"
$result | Should -BeExactly "MyModuelTest"
}
}