diff --git a/src/Microsoft.DotNet.ProjectJsonMigration/DefaultMigrationRuleSet.cs b/src/Microsoft.DotNet.ProjectJsonMigration/DefaultMigrationRuleSet.cs index 6fd2db4f7..7d749040c 100644 --- a/src/Microsoft.DotNet.ProjectJsonMigration/DefaultMigrationRuleSet.cs +++ b/src/Microsoft.DotNet.ProjectJsonMigration/DefaultMigrationRuleSet.cs @@ -19,6 +19,7 @@ namespace Microsoft.DotNet.ProjectJsonMigration new MigratePackageDependenciesAndToolsRule(), new MigrateConfigurationsRule(), new MigrateScriptsRule(), + new MigratePropertiesRule(), new WorkaroundOptionsRule(), new SaveOutputProjectRule() }; diff --git a/src/Microsoft.DotNet.ProjectJsonMigration/Rules/MigratePropertiesRule.cs b/src/Microsoft.DotNet.ProjectJsonMigration/Rules/MigratePropertiesRule.cs new file mode 100644 index 000000000..21d6ba259 --- /dev/null +++ b/src/Microsoft.DotNet.ProjectJsonMigration/Rules/MigratePropertiesRule.cs @@ -0,0 +1,52 @@ +// Copyright (c) .NET Foundation and contributors. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +using System.Collections.Generic; +using System.IO; +using Microsoft.DotNet.ProjectJsonMigration.Transforms; +using Microsoft.Build.Construction; +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; + +namespace Microsoft.DotNet.ProjectJsonMigration.Rules +{ + public class MigratePropertiesRule : IMigrationRule + { + private Dictionary> _propertyMappings + = new Dictionary> + { + ["userSecretsId"] = new AddPropertyTransform("UserSecretsId", + j => j.Value(), + j => !string.IsNullOrEmpty(j.Value())) + }; + + private readonly ITransformApplicator _transformApplicator; + + public MigratePropertiesRule(ITransformApplicator transformApplicator = null) + { + _transformApplicator = transformApplicator ?? new TransformApplicator(); + } + + public void Apply(MigrationSettings migrationSettings, MigrationRuleInputs migrationRuleInputs) + { + var propertyGroup = migrationRuleInputs.CommonPropertyGroup; + + var projectFile = migrationRuleInputs.DefaultProjectContext.ProjectFile.ProjectFilePath; + + using (var stream = new FileStream(projectFile, FileMode.Open)) + using (var streamReader = new StreamReader(stream)) + using (var jsonReader = new JsonTextReader(streamReader)) + { + var rawProject = JObject.Load(jsonReader); + foreach (var prop in _propertyMappings) + { + var token = rawProject.GetValue(prop.Key); + if (token != null) + { + _transformApplicator.Execute(prop.Value.Transform(token), propertyGroup); + } + } + } + } + } +} diff --git a/test/Microsoft.DotNet.ProjectJsonMigration.Tests/Rules/GivenThatIWantToMigrateProperties.cs b/test/Microsoft.DotNet.ProjectJsonMigration.Tests/Rules/GivenThatIWantToMigrateProperties.cs new file mode 100644 index 000000000..14ffdecad --- /dev/null +++ b/test/Microsoft.DotNet.ProjectJsonMigration.Tests/Rules/GivenThatIWantToMigrateProperties.cs @@ -0,0 +1,56 @@ +// Copyright (c) .NET Foundation and contributors. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +using System.Linq; +using Microsoft.Build.Construction; +using Microsoft.DotNet.Tools.Test.Utilities; +using FluentAssertions; +using Microsoft.DotNet.ProjectJsonMigration.Rules; +using Xunit; + +namespace Microsoft.DotNet.ProjectJsonMigration.Tests +{ + public class GivenThatIWantToMigrateProperties : TestBase + { + [Fact] + public void It_does_not_migrate_missing_props() + { + var mockProj = RunPropertiesRuleOnPj(@" + {}"); + + mockProj.Properties.Count().Should().Be(0); + } + + [Fact] + public void It_migrates_userSecretsId() + { + var mockProj = RunPropertiesRuleOnPj(@" + { + ""userSecretsId"": ""XYZ"" + }"); + + mockProj.Properties.Count(p => p.Name == "UserSecretsId").Should().Be(1); + mockProj.Properties.First(p => p.Name == "UserSecretsId").Value.Should().Be("XYZ"); + } + + [Fact] + public void It_migrates_empty_userSecretsId() + { + var mockProj = RunPropertiesRuleOnPj(@" + { + ""userSecretsId"": """" + }"); + + mockProj.Properties.Count(p => p.Name == "UserSecretsId").Should().Be(0); + } + + private ProjectRootElement RunPropertiesRuleOnPj(string project, string testDirectory = null) + { + testDirectory = testDirectory ?? Temp.CreateDirectory().Path; + return TemporaryProjectFileRuleRunner.RunRules(new IMigrationRule[] + { + new MigratePropertiesRule() + }, project, testDirectory); + } + } +} \ No newline at end of file