dependabot-nuget 0.240.0 → 0.242.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (89) hide show
  1. checksums.yaml +4 -4
  2. data/helpers/build +45 -0
  3. data/helpers/lib/NuGetUpdater/.editorconfig +364 -0
  4. data/helpers/lib/NuGetUpdater/.gitignore +5 -0
  5. data/helpers/lib/NuGetUpdater/Directory.Build.props +10 -0
  6. data/helpers/lib/NuGetUpdater/Directory.Common.props +16 -0
  7. data/helpers/lib/NuGetUpdater/NuGetProjects/Directory.Build.props +14 -0
  8. data/helpers/lib/NuGetUpdater/NuGetProjects/Directory.Build.targets +7 -0
  9. data/helpers/lib/NuGetUpdater/NuGetProjects/Directory.Packages.props +29 -0
  10. data/helpers/lib/NuGetUpdater/NuGetProjects/NuGet.Build.Tasks/NuGet.Build.Tasks.csproj +27 -0
  11. data/helpers/lib/NuGetUpdater/NuGetProjects/NuGet.CommandLine/AssemblyMetadataExtractor.cs +203 -0
  12. data/helpers/lib/NuGetUpdater/NuGetProjects/NuGet.CommandLine/NuGet.CommandLine.csproj +33 -0
  13. data/helpers/lib/NuGetUpdater/NuGetProjects/NuGet.Commands/NuGet.Commands.csproj +26 -0
  14. data/helpers/lib/NuGetUpdater/NuGetProjects/NuGet.Common/NuGet.Common.csproj +21 -0
  15. data/helpers/lib/NuGetUpdater/NuGetProjects/NuGet.Config +6 -0
  16. data/helpers/lib/NuGetUpdater/NuGetProjects/NuGet.Configuration/NuGet.Configuration.csproj +24 -0
  17. data/helpers/lib/NuGetUpdater/NuGetProjects/NuGet.Credentials/NuGet.Credentials.csproj +20 -0
  18. data/helpers/lib/NuGetUpdater/NuGetProjects/NuGet.DependencyResolver.Core/NuGet.DependencyResolver.Core.csproj +22 -0
  19. data/helpers/lib/NuGetUpdater/NuGetProjects/NuGet.Frameworks/NuGet.Frameworks.csproj +17 -0
  20. data/helpers/lib/NuGetUpdater/NuGetProjects/NuGet.LibraryModel/NuGet.LibraryModel.csproj +17 -0
  21. data/helpers/lib/NuGetUpdater/NuGetProjects/NuGet.PackageManagement/NuGet.PackageManagement.csproj +27 -0
  22. data/helpers/lib/NuGetUpdater/NuGetProjects/NuGet.Packaging/NuGet.Packaging.csproj +28 -0
  23. data/helpers/lib/NuGetUpdater/NuGetProjects/NuGet.ProjectModel/NuGet.ProjectModel.csproj +20 -0
  24. data/helpers/lib/NuGetUpdater/NuGetProjects/NuGet.Protocol/NuGet.Protocol.csproj +21 -0
  25. data/helpers/lib/NuGetUpdater/NuGetProjects/NuGet.Resolver/NuGet.Resolver.csproj +20 -0
  26. data/helpers/lib/NuGetUpdater/NuGetProjects/NuGet.Versioning/NuGet.Versioning.csproj +17 -0
  27. data/helpers/lib/NuGetUpdater/NuGetProjects/README.md +1 -0
  28. data/helpers/lib/NuGetUpdater/NuGetUpdater.Cli/Commands/FrameworkCheckCommand.cs +35 -0
  29. data/helpers/lib/NuGetUpdater/NuGetUpdater.Cli/Commands/UpdateCommand.cs +43 -0
  30. data/helpers/lib/NuGetUpdater/NuGetUpdater.Cli/NuGetUpdater.Cli.csproj +20 -0
  31. data/helpers/lib/NuGetUpdater/NuGetUpdater.Cli/Program.cs +31 -0
  32. data/helpers/lib/NuGetUpdater/NuGetUpdater.Cli.Test/EntryPointTests.FrameworkCheck.cs +42 -0
  33. data/helpers/lib/NuGetUpdater/NuGetUpdater.Cli.Test/EntryPointTests.Update.cs +323 -0
  34. data/helpers/lib/NuGetUpdater/NuGetUpdater.Cli.Test/NuGetUpdater.Cli.Test.csproj +24 -0
  35. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Dependency.cs +3 -0
  36. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/DependencyType.cs +12 -0
  37. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Files/BuildFile.cs +97 -0
  38. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Files/DotNetToolsJsonBuildFile.cs +23 -0
  39. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Files/GlobalJsonBuildFile.cs +36 -0
  40. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Files/JsonBuildFile.cs +47 -0
  41. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Files/PackagesConfigBuildFile.cs +31 -0
  42. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Files/ProjectBuildFile.cs +94 -0
  43. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Files/XmlBuildFile.cs +14 -0
  44. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/FrameworkChecker/CompatabilityChecker.cs +39 -0
  45. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/FrameworkChecker/FrameworkCompatibilityService.cs +73 -0
  46. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/FrameworkChecker/SupportedFrameworks.cs +146 -0
  47. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/NuGetUpdater.Core.csproj +27 -0
  48. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Updater/BindingRedirectManager.cs +316 -0
  49. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Updater/BindingRedirectResolver.cs +87 -0
  50. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Updater/ConfigurationFile.cs +3 -0
  51. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Updater/DotNetToolsJsonUpdater.cs +66 -0
  52. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Updater/GlobalJsonUpdater.cs +48 -0
  53. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Updater/PackagesConfigUpdater.cs +172 -0
  54. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Updater/SdkPackageUpdater.cs +498 -0
  55. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Updater/UpdateResult.cs +7 -0
  56. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Updater/UpdaterWorker.cs +105 -0
  57. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Utilities/JsonHelper.cs +222 -0
  58. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Utilities/Logger.cs +24 -0
  59. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Utilities/MSBuildHelper.cs +460 -0
  60. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Utilities/NuGetHelper.cs +15 -0
  61. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Utilities/PathHelper.cs +69 -0
  62. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Utilities/ProcessExtensions.cs +83 -0
  63. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core/Utilities/XmlExtensions.cs +124 -0
  64. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Files/DotNetToolsJsonBuildFileTests.cs +53 -0
  65. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Files/GlobalJsonBuildFileTests.cs +80 -0
  66. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Files/PackagesConfigBuildFileTests.cs +63 -0
  67. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Files/ProjectBuildFileTests.cs +154 -0
  68. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/FrameworkChecker/CompatibilityCheckerFacts.cs +64 -0
  69. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/FrameworkChecker/FrameworkCompatibilityServiceFacts.cs +122 -0
  70. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/FrameworkChecker/SupportedFrameworkFacts.cs +68 -0
  71. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/NuGetUpdater.Core.Test.csproj +23 -0
  72. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/TemporaryDirectory.cs +36 -0
  73. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/TestExtensions.cs +15 -0
  74. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Update/PackagesConfigUpdaterTests.cs +79 -0
  75. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Update/UpdateWorker.DirsProj.cs +201 -0
  76. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Update/UpdateWorkerTestBase.cs +147 -0
  77. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Update/UpdateWorkerTests.DotNetTools.cs +225 -0
  78. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Update/UpdateWorkerTests.GlobalJson.cs +217 -0
  79. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Update/UpdateWorkerTests.Mixed.cs +94 -0
  80. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Update/UpdateWorkerTests.PackagesConfig.cs +938 -0
  81. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Update/UpdateWorkerTests.Sdk.cs +2177 -0
  82. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Utilities/JsonHelperTests.cs +239 -0
  83. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Utilities/MSBuildHelperTests.cs +598 -0
  84. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Utilities/SdkPackageUpdaterHelperTests.cs +179 -0
  85. data/helpers/lib/NuGetUpdater/NuGetUpdater.Core.Test/Utilities/SdkPackageUpdaterTests.cs +238 -0
  86. data/helpers/lib/NuGetUpdater/NuGetUpdater.sln +152 -0
  87. data/helpers/lib/NuGetUpdater/xunit.runner.json +4 -0
  88. data/lib/dependabot/nuget/metadata_finder.rb +4 -4
  89. metadata +91 -5
