diff --git a/src/code/FindHelper.cs b/src/code/FindHelper.cs index 024623503..388be9090 100644 --- a/src/code/FindHelper.cs +++ b/src/code/FindHelper.cs @@ -1174,7 +1174,7 @@ internal IEnumerable FindDependencyPackages( else if(dep.VersionRange.MaxVersion != null && dep.VersionRange.MinVersion != null && dep.VersionRange.MaxVersion.OriginalVersion.Equals(dep.VersionRange.MinVersion.OriginalVersion)) { string depPkgVersion = dep.VersionRange.MaxVersion.OriginalVersion; - FindResults responses = currentServer.FindVersion(dep.Name, version: dep.VersionRange.MaxVersion.OriginalVersion, _type, out ErrorRecord errRecord); + FindResults responses = currentServer.FindVersion(dep.Name, version: dep.VersionRange.MaxVersion.ToNormalizedString(), _type, out ErrorRecord errRecord); if (errRecord != null) { if (errRecord.Exception is ResourceNotFoundException) diff --git a/src/code/V2ServerAPICalls.cs b/src/code/V2ServerAPICalls.cs index 94d0b3a0b..ec3551f79 100644 --- a/src/code/V2ServerAPICalls.cs +++ b/src/code/V2ServerAPICalls.cs @@ -638,6 +638,17 @@ public override FindResults FindVersion(string packageName, string version, Reso // Quotations around package name and version do not matter, same metadata gets returned. // We need to explicitly add 'Id eq ' whenever $filter is used, otherwise arbitrary results are returned. + // version passed in must be a valid NuGet version + if (!NuGetVersion.TryParse(version, out NuGetVersion nugetVersion)) + { + errRecord = new ErrorRecord( + new ArgumentException($"Version '{version}' cannot be converted to a valid NuGet version."), + "InvalidVersionFormat", + ErrorCategory.InvalidArgument, + this); + return new FindResults(stringResponse: Utils.EmptyStrArray, hashtableResponse: emptyHashResponses, responseType: v2FindResponseType); + } + var queryBuilder = new NuGetV2QueryBuilder(new Dictionary{ { "$inlinecount", "allpages" }, { "id", $"'{packageName}'" }, @@ -650,7 +661,8 @@ public override FindResults FindVersion(string packageName, string version, Reso filterBuilder.AddCriterion($"Id eq '{packageName}'"); } - filterBuilder.AddCriterion($"NormalizedVersion eq '{version}'"); + // a NormalizedVersion is required for the query filter + filterBuilder.AddCriterion($"NormalizedVersion eq '{nugetVersion.ToNormalizedString()}'"); if (type != ResourceType.None) { filterBuilder.AddCriterion(GetTypeFilterForRequest(type)); } diff --git a/test/InstallPSResourceTests/InstallPSResourceV2Server.Tests.ps1 b/test/InstallPSResourceTests/InstallPSResourceV2Server.Tests.ps1 index 852f5d3a3..ee35c3396 100644 --- a/test/InstallPSResourceTests/InstallPSResourceV2Server.Tests.ps1 +++ b/test/InstallPSResourceTests/InstallPSResourceV2Server.Tests.ps1 @@ -32,7 +32,7 @@ Describe 'Test Install-PSResource for V2 Server scenarios' -tags 'CI' { AfterEach { Uninstall-PSResource "test_module", "test_module2", "test_script", "TestModule99", "testModuleWithlicense", ` "TestFindModule", "ClobberTestModule1", "ClobberTestModule2", "PackageManagement", "TestTestScript", ` - "TestModuleWithDependency", "TestModuleWithPrereleaseDep", "PrereleaseModule", "test-nugetversion-parent", "test-nugetversion" -SkipDependencyCheck -ErrorAction SilentlyContinue + "TestModuleWithDependency", "TestModuleWithPrereleaseDep", "PrereleaseModule", "test-nugetversion-parent", "test-nugetversion", "test-pkg-normalized-dependency" -SkipDependencyCheck -ErrorAction SilentlyContinue } AfterAll { @@ -631,6 +631,22 @@ Describe 'Test Install-PSResource for V2 Server scenarios' -tags 'CI' { $depRes.Name | Should -Be $depPkgName $depRes.Version | Should -Be $depPkgVer } + + It "Install resource that takes a dependency on package with specific version with differing normalized and semver versions" { + $moduleName = 'test-pkg-normalized-dependency' + $version = '3.9.2' + $depPkgName1 = "PowerShellGet" + $depPkgName2 = "PackageManagement" + + Install-PSResource -Name $moduleName -Prerelease -Repository $PSGalleryName -TrustRepository + $res = Get-InstalledPSResource $moduleName + $res.Name | Should -Be $moduleName + $res.Version | Should -Be $version + + $depRes = Get-InstalledPSResource $depPkgName1, $depPkgName2 + $depRes.Name | Should -Contain $depPkgName1 + $depRes.Name | Should -Contain $depPkgName2 + } } Describe 'Test Install-PSResource for V2 Server scenarios' -tags 'ManualValidationOnly' {