diff --git a/tools/Custom/JsonExtensions.cs b/tools/Custom/JsonExtensions.cs index eedb2ba305..a951c0797a 100644 --- a/tools/Custom/JsonExtensions.cs +++ b/tools/Custom/JsonExtensions.cs @@ -79,7 +79,7 @@ public static string RemoveDefaultNullProperties(this JToken token) public static string ReplaceAndRemoveSlashes(this string body) { - return body.Replace("/", "").Replace("\\", "").Replace("rn", "").Replace("\"{", "{").Replace("}\"", "}"); + return body.Replace("\\", "").Replace("rn", "").Replace("\"{", "{").Replace("}\"", "}"); } } } \ No newline at end of file diff --git a/tools/Tests/JsonUtilitiesTest/JsonExtensionsTests.cs b/tools/Tests/JsonUtilitiesTest/JsonExtensionsTests.cs index 0aa03b5b1d..2b25e1b1a8 100644 --- a/tools/Tests/JsonUtilitiesTest/JsonExtensionsTests.cs +++ b/tools/Tests/JsonUtilitiesTest/JsonExtensionsTests.cs @@ -1,5 +1,6 @@ namespace JsonUtilitiesTest; using System; +using System.Text.Json; using Newtonsoft.Json.Linq; using Xunit; using NamespacePrefixPlaceholder.PowerShell.JsonUtilities; @@ -144,6 +145,66 @@ public void RemoveDefaultNullProperties_ShouldRemoveDefaultNullValuesInJsonArray Assert.False(result[0].ToObject().ContainsKey("email")); } + [Fact] + public void ReplaceAndRemoveSlashes_Should_Preserve_Json_Property_Values() + { + // Arrange + string inputJson = @"{ + ""RedirectUris"": [""http://localhost/.auth/login/aad/callback""], + ""DirectoryPath"": ""/this/is/a/directory/and/should/not/be/removed"" + }"; + + string expectedJson = @"{ + ""RedirectUris"": [""http://localhost/.auth/login/aad/callback""], + ""DirectoryPath"": ""/this/is/a/directory/and/should/not/be/removed"" + }"; + + // Act + string result = inputJson.ReplaceAndRemoveSlashes(); + + // Assert + Assert.Equal(NormalizeJson(expectedJson), NormalizeJson(result)); + } + + [Fact] + public void ReplaceAndRemoveSlashes_Should_Remove_Backslashes() + { + // Arrange + string input = @"Some \random \slashes that \should be removed."; + string expected = "Some random slashes that should be removed."; + + // Act + string result = input.ReplaceAndRemoveSlashes(); + + // Assert + Assert.Equal(expected, result); + } + + [Fact] + public void ReplaceAndRemoveSlashes_Should_Handle_Invalid_Json_Gracefully() + { + // Arrange + string invalidJson = "{Invalid Json \\with /slashes}"; + + // Act + string result = invalidJson.ReplaceAndRemoveSlashes(); + + // Assert + Assert.DoesNotContain("\\", result); + } + + /// + /// Normalizes JSON for comparison (removes formatting differences). + /// + private string NormalizeJson(string json) + { + using var doc = JsonDocument.Parse(json); + return JsonSerializer.Serialize(doc.RootElement, new JsonSerializerOptions + { + WriteIndented = false, + Encoder = System.Text.Encodings.Web.JavaScriptEncoder.UnsafeRelaxedJsonEscaping + }); + } }