dependabot-nuget 0.291.0 → 0.292.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (51) hide show
  1. checksums.yaml +4 -4
  2. data/helpers/lib/NuGetUpdater/.editorconfig +1 -0
  3. data/helpers/lib/NuGetUpdater/Directory.Build.props +1 -0
  4. data/helpers/lib/NuGetUpdater/Directory.Packages.props +1 -1
  5. data/helpers/lib/NuGetUpdater/NuGetUpdater.Cli/Commands/AnalyzeCommand.cs +1 -1
  6. data/helpers/lib/NuGetUpdater/NuGetUpdater.Cli/Commands/CloneCommand.cs +1 -1
  7. data/helpers/lib/NuGetUpdater/NuGetUpdater.Cli/Commands/DiscoverCommand.cs +15 -1
  8. data/helpers/lib/NuGetUpdater/NuGetUpdater.Cli/Commands/RunCommand.cs +2 -2
  9. data/helpers/lib/NuGetUpdater/NuGetUpdater.Cli/Commands/UpdateCommand.cs +1 -1
  10. data/helpers/lib/NuGetUpdater/NuGetUpdater.Cli.Test/EntryPointTests.Analyze.cs +2 -1
  11. data/helpers/lib/NuGetUpdater/NuGetUpdater.Cli.Test/EntryPointTests.Discover.cs +87 -3
  12. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Analyze/AnalyzeWorker.cs +11 -0
  13. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Analyze/RequirementConverter.cs +19 -1
  14. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/BadRequirementException.cs +9 -0
  15. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Clone/CloneWorker.cs +39 -8
  16. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Discover/DiscoveryWorker.cs +67 -12
  17. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/ErrorType.cs +1 -0
  18. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/ExperimentsManager.cs +28 -5
  19. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/NuGetUpdater.Core.csproj +1 -0
  20. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Run/ApiModel/BadRequirement.cs +10 -0
  21. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Run/ApiModel/CommitOptions.cs +1 -1
  22. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Run/ApiModel/DependencyFileNotFound.cs +3 -2
  23. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Run/ApiModel/JobErrorBase.cs +1 -2
  24. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Run/ApiModel/JobRepoNotFound.cs +1 -4
  25. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Run/ApiModel/PrivateSourceAuthenticationFailure.cs +1 -1
  26. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Run/ApiModel/UnknownError.cs +6 -2
  27. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Run/ApiModel/UpdateNotPossible.cs +1 -1
  28. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Run/RunWorker.cs +9 -3
  29. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Updater/LockFileUpdater.cs +1 -1
  30. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Updater/WebApplicationTargetsConditionPatcher.cs +12 -1
  31. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Utilities/DependencyConflictResolver.cs +0 -7
  32. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Utilities/MSBuildHelper.cs +8 -3
  33. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Utilities/ProjectHelper.cs +4 -4
  34. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Clone/CloneWorkerTests.cs +60 -2
  35. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Discover/DiscoveryWorkerTestBase.cs +10 -1
  36. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Discover/DiscoveryWorkerTests.PackagesConfig.cs +56 -0
  37. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Discover/ExpectedDiscoveryResults.cs +1 -0
  38. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Run/RunWorkerTests.cs +1 -1
  39. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Run/SerializationTests.cs +76 -40
  40. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Update/UpdateWorkerTestBase.cs +20 -2
  41. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Update/UpdateWorkerTests.GlobalJson.cs +2 -2
  42. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Update/UpdateWorkerTests.LockFile.cs +251 -0
  43. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Update/UpdateWorkerTests.PackageReference.cs +6 -6
  44. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Update/UpdateWorkerTests.PackagesConfig.cs +63 -5
  45. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Utilities/MSBuildHelperTests.cs +38 -20
  46. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Utilities/ProjectHelperTests.cs +65 -0
  47. data/helpers/lib/NuGetUpdater/global.json +1 -1
  48. data/lib/dependabot/nuget/language.rb +21 -5
  49. data/lib/dependabot/nuget/native_helpers.rb +2 -0
  50. data/lib/dependabot/nuget/package_manager.rb +4 -4
  51. metadata +10 -6