@@ -0,0 +1,68 @@
1
+ // Copyright (c) .NET Foundation. All rights reserved.
2
+ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
3
+
4
+ using System.Collections.Generic;
5
+ using System.Linq;
6
+
7
+ using NuGet.Frameworks;
8
+
9
+ using NuGetGallery.Frameworks;
10
+
11
+ using Xunit;
12
+
13
+ using static NuGet.Frameworks.FrameworkConstants;
14
+ using static NuGet.Frameworks.FrameworkConstants.CommonFrameworks;
15
+
16
+ namespace NuGetUpdater.Core.Test.FrameworkChecker;
17
+
18
+ public class SupportedFrameworksFacts
19
+ {
20
+ private static readonly NuGetFramework Win = new NuGetFramework(FrameworkIdentifiers.Windows, EmptyVersion);
21
+ private static readonly NuGetFramework WinRt = new NuGetFramework(FrameworkIdentifiers.WinRT, EmptyVersion);
22
+
23
+ // See: https://docs.microsoft.com/en-us/dotnet/standard/frameworks#deprecated-target-frameworks
24
+ private readonly HashSet<NuGetFramework> DeprecatedFrameworks = new HashSet<NuGetFramework>() {
25
+ AspNet, AspNet50, AspNetCore, AspNetCore50,
26
+ Dnx, Dnx45, Dnx451, Dnx452, DnxCore, DnxCore50,
27
+ DotNet, DotNet50, DotNet51, DotNet52, DotNet53, DotNet54, DotNet55, DotNet56,
28
+ NetCore50,
29
+ Win, Win8, Win81, Win10,
30
+ WinRt
31
+ };
32
+ // The following frameworks were included in NuGet.Client code but they were not official framework releases.
33
+ private readonly HashSet<NuGetFramework> UnofficialFrameworks = new HashSet<NuGetFramework>()
34
+ {
35
+ NetStandard17, NetStandardApp15
36
+ };
37
+
38
+ [Fact]
39
+ public void SupportedFrameworksContainsCommonFrameworksWithNoDeprecatedFrameworks()
40
+ {
41
+ var fields = typeof(FrameworkConstants.CommonFrameworks)
42
+ .GetFields()
43
+ .Where(f => f.FieldType == typeof(NuGetFramework))
44
+ .ToList();
45
+
46
+ Assert.True(fields.Count > 0);
47
+
48
+ var supportedFrameworks = new HashSet<NuGetFramework>(SupportedFrameworks.AllSupportedNuGetFrameworks);
49
+
50
+ foreach (var field in fields)
51
+ {
52
+ var framework = (NuGetFramework)field.GetValue(null);
53
+
54
+ if (DeprecatedFrameworks.Contains(framework))
55
+ {
56
+ Assert.False(supportedFrameworks.Contains(framework), $"SupportedFrameworks should not contain the deprecated framework {field.Name}.");
57
+ }
58
+ else if (UnofficialFrameworks.Contains(framework))
59
+ {
60
+ Assert.False(supportedFrameworks.Contains(framework), $"SupportedFrameworks should not contain the unofficial framework {field.Name}.");
61
+ }
62
+ else
63
+ {
64
+ Assert.True(supportedFrameworks.Contains(framework), $"SupportedFrameworks is missing {field.Name} constant from CommonFrameworks.");
65
+ }
66
+ }
67
+ }
68
+ }
@@ -0,0 +1,23 @@
1
+ <Project Sdk="Microsoft.NET.Sdk">
2
+
3
+ <PropertyGroup>
4
+ <TargetFramework>$(CommonTargetFramework)</TargetFramework>
5
+ <OutputType>Exe</OutputType>
6
+ <Nullable>enable</Nullable>
7
+ </PropertyGroup>
8
+
9
+ <ItemGroup>
10
+ <ProjectReference Include="..\NuGetUpdater.Core\NuGetUpdater.Core.csproj" />
11
+ </ItemGroup>
12
+
13
+ <ItemGroup>
14
+ <PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.5.0" />
15
+ <PackageReference Include="xunit" Version="2.4.2" />
16
+ <PackageReference Include="xunit.runner.visualstudio" Version="2.4.5" />
17
+ </ItemGroup>
18
+
19
+ <ItemGroup>
20
+ <Content Include="..\xunit.runner.json" CopyToOutputDirectory="PreserveNewest" />
21
+ </ItemGroup>
22
+
23
+ </Project>
@@ -0,0 +1,36 @@
1
+ using System;
2
+ using System.IO;
3
+
4
+ namespace NuGetUpdater.Core.Test;
5
+
6
+ public sealed class TemporaryDirectory : IDisposable
7
+ {
8
+ public string DirectoryPath { get; }
9
+
10
+ public TemporaryDirectory()
11
+ {
12
+ var parentDir = Path.GetDirectoryName(GetType().Assembly.Location)!;
13
+ var tempDirName = $"nuget-updater-{Guid.NewGuid():d}";
14
+ DirectoryPath = Path.Combine(parentDir, "test-data", tempDirName);
15
+ Directory.CreateDirectory(DirectoryPath);
16
+ }
17
+
18
+ public void Dispose()
19
+ {
20
+ Directory.Delete(DirectoryPath, true);
21
+ }
22
+
23
+ public static TemporaryDirectory CreateWithContents(params (string Path, string Contents)[] fileContents)
24
+ {
25
+ var temporaryDirectory = new TemporaryDirectory();
26
+ foreach (var (path, contents) in fileContents)
27
+ {
28
+ var fullPath = Path.Combine(temporaryDirectory.DirectoryPath, path);
29
+ var fullDirectory = Path.GetDirectoryName(fullPath)!;
30
+ Directory.CreateDirectory(fullDirectory);
31
+ File.WriteAllText(fullPath, contents);
32
+ }
33
+
34
+ return temporaryDirectory;
35
+ }
36
+ }
@@ -0,0 +1,15 @@
1
+ using System.Collections.Generic;
2
+ using System.Linq;
3
+ using System.Xml.Linq;
4
+
5
+ using Microsoft.Language.Xml;
6
+
7
+ namespace NuGetUpdater.Core.Test;
8
+
9
+ static class TestExtensions
10
+ {
11
+ public static XElement ToXElement(this IXmlElementSyntax xml) => XElement.Parse(xml.ToFullString());
12
+
13
+ public static Dictionary<string, XElement> ToXElementDictionary(this Dictionary<string, IXmlElementSyntax> dictionary)
14
+ => dictionary.ToDictionary(kvp => kvp.Key, kvp => kvp.Value.ToXElement());
15
+ }
@@ -0,0 +1,79 @@
1
+ using System.Collections.Generic;
2
+
3
+ using Xunit;
4
+
5
+ namespace NuGetUpdater.Core.Test.Update;
6
+
7
+ public class PackagesConfigUpdaterTests
8
+ {
9
+ public PackagesConfigUpdaterTests()
10
+ {
11
+ MSBuildHelper.RegisterMSBuild();
12
+ }
13
+
14
+ [Theory]
15
+ [MemberData(nameof(PackagesDirectoryPathTestData))]
16
+ public void PathToPackagesDirectoryCanBeDetermined(string projectContents, string dependencyName, string dependencyVersion, string expectedPackagesDirectoryPath)
17
+ {
18
+ var projectBuildFile = ProjectBuildFile.Parse("/", "project.csproj", projectContents);
19
+ var actualPackagesDirectorypath = PackagesConfigUpdater.GetPathToPackagesDirectory(projectBuildFile, dependencyName, dependencyVersion);
20
+ Assert.Equal(expectedPackagesDirectoryPath, actualPackagesDirectorypath);
21
+ }
22
+
23
+ public static IEnumerable<object[]> PackagesDirectoryPathTestData()
24
+ {
25
+ // project with namespace
26
+ yield return new object[]
27
+ {
28
+ """
29
+ <Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
30
+ <ItemGroup>
31
+ <Reference Include="Newtonsoft.Json, Version=7.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed">
32
+ <HintPath>..\packages\Newtonsoft.Json.7.0.1\lib\net45\Newtonsoft.Json.dll</HintPath>
33
+ <Private>True</Private>
34
+ </Reference>
35
+ </ItemGroup>
36
+ </Project>
37
+ """,
38
+ "Newtonsoft.Json",
39
+ "7.0.1",
40
+ @"..\packages"
41
+ };
42
+
43
+ // project without namespace
44
+ yield return new object[]
45
+ {
46
+ """
47
+ <Project>
48
+ <ItemGroup>
49
+ <Reference Include="Newtonsoft.Json, Version=7.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed">
50
+ <HintPath>..\packages\Newtonsoft.Json.7.0.1\lib\net45\Newtonsoft.Json.dll</HintPath>
51
+ <Private>True</Private>
52
+ </Reference>
53
+ </ItemGroup>
54
+ </Project>
55
+ """,
56
+ "Newtonsoft.Json",
57
+ "7.0.1",
58
+ @"..\packages"
59
+ };
60
+
61
+ // project with non-standard packages path
62
+ yield return new object[]
63
+ {
64
+ """
65
+ <Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
66
+ <ItemGroup>
67
+ <Reference Include="Newtonsoft.Json, Version=7.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed">
68
+ <HintPath>..\not-a-path-you-would-expect\Newtonsoft.Json.7.0.1\lib\net45\Newtonsoft.Json.dll</HintPath>
69
+ <Private>True</Private>
70
+ </Reference>
71
+ </ItemGroup>
72
+ </Project>
73
+ """,
74
+ "Newtonsoft.Json",
75
+ "7.0.1",
76
+ @"..\not-a-path-you-would-expect"
77
+ };
78
+ }
79
+ }
@@ -0,0 +1,201 @@
1
+ using System;
2
+ using System.IO;
3
+ using System.Linq;
4
+ using System.Threading.Tasks;
5
+
6
+ using Xunit;
7
+
8
+ namespace NuGetUpdater.Core.Test.Update;
9
+
10
+ public partial class UpdateWorkerTests
11
+ {
12
+ public class DirsProj : UpdateWorkerTestBase
13
+ {
14
+ public DirsProj()
15
+ {
16
+ MSBuildHelper.RegisterMSBuild();
17
+ }
18
+
19
+ [Fact]
20
+ public async Task UpdateSingleDependencyInDirsProj()
21
+ {
22
+ await TestUpdateForDirsProj("Newtonsoft.Json", "9.0.1", "13.0.1",
23
+ // initial
24
+ projectContents: """
25
+ <Project Sdk="Microsoft.Build.NoTargets">
26
+
27
+ <ItemGroup>
28
+ <ProjectReference Include="src/test-project.csproj" />
29
+ </ItemGroup>
30
+
31
+ </Project>
32
+ """,
33
+ additionalFiles: new (string Path, string Content)[]
34
+ {
35
+ ("src/test-project.csproj",
36
+ """
37
+ <Project Sdk="Microsoft.NET.Sdk">
38
+ <PropertyGroup>
39
+ <TargetFramework>netstandard2.0</TargetFramework>
40
+ </PropertyGroup>
41
+
42
+ <ItemGroup>
43
+ <PackageReference Include="Newtonsoft.Json" Version="9.0.1" />
44
+ </ItemGroup>
45
+ </Project>
46
+ """)
47
+ },
48
+ // expected
49
+ expectedProjectContents: """
50
+ <Project Sdk="Microsoft.Build.NoTargets">
51
+
52
+ <ItemGroup>
53
+ <ProjectReference Include="src/test-project.csproj" />
54
+ </ItemGroup>
55
+
56
+ </Project>
57
+ """,
58
+ additionalFilesExpected: new (string Path, string Content)[]
59
+ {
60
+ ("src/test-project.csproj",
61
+ """
62
+ <Project Sdk="Microsoft.NET.Sdk">
63
+ <PropertyGroup>
64
+ <TargetFramework>netstandard2.0</TargetFramework>
65
+ </PropertyGroup>
66
+
67
+ <ItemGroup>
68
+ <PackageReference Include="Newtonsoft.Json" Version="13.0.1" />
69
+ </ItemGroup>
70
+ </Project>
71
+ """)
72
+ });
73
+ }
74
+
75
+ [Fact]
76
+ public async Task Update_MissingFileDoesNotThrow()
77
+ {
78
+ await TestUpdateForDirsProj("Newtonsoft.Json", "9.0.1", "13.0.1",
79
+ projectContents: """
80
+ <Project Sdk="Microsoft.Build.Traversal">
81
+ <ItemGroup>
82
+ <ProjectReference Include="private\dirs.proj" />
83
+ </ItemGroup>
84
+ </Project>
85
+ """,
86
+ expectedProjectContents: """
87
+ <Project Sdk="Microsoft.Build.Traversal">
88
+ <ItemGroup>
89
+ <ProjectReference Include="private\dirs.proj" />
90
+ </ItemGroup>
91
+ </Project>
92
+ """,
93
+ additionalFiles: []);
94
+ }
95
+
96
+ [Fact]
97
+ public async Task UpdateSingleDependencyInNestedDirsProj()
98
+ {
99
+ await TestUpdateForDirsProj("Newtonsoft.Json", "9.0.1", "13.0.1",
100
+ // initial
101
+ projectContents: """
102
+ <Project Sdk="Microsoft.Build.NoTargets">
103
+
104
+ <ItemGroup>
105
+ <ProjectReference Include="src/dirs.proj" />
106
+ </ItemGroup>
107
+
108
+ </Project>
109
+ """,
110
+ additionalFiles: new (string Path, string Content)[]
111
+ {
112
+ ("src/dirs.proj",
113
+ """
114
+ <Project Sdk="Microsoft.Build.NoTargets">
115
+
116
+ <ItemGroup>
117
+ <ProjectReference Include="test-project/test-project.csproj" />
118
+ </ItemGroup>
119
+
120
+ </Project>
121
+ """),
122
+ ("src/test-project/test-project.csproj",
123
+ """
124
+ <Project Sdk="Microsoft.NET.Sdk">
125
+ <PropertyGroup>
126
+ <TargetFramework>netstandard2.0</TargetFramework>
127
+ </PropertyGroup>
128
+
129
+ <ItemGroup>
130
+ <PackageReference Include="Newtonsoft.Json" Version="9.0.1" />
131
+ </ItemGroup>
132
+ </Project>
133
+ """)
134
+ },
135
+ // expected
136
+ expectedProjectContents: """
137
+ <Project Sdk="Microsoft.Build.NoTargets">
138
+
139
+ <ItemGroup>
140
+ <ProjectReference Include="src/dirs.proj" />
141
+ </ItemGroup>
142
+
143
+ </Project>
144
+ """,
145
+ additionalFilesExpected: new (string Path, string Content)[]
146
+ {
147
+ ("src/dirs.proj",
148
+ """
149
+ <Project Sdk="Microsoft.Build.NoTargets">
150
+
151
+ <ItemGroup>
152
+ <ProjectReference Include="test-project/test-project.csproj" />
153
+ </ItemGroup>
154
+
155
+ </Project>
156
+ """),
157
+ ("src/test-project/test-project.csproj",
158
+ """
159
+ <Project Sdk="Microsoft.NET.Sdk">
160
+ <PropertyGroup>
161
+ <TargetFramework>netstandard2.0</TargetFramework>
162
+ </PropertyGroup>
163
+
164
+ <ItemGroup>
165
+ <PackageReference Include="Newtonsoft.Json" Version="13.0.1" />
166
+ </ItemGroup>
167
+ </Project>
168
+ """)
169
+ });
170
+ }
171
+
172
+ static async Task TestUpdateForDirsProj(
173
+ string dependencyName,
174
+ string oldVersion,
175
+ string newVersion,
176
+ string projectContents,
177
+ string expectedProjectContents,
178
+ bool isTransitive = false,
179
+ (string Path, string Content)[]? additionalFiles = null,
180
+ (string Path, string Content)[]? additionalFilesExpected = null)
181
+ {
182
+ additionalFiles ??= Array.Empty<(string Path, string Content)>();
183
+ additionalFilesExpected ??= Array.Empty<(string Path, string Content)>();
184
+
185
+ var projectName = "dirs";
186
+ var projectFileName = $"{projectName}.proj";
187
+ var testFiles = additionalFiles.Prepend((projectFileName, projectContents)).ToArray();
188
+
189
+ var actualResult = await RunUpdate(testFiles, async (temporaryDirectory) =>
190
+ {
191
+ var projectPath = Path.Combine(temporaryDirectory, projectFileName);
192
+ var worker = new UpdaterWorker(new Logger(verbose: true));
193
+ await worker.RunAsync(temporaryDirectory, projectPath, dependencyName, oldVersion, newVersion, isTransitive);
194
+ });
195
+
196
+ var expectedResult = additionalFilesExpected.Prepend((projectFileName, expectedProjectContents)).ToArray();
197
+
198
+ AssertContainsFiles(expectedResult, actualResult);
199
+ }
200
+ }
201
+ }
@@ -0,0 +1,147 @@
1
+ using System;
2
+ using System.Collections.Generic;
3
+ using System.IO;
4
+ using System.Linq;
5
+ using System.Threading.Tasks;
6
+
7
+ using Xunit;
8
+
9
+ namespace NuGetUpdater.Core.Test.Update;
10
+
11
+ public abstract class UpdateWorkerTestBase
12
+ {
13
+ protected static Task TestNoChangeforProject(
14
+ string dependencyName,
15
+ string oldVersion,
16
+ string newVersion,
17
+ string projectContents,
18
+ bool isTransitive = false,
19
+ (string Path, string Content)[]? additionalFiles = null,
20
+ string projectFilePath = "test-project.csproj")
21
+ => TestUpdateForProject(dependencyName, oldVersion, newVersion, (projectFilePath, projectContents), expectedProjectContents: projectContents, isTransitive, additionalFiles, additionalFilesExpected: additionalFiles);
22
+
23
+ protected static Task TestUpdateForProject(
24
+ string dependencyName,
25
+ string oldVersion,
26
+ string newVersion,
27
+ string projectContents,
28
+ string expectedProjectContents,
29
+ bool isTransitive = false,
30
+ (string Path, string Content)[]? additionalFiles = null,
31
+ (string Path, string Content)[]? additionalFilesExpected = null,
32
+ string projectFilePath = "test-project.csproj")
33
+ {
34
+ var projectFile = (Path: projectFilePath, Content: projectContents);
35
+ return TestUpdateForProject(dependencyName, oldVersion, newVersion, projectFile, expectedProjectContents, isTransitive, additionalFiles, additionalFilesExpected);
36
+ }
37
+
38
+ protected static async Task TestUpdateForProject(
39
+ string dependencyName,
40
+ string oldVersion,
41
+ string newVersion,
42
+ (string Path, string Content) projectFile,
43
+ string expectedProjectContents,
44
+ bool isTransitive = false,
45
+ (string Path, string Content)[]? additionalFiles = null,
46
+ (string Path, string Content)[]? additionalFilesExpected = null)
47
+ {
48
+ additionalFiles ??= Array.Empty<(string Path, string Content)>();
49
+ additionalFilesExpected ??= Array.Empty<(string Path, string Content)>();
50
+
51
+ var projectFilePath = projectFile.Path;
52
+ var projectName = Path.GetFileNameWithoutExtension(projectFilePath);
53
+ var slnName = "test-solution.sln";
54
+ var slnContent = $$"""
55
+ Microsoft Visual Studio Solution File, Format Version 12.00
56
+ # Visual Studio 14
57
+ VisualStudioVersion = 14.0.22705.0
58
+ MinimumVisualStudioVersion = 10.0.40219.1
59
+ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "{{projectName}}", "{{projectFilePath}}", "{782E0C0A-10D3-444D-9640-263D03D2B20C}"
60
+ EndProject
61
+ Global
62
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
63
+ Debug|Any CPU = Debug|Any CPU
64
+ Release|Any CPU = Release|Any CPU
65
+ EndGlobalSection
66
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
67
+ {782E0C0A-10D3-444D-9640-263D03D2B20C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
68
+ {782E0C0A-10D3-444D-9640-263D03D2B20C}.Debug|Any CPU.Build.0 = Debug|Any CPU
69
+ {782E0C0A-10D3-444D-9640-263D03D2B20C}.Release|Any CPU.ActiveCfg = Release|Any CPU
70
+ {782E0C0A-10D3-444D-9640-263D03D2B20C}.Release|Any CPU.Build.0 = Release|Any CPU
71
+ EndGlobalSection
72
+ GlobalSection(SolutionProperties) = preSolution
73
+ HideSolutionNode = FALSE
74
+ EndGlobalSection
75
+ EndGlobal
76
+ """;
77
+ var testFiles = new[] { (slnName, slnContent), projectFile }.Concat(additionalFiles).ToArray();
78
+
79
+ var actualResult = await RunUpdate(testFiles, async (temporaryDirectory) =>
80
+ {
81
+ var slnPath = Path.Combine(temporaryDirectory, slnName);
82
+ var worker = new UpdaterWorker(new Logger(verbose: true));
83
+ await worker.RunAsync(temporaryDirectory, slnPath, dependencyName, oldVersion, newVersion, isTransitive);
84
+ });
85
+
86
+ var expectedResult = additionalFilesExpected.Prepend((projectFilePath, expectedProjectContents)).ToArray();
87
+
88
+ AssertContainsFiles(expectedResult, actualResult);
89
+ }
90
+
91
+ protected static async Task<(string Path, string Content)[]> RunUpdate((string Path, string Content)[] files, Func<string, Task> action)
92
+ {
93
+ // write initial files
94
+ using var tempDir = new TemporaryDirectory();
95
+ foreach (var file in files)
96
+ {
97
+ var localPath = file.Path.StartsWith("/") ? file.Path[1..] : file.Path; // remove path rooting character
98
+ var filePath = Path.Combine(tempDir.DirectoryPath, localPath);
99
+ var directoryPath = Path.GetDirectoryName(filePath);
100
+ Directory.CreateDirectory(directoryPath!);
101
+ await File.WriteAllTextAsync(filePath, file.Content);
102
+ }
103
+
104
+ // run update
105
+ await action(tempDir.DirectoryPath);
106
+
107
+ // gather results
108
+ var expectedFiles = new HashSet<string>(files.Select(f => f.Path));
109
+ var result = new List<(string Path, string Content)>();
110
+ foreach (var file in Directory.GetFiles(tempDir.DirectoryPath, "*.*", SearchOption.AllDirectories))
111
+ {
112
+ var localPath = file.StartsWith(tempDir.DirectoryPath)
113
+ ? file[tempDir.DirectoryPath.Length..]
114
+ : file; // how did this happen?
115
+ localPath = localPath.NormalizePathToUnix();
116
+ if (localPath.StartsWith('/'))
117
+ {
118
+ localPath = localPath[1..];
119
+ }
120
+
121
+ if (expectedFiles.Contains(localPath))
122
+ {
123
+ var content = await File.ReadAllTextAsync(file);
124
+ result.Add((localPath, content));
125
+ }
126
+ }
127
+
128
+ return result.ToArray();
129
+ }
130
+
131
+ protected static void AssertEqualFiles((string Path, string Content)[] expected, (string Path, string Content)[] actual)
132
+ {
133
+ Assert.Equal(expected.Length, actual.Length);
134
+ AssertContainsFiles(expected, actual);
135
+ }
136
+
137
+ protected static void AssertContainsFiles((string Path, string Content)[] expected, (string Path, string Content)[] actual)
138
+ {
139
+ var actualContents = actual.ToDictionary(pair => pair.Path, pair => pair.Content);
140
+ foreach (var expectedPair in expected)
141
+ {
142
+ var actualContent = actualContents[expectedPair.Path];
143
+ var expectedContent = expectedPair.Content;
144
+ Assert.Equal(expectedContent.Replace("\r", ""), actualContent.Replace("\r", "")); // normalize line endings
145
+ }
146
+ }
147
+ }