dependabot-nuget 0.291.0 → 0.292.0

Sign up to get free protection for your applications and to get access to all the features.
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