@@ -0,0 +1,251 @@
1
+ using Xunit;
2
+
3
+ namespace NuGetUpdater.Core.Test.Update;
4
+
5
+ public partial class UpdateWorkerTests
6
+ {
7
+ public class LockFile : UpdateWorkerTestBase
8
+ {
9
+ [Fact]
10
+ public async Task UpdateSingleDependency()
11
+ {
12
+ await TestUpdateForProject("Some.Package", "1.0.0", "2.0.0",
13
+ packages:
14
+ [
15
+ MockNuGetPackage.CreateSimplePackage("Some.Package", "1.0.0", "net8.0"),
16
+ MockNuGetPackage.CreateSimplePackage("Some.Package", "2.0.0", "net8.0"),
17
+ ],
18
+ // initial
19
+ projectContents: $"""
20
+ <Project Sdk="Microsoft.NET.Sdk">
21
+ <PropertyGroup>
22
+ <TargetFramework>net8.0</TargetFramework>
23
+ <RestorePackagesWithLockFile>true</RestorePackagesWithLockFile>
24
+ </PropertyGroup>
25
+
26
+ <ItemGroup>
27
+ <PackageReference Include="Some.Package" Version="1.0.0" />
28
+ </ItemGroup>
29
+ </Project>
30
+ """,
31
+ additionalFiles:
32
+ [
33
+ ("packages.lock.json", "{}")
34
+ ],
35
+ // expected
36
+ expectedProjectContents: $"""
37
+ <Project Sdk="Microsoft.NET.Sdk">
38
+ <PropertyGroup>
39
+ <TargetFramework>net8.0</TargetFramework>
40
+ <RestorePackagesWithLockFile>true</RestorePackagesWithLockFile>
41
+ </PropertyGroup>
42
+
43
+ <ItemGroup>
44
+ <PackageReference Include="Some.Package" Version="2.0.0" />
45
+ </ItemGroup>
46
+ </Project>
47
+ """,
48
+ additionalChecks: path =>
49
+ {
50
+ var lockContents = File.ReadAllText(Path.Combine(path, "packages.lock.json"));
51
+ Assert.Contains("\"resolved\": \"2.0.0\"", lockContents);
52
+ }
53
+ );
54
+ }
55
+
56
+ [Fact]
57
+ public async Task UpdateSingleDependency_CentralPackageManagement()
58
+ {
59
+ await TestUpdateForProject("Some.Package", "1.0.0", "2.0.0",
60
+ packages:
61
+ [
62
+ MockNuGetPackage.CreateSimplePackage("Some.Package", "1.0.0", "net8.0"),
63
+ MockNuGetPackage.CreateSimplePackage("Some.Package", "2.0.0", "net8.0"),
64
+ ],
65
+ // initial
66
+ projectContents: $"""
67
+ <Project Sdk="Microsoft.NET.Sdk">
68
+ <PropertyGroup>
69
+ <TargetFramework>net8.0</TargetFramework>
70
+ <RestorePackagesWithLockFile>true</RestorePackagesWithLockFile>
71
+ </PropertyGroup>
72
+
73
+ <ItemGroup>
74
+ <PackageReference Include="Some.Package" />
75
+ </ItemGroup>
76
+ </Project>
77
+ """,
78
+ additionalFiles:
79
+ [
80
+ ("packages.lock.json", "{}"),
81
+ ("Directory.Packages.props", """
82
+ <Project>
83
+ <PropertyGroup>
84
+ <ManagePackageVersionsCentrally>true</ManagePackageVersionsCentrally>
85
+ </PropertyGroup>
86
+
87
+ <ItemGroup>
88
+ <PackageVersion Include="Some.Package" Version="1.0.0" />
89
+ </ItemGroup>
90
+ </Project>
91
+ """)
92
+ ],
93
+ // expected
94
+ expectedProjectContents: $"""
95
+ <Project Sdk="Microsoft.NET.Sdk">
96
+ <PropertyGroup>
97
+ <TargetFramework>net8.0</TargetFramework>
98
+ <RestorePackagesWithLockFile>true</RestorePackagesWithLockFile>
99
+ </PropertyGroup>
100
+
101
+ <ItemGroup>
102
+ <PackageReference Include="Some.Package" />
103
+ </ItemGroup>
104
+ </Project>
105
+ """,
106
+ additionalFilesExpected:
107
+ [
108
+ ("Directory.Packages.props", """
109
+ <Project>
110
+ <PropertyGroup>
111
+ <ManagePackageVersionsCentrally>true</ManagePackageVersionsCentrally>
112
+ </PropertyGroup>
113
+
114
+ <ItemGroup>
115
+ <PackageVersion Include="Some.Package" Version="2.0.0" />
116
+ </ItemGroup>
117
+ </Project>
118
+ """)
119
+ ],
120
+ additionalChecks: path =>
121
+ {
122
+ var lockContents = File.ReadAllText(Path.Combine(path, "packages.lock.json"));
123
+ Assert.Contains("\"resolved\": \"2.0.0\"", lockContents);
124
+ }
125
+ );
126
+ }
127
+
128
+ [Fact]
129
+ public async Task UpdateSingleDependency_WindowsSpecific()
130
+ {
131
+ await TestUpdateForProject("Some.Package", "1.0.0", "2.0.0",
132
+ packages:
133
+ [
134
+ MockNuGetPackage.CreateSimplePackage("Some.Package", "1.0.0", "net8.0"),
135
+ MockNuGetPackage.CreateSimplePackage("Some.Package", "2.0.0", "net8.0"),
136
+ ],
137
+ // initial
138
+ projectContents: $"""
139
+ <Project Sdk="Microsoft.NET.Sdk">
140
+ <PropertyGroup>
141
+ <TargetFramework>net8.0-windows</TargetFramework>
142
+ <UseWindowsForms>true</UseWindowsForms>
143
+ <RestorePackagesWithLockFile>true</RestorePackagesWithLockFile>
144
+ </PropertyGroup>
145
+
146
+ <ItemGroup>
147
+ <PackageReference Include="Some.Package" Version="1.0.0" />
148
+ </ItemGroup>
149
+ </Project>
150
+ """,
151
+ additionalFiles:
152
+ [
153
+ ("packages.lock.json", "{}")
154
+ ],
155
+ // expected
156
+ expectedProjectContents: $"""
157
+ <Project Sdk="Microsoft.NET.Sdk">
158
+ <PropertyGroup>
159
+ <TargetFramework>net8.0-windows</TargetFramework>
160
+ <UseWindowsForms>true</UseWindowsForms>
161
+ <RestorePackagesWithLockFile>true</RestorePackagesWithLockFile>
162
+ </PropertyGroup>
163
+
164
+ <ItemGroup>
165
+ <PackageReference Include="Some.Package" Version="2.0.0" />
166
+ </ItemGroup>
167
+ </Project>
168
+ """,
169
+ additionalChecks: path =>
170
+ {
171
+ var lockContents = File.ReadAllText(Path.Combine(path, "packages.lock.json"));
172
+ Assert.Contains("\"resolved\": \"2.0.0\"", lockContents);
173
+ }
174
+ );
175
+ }
176
+
177
+ [Fact]
178
+ public async Task UpdateSingleDependency_CentralPackageManagement_WindowsSpecific()
179
+ {
180
+ await TestUpdateForProject("Some.Package", "1.0.0", "2.0.0",
181
+ packages:
182
+ [
183
+ MockNuGetPackage.CreateSimplePackage("Some.Package", "1.0.0", "net8.0"),
184
+ MockNuGetPackage.CreateSimplePackage("Some.Package", "2.0.0", "net8.0"),
185
+ ],
186
+ // initial
187
+ projectContents: $"""
188
+ <Project Sdk="Microsoft.NET.Sdk">
189
+ <PropertyGroup>
190
+ <TargetFramework>net8.0-windows</TargetFramework>
191
+ <UseWindowsForms>true</UseWindowsForms>
192
+ <RestorePackagesWithLockFile>true</RestorePackagesWithLockFile>
193
+ </PropertyGroup>
194
+
195
+ <ItemGroup>
196
+ <PackageReference Include="Some.Package" />
197
+ </ItemGroup>
198
+ </Project>
199
+ """,
200
+ additionalFiles:
201
+ [
202
+ ("packages.lock.json", "{}"),
203
+ ("Directory.Packages.props", """
204
+ <Project>
205
+ <PropertyGroup>
206
+ <ManagePackageVersionsCentrally>true</ManagePackageVersionsCentrally>
207
+ </PropertyGroup>
208
+
209
+ <ItemGroup>
210
+ <PackageVersion Include="Some.Package" Version="1.0.0" />
211
+ </ItemGroup>
212
+ </Project>
213
+ """)
214
+ ],
215
+ // expected
216
+ expectedProjectContents: $"""
217
+ <Project Sdk="Microsoft.NET.Sdk">
218
+ <PropertyGroup>
219
+ <TargetFramework>net8.0-windows</TargetFramework>
220
+ <UseWindowsForms>true</UseWindowsForms>
221
+ <RestorePackagesWithLockFile>true</RestorePackagesWithLockFile>
222
+ </PropertyGroup>
223
+
224
+ <ItemGroup>
225
+ <PackageReference Include="Some.Package" />
226
+ </ItemGroup>
227
+ </Project>
228
+ """,
229
+ additionalFilesExpected:
230
+ [
231
+ ("Directory.Packages.props", """
232
+ <Project>
233
+ <PropertyGroup>
234
+ <ManagePackageVersionsCentrally>true</ManagePackageVersionsCentrally>
235
+ </PropertyGroup>
236
+
237
+ <ItemGroup>
238
+ <PackageVersion Include="Some.Package" Version="2.0.0" />
239
+ </ItemGroup>
240
+ </Project>
241
+ """)
242
+ ],
243
+ additionalChecks: path =>
244
+ {
245
+ var lockContents = File.ReadAllText(Path.Combine(path, "packages.lock.json"));
246
+ Assert.Contains("\"resolved\": \"2.0.0\"", lockContents);
247
+ }
248
+ );
249
+ }
250
+ }
251
+ }
@@ -495,7 +495,7 @@ public partial class UpdateWorkerTests
495
495
  MockNuGetPackage.CreateSimplePackage("Some.Package", "13.0.1", "net8.0"),
