diff --git a/JsonPatchDocumentExtensionDataAdapter/JsonPatchDocumentExtensionDataAdapter/JsonPatchDocumentExtensionDataAdapter.cs b/JsonPatchDocumentExtensionDataAdapter/JsonPatchDocumentExtensionDataAdapter/JsonPatchDocumentExtensionDataAdapter.cs index bb13eec..12f88bb 100644 --- a/JsonPatchDocumentExtensionDataAdapter/JsonPatchDocumentExtensionDataAdapter/JsonPatchDocumentExtensionDataAdapter.cs +++ b/JsonPatchDocumentExtensionDataAdapter/JsonPatchDocumentExtensionDataAdapter/JsonPatchDocumentExtensionDataAdapter.cs @@ -258,6 +258,10 @@ in TModel model } var originalError = applyError!; + { + // if the operation looks like a list operation with [] instead of / + // then log a warning + } var extensionDataKey = GetPathRelativeToExtensionData(originalOperation.path); if (extensionDataAlreadyExists) { diff --git a/JsonPatchDocumentExtensionDataAdapter/UnitTest/Models.cs b/JsonPatchDocumentExtensionDataAdapter/UnitTest/Models.cs index 118b7dd..a4d2a02 100644 --- a/JsonPatchDocumentExtensionDataAdapter/UnitTest/Models.cs +++ b/JsonPatchDocumentExtensionDataAdapter/UnitTest/Models.cs @@ -24,6 +24,17 @@ internal class MyClassWithNesting public MyClass? MyModel { get; set; } } +internal class MyClassWithAList +{ + public int? Foo { get; set; } + public string? Bar { get; set; } + + public List? SomeList { get; set; } + + [System.Text.Json.Serialization.JsonExtensionData] + public IDictionary? MyExtensionData { get; set; } +} + /// /// similar to but with JsonPropertyName attributes /// diff --git a/JsonPatchDocumentExtensionDataAdapter/UnitTest/SimpleTests.cs b/JsonPatchDocumentExtensionDataAdapter/UnitTest/SimpleTests.cs index a9c9394..96312e3 100644 --- a/JsonPatchDocumentExtensionDataAdapter/UnitTest/SimpleTests.cs +++ b/JsonPatchDocumentExtensionDataAdapter/UnitTest/SimpleTests.cs @@ -1,6 +1,7 @@ using FluentAssertions; using JsonExtensionDataPatchDocumentAdapter; using Microsoft.AspNetCore.JsonPatch; +using Microsoft.AspNetCore.JsonPatch.Exceptions; using Microsoft.AspNetCore.JsonPatch.Operations; namespace UnitTest; @@ -126,4 +127,29 @@ bool invokeAsExtensionMethod .Be("def"); } } + + [TestMethod] + public void TestPatchingExtensionData_Recognizes_Invalid_Path() + { + var myEntity = new MyClassWithAList(); + var myPatch = new JsonPatchDocument(); + myPatch.Add(x => x.Foo, 42); + myPatch.Add(x => x.Bar, "fgh"); + myPatch.Operations.Add( + new Operation + { + path = "/SomeList[0]", + op = "add", + value = 17, + } + ); + var patchingOriginal = () => myPatch.ApplyTo(myEntity); + patchingOriginal.Should().Throw(); + + var adaptedPatch = new JsonPatchDocumentExtensionDataAdapter(x => + x.MyExtensionData + ).TransformDocument(myPatch, in myEntity); + adaptedPatch.ApplyTo(myEntity); + myEntity.MyExtensionData.Should().NotContainKey("SomeList[0]"); + } }