diff --git a/QueryKit.IntegrationTests/Tests/FilterParsingRegressionTests.cs b/QueryKit.IntegrationTests/Tests/FilterParsingRegressionTests.cs index 99bf6bd..476286b 100644 --- a/QueryKit.IntegrationTests/Tests/FilterParsingRegressionTests.cs +++ b/QueryKit.IntegrationTests/Tests/FilterParsingRegressionTests.cs @@ -3,6 +3,7 @@ namespace QueryKit.IntegrationTests.Tests; using System.Globalization; using System.Linq.Expressions; using Configuration; +using Exceptions; using FluentAssertions; using Microsoft.EntityFrameworkCore; using Operators; @@ -324,4 +325,22 @@ public async Task has_returns_matching_rows(string input, string[] expectedTitle // Assert recipes.Select(x => x.Title[prefix.Length..]).Should().BeEquivalentTo(expectedTitles); } + + [Theory] + [InlineData("""Age == "abc" """)] + [InlineData("""Age == abc""")] + [InlineData("""Rating > "abc" """)] + [InlineData("""Rating > abc""")] + public async Task invalid_value_throws_parsing_exception(string input) + { + // Arrange + var testingServiceScope = new TestingServiceScope(); + + // Act + var queryablePeople = testingServiceScope.DbContext().People; + var act = async () => await queryablePeople.ApplyQueryKitFilter(input).ToListAsync(); + + // Assert + await act.Should().ThrowAsync(); + } } diff --git a/QueryKit.UnitTests/DotNumberCultureTests.cs b/QueryKit.UnitTests/DotNumberCultureTests.cs index 89c99f4..2778369 100644 --- a/QueryKit.UnitTests/DotNumberCultureTests.cs +++ b/QueryKit.UnitTests/DotNumberCultureTests.cs @@ -35,11 +35,11 @@ public void dot_number_on_an_integer_property_throws_parsing_exception(string cu [InlineData("de-DE", "Rating ^^ [\"4.0\"]")] [InlineData("de-DE", "Rating > @4.4")] [InlineData("de-DE", "HaveMadeItMyself == 4.4")] - public void number_that_v1_14_2_also_converted_throws_format_exception(string cultureName, string input) + public void number_that_v1_14_2_also_converted_throws_parsing_exception(string cultureName, string input) { var act = () => WithCulture(cultureName, () => FilterParser.ParseFilter(input)); - act.Should().ThrowExactly(); + act.Should().ThrowExactly().WithInnerExceptionExactly(); } [Fact] diff --git a/QueryKit.UnitTests/FilterParsingRegressionTests.cs b/QueryKit.UnitTests/FilterParsingRegressionTests.cs index 8533635..2060352 100644 --- a/QueryKit.UnitTests/FilterParsingRegressionTests.cs +++ b/QueryKit.UnitTests/FilterParsingRegressionTests.cs @@ -342,6 +342,23 @@ public void whitespace_around_a_group_gives_the_same_filter(string input, string result.Should().Equal(expectedResult); } + [Theory] + [InlineData("""Age == "abc" """)] + [InlineData("""Age == abc""")] + [InlineData("""Rating > "abc" """)] + [InlineData("""Rating > abc""")] + [InlineData("""Age == 99999999999""")] + [InlineData("""Id == "abc" """)] + [InlineData("""SpecificDateTime == "abc" """)] + [InlineData("""Favorite == "abc" """)] + [InlineData("""Age ^^ ["abc"]""")] + public void invalid_value_throws_parsing_exception(string input) + { + var act = () => FilterParser.ParseFilter(input); + + act.Should().Throw(); + } + private static TResult WithCulture(string cultureName, Func action) { var originalCulture = CultureInfo.CurrentCulture; diff --git a/QueryKit.UnitTests/QueryNameOverUnknownTests.cs b/QueryKit.UnitTests/QueryNameOverUnknownTests.cs index 17796a3..823b109 100644 --- a/QueryKit.UnitTests/QueryNameOverUnknownTests.cs +++ b/QueryKit.UnitTests/QueryNameOverUnknownTests.cs @@ -43,11 +43,11 @@ public void failure_before_the_query_name_throws_parsing_exception() } [Fact] - public void failure_before_the_query_name_throws_its_own_format_exception() + public void failure_before_the_query_name_throws_its_own_parsing_exception() { var act = () => FilterParser.ParseFilter("""Age > "x" && is adult == true""", Config); - act.Should().ThrowExactly(); + act.Should().ThrowExactly().WithInnerExceptionExactly(); } [Fact] diff --git a/QueryKit/FilterParser.cs b/QueryKit/FilterParser.cs index 07ead9d..d8d7ccc 100644 --- a/QueryKit/FilterParser.cs +++ b/QueryKit/FilterParser.cs @@ -69,6 +69,14 @@ public static Expression> ParseFilter(string input, IQueryKitCo { throw new ParsingException(e); } + catch (FormatException e) + { + throw new ParsingException(e); + } + catch (OverflowException e) + { + throw new ParsingException(e); + } finally { FilterValue.Parameterize = parameterizeBefore;