496
496
  ],
497
497
  projectContents: $"""
498
- <Project Sdk="Microsoft.NET.Sdk">">
498
+ <Project Sdk="Microsoft.NET.Sdk">
499
499
  <PropertyGroup>
500
500
  <TargetFramework>net8.0</TargetFramework>
501
501
  <SomePackageVersion>9.0.1</SomePackageVersion>
@@ -3075,14 +3075,14 @@ public partial class UpdateWorkerTests
3075
3075
  public async Task UpdatingTransitiveDependencyWithNewSolverCanUpdateJustTheTopLevelPackage()
3076
3076
  {
3077
3077
  // we've been asked to explicitly update a transitive dependency, but we can solve it by updating the top-level package instead
3078
- await TestUpdateForProject("Transitive.Package", "1.0.0", "2.0.0",
3078
+ await TestUpdateForProject("Transitive.Package", "7.0.0", "8.0.0",
3079
3079
  isTransitive: true,
3080
3080
  packages:
3081
3081
  [
3082
- MockNuGetPackage.CreateSimplePackage("Some.Package", "1.0.0", "net8.0", [("net8.0", [("Transitive.Package", "[1.0.0]")])]),
3083
- MockNuGetPackage.CreateSimplePackage("Some.Package", "2.0.0", "net8.0", [("net8.0", [("Transitive.Package", "[2.0.0]")])]),
3084
- MockNuGetPackage.CreateSimplePackage("Transitive.Package", "1.0.0", "net8.0"),
3085
- MockNuGetPackage.CreateSimplePackage("Transitive.Package", "2.0.0", "net8.0"),
3082
+ MockNuGetPackage.CreateSimplePackage("Some.Package", "1.0.0", "net8.0", [("net8.0", [("Transitive.Package", "[7.0.0]")])]),
3083
+ MockNuGetPackage.CreateSimplePackage("Some.Package", "2.0.0", "net8.0", [("net8.0", [("Transitive.Package", "[8.0.0]")])]),
3084
+ MockNuGetPackage.CreateSimplePackage("Transitive.Package", "7.0.0", "net8.0"),
3085
+ MockNuGetPackage.CreateSimplePackage("Transitive.Package", "8.0.0", "net8.0"),
3086
3086
  ],
3087
3087
  projectContents: """
