From 34b1b5473756d41cd7c1c06fdd5bbddf1e857d2b Mon Sep 17 00:00:00 2001 From: Mikhail Preyskurantov Date: Wed, 22 May 2024 15:56:38 +0300 Subject: [PATCH] single binary filter expression operand value can be null --- .../DataSourceLoadOptionsParserTests.cs | 13 ++++++++++++ .../DeserializeTests.cs | 21 +++++++++++++++++++ .../DeserializeTestsEx.cs | 19 +++++++++++++++++ net/DevExtreme.AspNet.Data/Compatibility.cs | 3 +++ 4 files changed, 56 insertions(+) create mode 100644 net/DevExtreme.AspNet.Data.Tests/DeserializeTests.cs create mode 100644 net/DevExtreme.AspNet.Data.Tests/DeserializeTestsEx.cs diff --git a/net/DevExtreme.AspNet.Data.Tests/DataSourceLoadOptionsParserTests.cs b/net/DevExtreme.AspNet.Data.Tests/DataSourceLoadOptionsParserTests.cs index 10064cdb..81aec9a1 100644 --- a/net/DevExtreme.AspNet.Data.Tests/DataSourceLoadOptionsParserTests.cs +++ b/net/DevExtreme.AspNet.Data.Tests/DataSourceLoadOptionsParserTests.cs @@ -59,6 +59,19 @@ public void MustNotParseDates() { Assert.IsType(opts.Filter[1]); } + [Fact] + public void MustParseNull() { + var opts = new SampleLoadOptions(); + + DataSourceLoadOptionsParser.Parse(opts, key => { + if(key == DataSourceLoadOptionsParser.KEY_FILTER) + return @"[ ""fieldName"", ""="", null ]"; + return null; + }); + + Assert.Equal(new[] { "fieldName", "=", null }, opts.Filter.Cast()); + } + [Fact] public void MustParseNumericAsString() { var opts = new SampleLoadOptions(); diff --git a/net/DevExtreme.AspNet.Data.Tests/DeserializeTests.cs b/net/DevExtreme.AspNet.Data.Tests/DeserializeTests.cs new file mode 100644 index 00000000..512ddcd4 --- /dev/null +++ b/net/DevExtreme.AspNet.Data.Tests/DeserializeTests.cs @@ -0,0 +1,21 @@ +using System.Collections; +using System.Text.Json; +using Xunit; + +namespace DevExtreme.AspNet.Data.Tests { + + public class DeserializeTests { + static readonly JsonSerializerOptions TESTS_DEFAULT_SERIALIZER_OPTIONS = new JsonSerializerOptions(JsonSerializerDefaults.Web) { + Converters = { new ListConverter() } + }; + + [Theory] + [InlineData(@"[""fieldName"",""="",null]")] + [InlineData(@"[[""fieldName1"",""="",""""],""and"",[""fieldName2"",""="",null]]")] + public void FilterOperandValueCanBeNull(string rawJsonCriteria) { + var deserializedList = JsonSerializer.Deserialize(rawJsonCriteria, TESTS_DEFAULT_SERIALIZER_OPTIONS); + Assert.Equal(3, deserializedList.Count); + } + } + +} diff --git a/net/DevExtreme.AspNet.Data.Tests/DeserializeTestsEx.cs b/net/DevExtreme.AspNet.Data.Tests/DeserializeTestsEx.cs new file mode 100644 index 00000000..c88d702b --- /dev/null +++ b/net/DevExtreme.AspNet.Data.Tests/DeserializeTestsEx.cs @@ -0,0 +1,19 @@ +#if NEWTONSOFT_TESTS +using System.Collections; +using Newtonsoft.Json; +using Xunit; + +namespace DevExtreme.AspNet.Data.Tests { + + public class DeserializeTestsEx { + [Theory] + [InlineData(@"[""fieldName"",""="",null]")] + [InlineData(@"[[""fieldName1"",""="",""""],""and"",[""fieldName2"",""="",null]]")] + public void FilterOperandValueCanBeNull(string rawJsonCriteria) { + var deserializedList = JsonConvert.DeserializeObject(rawJsonCriteria); + Assert.Equal(3, deserializedList.Count); + } + } + +} +#endif diff --git a/net/DevExtreme.AspNet.Data/Compatibility.cs b/net/DevExtreme.AspNet.Data/Compatibility.cs index c8ca7a20..9b6e0ec9 100644 --- a/net/DevExtreme.AspNet.Data/Compatibility.cs +++ b/net/DevExtreme.AspNet.Data/Compatibility.cs @@ -18,6 +18,9 @@ public static IList UnwrapList(IList deserializedList) { } static object UnwrapJsonElement(object deserializeObject) { + if(deserializeObject == null) + return null; + if(!(deserializeObject is JsonElement jsonElement)) throw new InvalidOperationException();