JsonPatchDocumentJObjectTest.cs 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176
  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. using System.Collections.Generic;
  4. using System.Dynamic;
  5. using Microsoft.AspNetCore.JsonPatch.Exceptions;
  6. using Microsoft.AspNetCore.JsonPatch.Operations;
  7. using Newtonsoft.Json;
  8. using Newtonsoft.Json.Linq;
  9. using Xunit;
  10. namespace Microsoft.AspNetCore.JsonPatch
  11. {
  12. public class JsonPatchDocumentJObjectTest
  13. {
  14. [Fact]
  15. public void ApplyTo_Array_Add()
  16. {
  17. // Arrange
  18. var model = new ObjectWithJObject{ CustomData = JObject.FromObject(new { Emails = new[] { "[email protected]" } })};
  19. var patch = new JsonPatchDocument<ObjectWithJObject>();
  20. patch.Operations.Add(new Operation<ObjectWithJObject>("add", "/CustomData/Emails/-", null, "[email protected]"));
  21. // Act
  22. patch.ApplyTo(model);
  23. // Assert
  24. Assert.Equal("[email protected]", model.CustomData["Emails"][1].Value<string>());
  25. }
  26. [Fact]
  27. public void ApplyTo_Model_Test1()
  28. {
  29. // Arrange
  30. var model = new ObjectWithJObject{ CustomData = JObject.FromObject(new { Email = "[email protected]", Name = "Bar" })};
  31. var patch = new JsonPatchDocument<ObjectWithJObject>();
  32. patch.Operations.Add(new Operation<ObjectWithJObject>("test", "/CustomData/Email", null, "[email protected]"));
  33. patch.Operations.Add(new Operation<ObjectWithJObject>("add", "/CustomData/Name", null, "Bar Baz"));
  34. // Act & Assert
  35. Assert.Throws<JsonPatchException>(() => patch.ApplyTo(model));
  36. }
  37. [Fact]
  38. public void ApplyTo_Model_Test2()
  39. {
  40. // Arrange
  41. var model = new ObjectWithJObject{ CustomData = JObject.FromObject(new { Email = "[email protected]", Name = "Bar" })};
  42. var patch = new JsonPatchDocument<ObjectWithJObject>();
  43. patch.Operations.Add(new Operation<ObjectWithJObject>("test", "/CustomData/Email", null, "[email protected]"));
  44. patch.Operations.Add(new Operation<ObjectWithJObject>("add", "/CustomData/Name", null, "Bar Baz"));
  45. // Act
  46. patch.ApplyTo(model);
  47. // Assert
  48. Assert.Equal("Bar Baz", model.CustomData["Name"].Value<string>());
  49. }
  50. [Fact]
  51. public void ApplyTo_Model_Copy()
  52. {
  53. // Arrange
  54. var model = new ObjectWithJObject{ CustomData = JObject.FromObject(new { Email = "[email protected]" })};
  55. var patch = new JsonPatchDocument<ObjectWithJObject>();
  56. patch.Operations.Add(new Operation<ObjectWithJObject>("copy", "/CustomData/UserName", "/CustomData/Email"));
  57. // Act
  58. patch.ApplyTo(model);
  59. // Assert
  60. Assert.Equal("[email protected]", model.CustomData["UserName"].Value<string>());
  61. }
  62. [Fact]
  63. public void ApplyTo_Model_Remove()
  64. {
  65. // Arrange
  66. var model = new ObjectWithJObject{ CustomData = JObject.FromObject(new { FirstName = "Foo", LastName = "Bar" })};
  67. var patch = new JsonPatchDocument<ObjectWithJObject>();
  68. patch.Operations.Add(new Operation<ObjectWithJObject>("remove", "/CustomData/LastName", null));
  69. // Act
  70. patch.ApplyTo(model);
  71. // Assert
  72. Assert.False(model.CustomData.ContainsKey("LastName"));
  73. }
  74. [Fact]
  75. public void ApplyTo_Model_Move()
  76. {
  77. // Arrange
  78. var model = new ObjectWithJObject{ CustomData = JObject.FromObject(new { FirstName = "Bar" })};
  79. var patch = new JsonPatchDocument<ObjectWithJObject>();
  80. patch.Operations.Add(new Operation<ObjectWithJObject>("move", "/CustomData/LastName", "/CustomData/FirstName"));
  81. // Act
  82. patch.ApplyTo(model);
  83. // Assert
  84. Assert.False(model.CustomData.ContainsKey("FirstName"));
  85. Assert.Equal("Bar", model.CustomData["LastName"].Value<string>());
  86. }
  87. [Fact]
  88. public void ApplyTo_Model_Add()
  89. {
  90. // Arrange
  91. var model = new ObjectWithJObject();
  92. var patch = new JsonPatchDocument<ObjectWithJObject>();
  93. patch.Operations.Add(new Operation<ObjectWithJObject>("add", "/CustomData/Name", null, "Foo"));
  94. // Act
  95. patch.ApplyTo(model);
  96. // Assert
  97. Assert.Equal("Foo", model.CustomData["Name"].Value<string>());
  98. }
  99. [Fact]
  100. public void ApplyTo_Model_Add_Null()
  101. {
  102. // Arrange
  103. var model = new ObjectWithJObject();
  104. var patch = new JsonPatchDocument<ObjectWithJObject>();
  105. patch.Operations.Add(new Operation<ObjectWithJObject>("add", "/CustomData/Name", null, null));
  106. // Act
  107. patch.ApplyTo(model);
  108. // Assert
  109. Assert.Equal(JTokenType.Null, model.CustomData["Name"].Type);
  110. }
  111. [Fact]
  112. public void ApplyTo_Model_Replace()
  113. {
  114. // Arrange
  115. var model = new ObjectWithJObject{ CustomData = JObject.FromObject(new { Email = "[email protected]", Name = "Bar" })};
  116. var patch = new JsonPatchDocument<ObjectWithJObject>();
  117. patch.Operations.Add(new Operation<ObjectWithJObject>("replace", "/CustomData/Email", null, "[email protected]"));
  118. // Act
  119. patch.ApplyTo(model);
  120. // Assert
  121. Assert.Equal("[email protected]", model.CustomData["Email"].Value<string>());
  122. }
  123. [Fact]
  124. public void ApplyTo_Model_Replace_Null()
  125. {
  126. // Arrange
  127. var model = new ObjectWithJObject { CustomData = JObject.FromObject(new { Email = "[email protected]", Name = "Bar" }) };
  128. var patch = new JsonPatchDocument<ObjectWithJObject>();
  129. patch.Operations.Add(new Operation<ObjectWithJObject>("replace", "/CustomData/Email", null, null));
  130. // Act
  131. patch.ApplyTo(model);
  132. // Assert
  133. Assert.Equal(JTokenType.Null, model.CustomData["Email"].Type);
  134. }
  135. }
  136. }