3088
3088
  <Project Sdk="Microsoft.NET.Sdk">
@@ -1969,7 +1969,7 @@ public partial class UpdateWorkerTests
1969
1969
  <VSToolsPath Condition="'$(VSToolsPath)' == ''">C:\some\path\that\does\not\exist</VSToolsPath>
1970
1970
  </PropertyGroup>
1971
1971
  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
1972
- <Import Project="$(VSToolsPath)\WebApplications\Microsoft.WebApplication.targets" Condition="'$(VSToolsPath)' != ''" />
1972
+ <Import Project="$(VSToolsPath)\SomeSubPath\Microsoft.WebApplication.targets" Condition="'$(VSToolsPath)' != ''" />
1973
1973
  <!-- To modify your build process, add your task inside one of the targets below and uncomment it.
1974
1974
  Other similar extension points exist, see Microsoft.Common.targets.
1975
1975
  <Target Name="BeforeBuild">
@@ -2050,7 +2050,7 @@ public partial class UpdateWorkerTests
2050
2050
  <VSToolsPath Condition="'$(VSToolsPath)' == ''">C:\some\path\that\does\not\exist</VSToolsPath>
2051
2051
  </PropertyGroup>
2052
2052
  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
2053
- <Import Project="$(VSToolsPath)\WebApplications\Microsoft.WebApplication.targets" Condition="'$(VSToolsPath)' != ''" />
2053
+ <Import Project="$(VSToolsPath)\SomeSubPath\Microsoft.WebApplication.targets" Condition="'$(VSToolsPath)' != ''" />
2054
2054
  <!-- To modify your build process, add your task inside one of the targets below and uncomment it.
