From a7d85e80ef31a80909eb3b6110eddb4bd7379207 Mon Sep 17 00:00:00 2001 From: anamnavi Date: Fri, 6 Feb 2026 13:20:49 -0500 Subject: [PATCH 1/2] For packages that depend on a specific version, search for them with NormalizedVersion --- src/code/FindHelper.cs | 2 +- .../InstallPSResourceV2Server.Tests.ps1 | 15 +++++++++++++++ 2 files changed, 16 insertions(+), 1 deletion(-) 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/test/InstallPSResourceTests/InstallPSResourceV2Server.Tests.ps1 b/test/InstallPSResourceTests/InstallPSResourceV2Server.Tests.ps1 index 852f5d3a3..01a3b3d4e 100644 --- a/test/InstallPSResourceTests/InstallPSResourceV2Server.Tests.ps1 +++ b/test/InstallPSResourceTests/InstallPSResourceV2Server.Tests.ps1 @@ -631,6 +631,21 @@ 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" + + $res = Install-PSResource -Name $moduleName -Prerelease -Repository $PSGalleryName -TrustRepository -PassThru + $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' { From 34da8857e81f2e91a114e340f9bd32e76fa4c5bc Mon Sep 17 00:00:00 2001 From: anamnavi Date: Fri, 6 Feb 2026 14:31:35 -0500 Subject: [PATCH 2/2] Ensure version used in V2ServerApiCalls.FindVerion is a NormalizedVersion and fix test --- src/code/V2ServerAPICalls.cs | 14 +++++++++++++- .../InstallPSResourceV2Server.Tests.ps1 | 5 +++-- 2 files changed, 16 insertions(+), 3 deletions(-) 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 01a3b3d4e..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 { @@ -638,7 +638,8 @@ Describe 'Test Install-PSResource for V2 Server scenarios' -tags 'CI' { $depPkgName1 = "PowerShellGet" $depPkgName2 = "PackageManagement" - $res = Install-PSResource -Name $moduleName -Prerelease -Repository $PSGalleryName -TrustRepository -PassThru + Install-PSResource -Name $moduleName -Prerelease -Repository $PSGalleryName -TrustRepository + $res = Get-InstalledPSResource $moduleName $res.Name | Should -Be $moduleName $res.Version | Should -Be $version