2055
2055
  Other similar extension points exist, see Microsoft.Common.targets.
2056
2056
  <Target Name="BeforeBuild">
@@ -2292,15 +2292,73 @@ public partial class UpdateWorkerTests
2292
2292
  }
2293
2293
 
2294
2294
  [Fact]
2295
- public async Task ReportsPrivateSourceAuthenticationFailure()
2295
+ public async Task MissingVisualStudioComponentTargetsAreReportedAsMissingFiles()
2296
2296
  {
2297
- static (int, string) TestHttpHandler(string uriString)
2297
+ using var temporaryDirectory = await TemporaryDirectory.CreateWithContentsAsync(
2298
+ [
2299
+ ("project.csproj", """
2300
+ <Project ToolsVersion="15.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
2301
+ <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
2302
+ <Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\Some.Visual.Studio.Component.props" />
2303
+ <PropertyGroup>
2304
+ <TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
2305
+ </PropertyGroup>
2306
+ <ItemGroup>
2307
+ <None Include="packages.config" />
2308
+ </ItemGroup>
2309
+ <ItemGroup>
2310
+ <Reference Include="Some.Package, Version=1.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed">
2311
+ <HintPath>packages\Some.Package.1.0.0\lib\net45\Some.Package.dll</HintPath>
2312
+ <Private>True</Private>
2313
+ </Reference>
2314
+ </ItemGroup>
2315
+ <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
2316
+ </Project>
2317
+ """),
2318
+ ("packages.config", """
2319
+ <packages>
2320
+ <package id="Some.Package" version="1.0.0" targetFramework="net45" />
2321
+ </packages>
2322
+ """),
2323
+ ("NuGet.Config", """
2324
+ <configuration>
2325
+ <packageSources>
2326
+ <clear />
2327
+ <add key="private_feed" value="packages" />
2328
+ </packageSources>
2329
+ </configuration>
2330
+ """)
2331
+ ]
2332
+ );
2333
+ MockNuGetPackage[] packages =
2334
+ [
2335
+ MockNuGetPackage.CreateSimplePackage("Some.Package", "1.0.0", "net45"),
2336
+ MockNuGetPackage.CreateSimplePackage("Some.Package", "1.1.0", "net45"),
2337
+ ];
2338
+ await MockNuGetPackagesInDirectory(packages, Path.Combine(temporaryDirectory.DirectoryPath, "packages"));
2339
+ var resultOutputPath = Path.Combine(temporaryDirectory.DirectoryPath, "result.json");
2340
+
2341
+ var worker = new UpdaterWorker(new ExperimentsManager(), new TestLogger());
2342
+ await worker.RunAsync(temporaryDirectory.DirectoryPath, "project.csproj", "Some.Package", "1.0.0", "1.1.0", isTransitive: false, resultOutputPath: resultOutputPath);
2343
+
2344
+ var resultContents = await File.ReadAllTextAsync(resultOutputPath);
2345
+ var result = JsonSerializer.Deserialize<UpdateOperationResult>(resultContents, UpdaterWorker.SerializerOptions)!;
2346
+ Assert.Equal(ErrorType.MissingFile, result.ErrorType);
2347
+ Assert.Equal("$(MSBuildExtensionsPath32)/Microsoft/VisualStudio/v$(VisualStudioVersion)/Some.Visual.Studio.Component.props", result.ErrorDetails!.ToString().NormalizePathToUnix());
2348
+ }
2349
+
2350
+ [Theory]
2351
+ [InlineData(401)]
2352
+ [InlineData(403)]
2353
+ public async Task ReportsPrivateSourceAuthenticationFailure(int httpStatusCode)
2354
+ {
2355
+ (int, string) TestHttpHandler(string uriString)
2298
2356
  {
2299
2357
  var uri = new Uri(uriString, UriKind.Absolute);
2300
2358
  var baseUrl = $"{uri.Scheme}://{uri.Host}:{uri.Port}";
2301
2359
  return uri.PathAndQuery switch
2302
2360
  {
2303
- _ => (401, "{}"), // everything is unauthorized
2361
+ _ => (httpStatusCode, "{}"), // everything is unauthorized
2304
2362
  };
2305
2363
  }
2306
2364
  using var http = TestHttpServer.CreateTestStringServer(TestHttpHandler);
@@ -854,30 +854,45 @@ public class MSBuildHelperTests : TestBase
854
854
 
855
855
  // Two top level packages (Buildalyzer), (Microsoft.CodeAnalysis.CSharp.Scripting) that share a dependency (Microsoft.CodeAnalysis.Csharp)
856
856
  // Updating ONE of the top level packages, which updates the dependencies and their other "parents"
857
- // First family: Buildalyzer 7.0.1 requires Microsoft.CodeAnalysis.CSharp to be >= 4.0.0 and Microsoft.CodeAnalysis.Common to be 4.0.0 (@ 6.0.4, Microsoft.CodeAnalysis.Common isn't a dependency of buildalyzer)
858
- // Second family: Microsoft.CodeAnalysis.CSharp.Scripting 4.0.0 requires Microsoft.CodeAnalysis.CSharp 4.0.0 and Microsoft.CodeAnalysis.Common to be 4.0.0 (Specific version)
857
+ // First family: Buildalyzer 7.0.1 requires Microsoft.CodeAnalysis.CSharp to be = 4.0.1 and Microsoft.CodeAnalysis.Common to be 4.0.1 (@ 6.0.4, Microsoft.CodeAnalysis.Common isn't a dependency of buildalyzer)
858
+ // Second family: Microsoft.CodeAnalysis.CSharp.Scripting 4.0.1 requires Microsoft.CodeAnalysis.CSharp 4.0.1 and Microsoft.CodeAnalysis.Common to be 4.0.1 (Specific version)
859
859
  // Updating Buildalyzer to 7.0.1 will update its transitive dependency (Microsoft.CodeAnalysis.Common) and then its transitive dependency's "family"
860
- [Theory]
861
- [InlineData(true)]
862
- [InlineData(false)]
863
- public async Task DependencyConflictsCanBeResolvedNewSharingDependency(bool useExistingSdks)
860
+ [Fact]
861
+ public async Task DependencyConflictsCanBeResolvedNewSharingDependency()
864
862
  {
863
+ // arrange
865
864
  using var tempDirectory = new TemporaryDirectory();
866
865
  var projectPath = Path.Join(tempDirectory.DirectoryPath, "project.csproj");
867
866
  await File.WriteAllTextAsync(projectPath, """
868
867
  <Project Sdk="Microsoft.NET.Sdk">
869
- <PropertyGroup>
868
+ <PropertyGroup>
870
869
  <TargetFramework>net8.0</TargetFramework>
871
- </PropertyGroup>
872
- <ItemGroup>
870
+ </PropertyGroup>
871
+ <ItemGroup>
873
872
  <PackageReference Include="Buildalyzer" Version="6.0.4" />
874
873
  <PackageReference Include="Microsoft.CodeAnalysis.Csharp.Scripting" Version="3.10.0" />
875
874
  <PackageReference Include="Microsoft.CodeAnalysis.CSharp" Version="3.10.0" />
876
875
  <PackageReference Include="Microsoft.CodeAnalysis.Common" Version="3.10.0" />
877
- </ItemGroup>
876
+ </ItemGroup>
878
877
  </Project>
879
878
  """);
880
879
 
880
+ var testPackages = new MockNuGetPackage[]
881
+ {
882
+ MockNuGetPackage.CreateSimplePackage("Buildalyzer", "6.0.4", "net8.0", [(null, [("Microsoft.CodeAnalysis.CSharp", "[3.10.0]")])]),
883
+ MockNuGetPackage.CreateSimplePackage("Buildalyzer", "7.0.1", "net8.0", [(null, [("Microsoft.CodeAnalysis.CSharp", "[4.0.1]")])]),
884
+
885
+ MockNuGetPackage.CreateSimplePackage("Microsoft.CodeAnalysis.CSharp.Scripting", "3.10.0", "net8.0", [(null, [("Microsoft.CodeAnalysis.CSharp", "[3.10.0]")])]),
886
+ MockNuGetPackage.CreateSimplePackage("Microsoft.CodeAnalysis.CSharp.Scripting", "4.0.1", "net8.0", [(null, [("Microsoft.CodeAnalysis.CSharp", "[4.0.1]")])]),
887
+
888
+ MockNuGetPackage.CreateSimplePackage("Microsoft.CodeAnalysis.CSharp", "3.10.0", "net8.0", [(null, [("Microsoft.CodeAnalysis.Common", "[3.10.0]")])]),
889
+ MockNuGetPackage.CreateSimplePackage("Microsoft.CodeAnalysis.CSharp", "4.0.1", "net8.0", [(null, [("Microsoft.CodeAnalysis.Common", "[4.0.1]")])]),
890
+
891
+ MockNuGetPackage.CreateSimplePackage("Microsoft.CodeAnalysis.Common", "3.10.0", "net8.0"),
892
+ MockNuGetPackage.CreateSimplePackage("Microsoft.CodeAnalysis.Common", "4.0.1", "net8.0"),
893
+ };
894
+ await UpdateWorkerTestBase.MockNuGetPackagesInDirectory(testPackages, tempDirectory.DirectoryPath);
895
+
881
896
  var dependencies = new[]
882
897
  {
883
898
  new Dependency("Buildalyzer", "6.0.4", DependencyType.PackageReference),
@@ -890,25 +905,28 @@ public class MSBuildHelperTests : TestBase
890
905
  new Dependency("Buildalyzer", "7.0.1", DependencyType.PackageReference),
891
906
  };
892
907
 
908
+ // act
893
909
  var resolvedDependencies = await MSBuildHelper.ResolveDependencyConflicts(
894
910
  tempDirectory.DirectoryPath,
895
911
  projectPath,
896
912
  "net8.0",
897
913
  dependencies,
898
914
  update,
899
- new ExperimentsManager() { InstallDotnetSdks = useExistingSdks },
915
+ new ExperimentsManager(),
900
916
  new TestLogger()
901
917
  );
918
+
919
+ // assert
920
+ var expectedDependencies = new[]
921
+ {
922
+ "Buildalyzer/7.0.1",
923
+ "Microsoft.CodeAnalysis.CSharp.Scripting/4.0.1",
924
+ "Microsoft.CodeAnalysis.CSharp/4.0.1",
925
+ "Microsoft.CodeAnalysis.Common/4.0.1"
926
+ };
902
927
  Assert.NotNull(resolvedDependencies);
903
- Assert.Equal(4, resolvedDependencies.Length);
904
- Assert.Equal("Buildalyzer", resolvedDependencies[0].Name);
905
- Assert.Equal("7.0.1", resolvedDependencies[0].Version);
906
- Assert.Equal("Microsoft.CodeAnalysis.CSharp.Scripting", resolvedDependencies[1].Name);
907
- Assert.Equal("4.0.0", resolvedDependencies[1].Version);
908
- Assert.Equal("Microsoft.CodeAnalysis.CSharp", resolvedDependencies[2].Name);
909
- Assert.Equal("4.0.0", resolvedDependencies[2].Version);
910
- Assert.Equal("Microsoft.CodeAnalysis.Common", resolvedDependencies[3].Name);
911
- Assert.Equal("4.0.0", resolvedDependencies[3].Version);
928
+ var actualDependencies = resolvedDependencies.Select(d => $"{d.Name}/{d.Version}").ToArray();
929
+ AssertEx.Equal(expectedDependencies, actualDependencies);
912
930
  }
913
931
 
914
932
  // Updating two families at once to test efficiency
@@ -0,0 +1,65 @@
1
+ using NuGetUpdater.Core.Utilities;
2
+
3
+ using Xunit;
4
+
5
+ namespace NuGetUpdater.Core.Test.Utilities;
6
+
7
+ public class ProjectHelperTests : TestBase
8
+ {
9
+ [Theory]
10
+ [MemberData(nameof(AdditionalFile))]
11
+ public async Task GetAdditionalFilesFromProject(string projectPath, (string Name, string Content)[] files, string[] expectedAdditionalFiles)
12
+ {
13
+ using var tempDirectory = await TemporaryDirectory.CreateWithContentsAsync(files);
14
+ var fullProjectPath = Path.Join(tempDirectory.DirectoryPath, projectPath);
15
+
16
+ var actualAdditionalFiles = ProjectHelper.GetAllAdditionalFilesFromProject(fullProjectPath, ProjectHelper.PathFormat.Relative);
17
+ AssertEx.Equal(expectedAdditionalFiles, actualAdditionalFiles);
18
+ }
19
+
20
+ public static IEnumerable<object[]> AdditionalFile()
21
+ {
22
+ // no additional files
23
+ yield return
24
+ [
25
+ // project path
26
+ "src/project.csproj",
27
+ // files
28
+ new[]
29
+ {
30
+ ("src/project.csproj", """
31
+ <Project>
32
+ </Project>
33
+ """)
34
+ },
35
+ // expected additional files
36
+ Array.Empty<string>()
37
+ ];
38
+
39
+ // files with relative paths
40
+ yield return
41
+ [
42
+ // project path
43
+ "src/project.csproj",
44
+ // files
45
+ new[]
46
+ {
47
+ ("src/project.csproj", """
48
+ <Project>
49
+ <ItemGroup>
50
+ <None Include="..\unexpected-path\packages.config" />
51
+ </ItemGroup>
52
+ </Project>
53
+ """),
54
+ ("unexpected-path/packages.config", """
55
+ <packages></packages>
56
+ """)
57
+ },
58
+ // expected additional files
59
+ new[]
60
+ {
61
+ "../unexpected-path/packages.config"
62
+ }
63
+ ];
64
+ }
65
+ }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "sdk": {
3
- "version": "9.0.100",
3
+ "version": "9.0.101",
4
4
  "rollForward": "latestMinor"
5
5
  }
6
6
  }
@@ -12,7 +12,11 @@ module Dependabot
12
12
 
13
13
  sig { params(language: String, raw_version: String, requirement: T.nilable(Requirement)).void }
14
14
  def initialize(language, raw_version, requirement = nil)
15
- super(language, Version.new(raw_version), [], [], requirement)
15
+ super(
16
+ name: language,
17
+ version: Version.new(raw_version),
18
+ requirement: requirement,
19
+ )
16
20
  end
17
21
  end
18
22
 
@@ -28,7 +32,10 @@ module Dependabot
28
32
 
29
33
  sig { params(language: String, requirement: T.nilable(Requirement)).void }
30
34
  def initialize(language, requirement = nil)
31
- super(language, Version.new(nil), [], [], requirement)
35
+ super(
36
+ name: language,
37
+ requirement: requirement,
38
+ )
32
39
  end
33
40
  end
34
41
 
@@ -44,7 +51,10 @@ module Dependabot
44
51
 
45
52
  sig { params(language: String, requirement: T.nilable(Requirement)).void }
46
53
  def initialize(language, requirement = nil)
47
- super(language, Version.new(nil), [], [], requirement)
54
+ super(
55
+ name: language,
56
+ requirement: requirement,
57
+ )
48
58
  end
49
59
  end
50
60
 
@@ -60,7 +70,10 @@ module Dependabot
60
70
 
61
71
  sig { params(language: String, requirement: T.nilable(Requirement)).void }
62
72
  def initialize(language, requirement = nil)
63
- super(language, Version.new(nil), [], [], requirement)
73
+ super(
74
+ name: language,
75
+ requirement: requirement,
76
+ )
64
77
  end
65
78
  end
66
79
 
@@ -75,7 +88,10 @@ module Dependabot
75
88
 
76
89
  sig { params(language: String, requirement: T.nilable(Requirement)).void }
77
90
  def initialize(language, requirement = nil)
78
- super(language, Version.new(nil), [], [], requirement)
91
+ super(
92
+ name: language,
93
+ requirement: requirement,
94
+ )
79
95
  end
80
96
  end
81
97
  end
@@ -301,6 +301,8 @@ module Dependabot
301
301
  raise DependencyFileNotParseable, T.must(T.let(error_details, T.nilable(String)))
302
302
  when "AuthenticationFailure"
303
303
  raise PrivateSourceAuthenticationFailure, T.let(error_details, T.nilable(String))
304
+ when "BadRequirement"
305
+ raise BadRequirementError, T.let(error_details, T.nilable(String))
304
306
  when "MissingFile"
305
307
  raise DependencyFileNotFound, T.let(error_details, T.nilable(String))
306
308
  when "UpdateNotPossible"
@@ -30,10 +30,10 @@ module Dependabot
30
30
  end
31
31
  def initialize(raw_version)
32
32
  super(
33
- NAME,
34
- Version.new(raw_version),
35
- SUPPORTED_VERSIONS,
36
- DEPRECATED_VERSIONS
33
+ name: NAME,
34
+ version: Version.new(raw_version),
35
+ deprecated_versions: DEPRECATED_VERSIONS,
36
+ supported_versions: SUPPORTED_VERSIONS
37
37
  )
38
38
  end
39
39