Skip to content

Commit 16fef94

Browse files
authored
Feature/allow leading space (#1041)
* Tests for leading, trailing, and spaces * Allow leading space in literals * More meaningful test examples * Review feedback * Test for unexpected whitespace in the middle (at start of a token)
1 parent 7428c80 commit 16fef94

File tree

3 files changed

+6
-2
lines changed

3 files changed

+6
-2
lines changed

src/JsonApiDotNetCore/Queries/Internal/Parsing/QueryTokenizer.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@ public IEnumerable<Token> EnumerateTokens()
8787
}
8888
else
8989
{
90-
if (_textBuffer.Length == 0 && ch == ' ')
90+
if (_textBuffer.Length == 0 && ch == ' ' && !_isInQuotedSection)
9191
{
9292
throw new QueryParseException("Unexpected whitespace.");
9393
}

test/JsonApiDotNetCoreExampleTests/UnitTests/QueryStringParameters/FilterParseTests.cs

+4
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,7 @@ public void Reader_Is_Enabled(JsonApiQueryStringParameters parametersDisabled, b
6767
[InlineData("filter[posts]", "equals(author,'some')", "Attribute 'author' does not exist on resource 'blogPosts'.")]
6868
[InlineData("filter[posts]", "lessThan(author,null)", "Attribute 'author' does not exist on resource 'blogPosts'.")]
6969
[InlineData("filter", " ", "Unexpected whitespace.")]
70+
[InlineData("filter", "contains(owner.displayName, )", "Unexpected whitespace.")]
7071
[InlineData("filter", "some", "Filter function expected.")]
7172
[InlineData("filter", "equals", "( expected.")]
7273
[InlineData("filter", "equals'", "Unexpected ' outside text.")]
@@ -115,6 +116,9 @@ public void Reader_Read_Fails(string parameterName, string parameterValue, strin
115116
[InlineData("filter", "equals(title,'Brian O''Quote')", null, "equals(title,'Brian O''Quote')")]
116117
[InlineData("filter", "equals(title,'!@#$%^&*()-_=+\"''[]{}<>()/|\\:;.,`~')", null, "equals(title,'!@#$%^&*()-_=+\"''[]{}<>()/|\\:;.,`~')")]
117118
[InlineData("filter", "equals(title,'')", null, "equals(title,'')")]
119+
[InlineData("filter", "startsWith(owner.displayName,'GivenName ')", null, "startsWith(owner.displayName,'GivenName ')")]
120+
[InlineData("filter", "endsWith(owner.displayName,' Surname')", null, "endsWith(owner.displayName,' Surname')")]
121+
[InlineData("filter", "contains(owner.displayName,' ')", null, "contains(owner.displayName,' ')")]
118122
[InlineData("filter[posts]", "equals(caption,'this, that & more')", "posts", "equals(caption,'this, that & more')")]
119123
[InlineData("filter[owner.posts]", "equals(caption,'some')", "owner.posts", "equals(caption,'some')")]
120124
[InlineData("filter[posts.comments]", "equals(createdAt,'2000-01-01')", "posts.comments", "equals(createdAt,'2000-01-01')")]

test/JsonApiDotNetCoreExampleTests/UnitTests/QueryStringParameters/LegacyFilterParseTests.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,6 @@ public LegacyFilterParseTests()
3737
[InlineData("filter[author]", "some", "Attribute 'author' does not exist on resource 'blogPosts'.")]
3838
[InlineData("filter[author.posts]", "some", "Field 'posts' in 'author.posts' must be an attribute or a to-one relationship on resource 'webAccounts'.")]
3939
[InlineData("filter[unknown.id]", "some", "Relationship 'unknown' in 'unknown.id' does not exist on resource 'blogPosts'.")]
40-
[InlineData("filter[author]", " ", "Unexpected whitespace.")]
4140
[InlineData("filter", "expr:equals(some,'other')", "Field 'some' does not exist on resource 'blogPosts'.")]
4241
[InlineData("filter", "expr:equals(author,'Joe')", "Attribute 'author' does not exist on resource 'blogPosts'.")]
4342
[InlineData("filter", "expr:has(author)", "Relationship 'author' must be a to-many relationship on resource 'blogPosts'.")]
@@ -75,6 +74,7 @@ public void Reader_Read_Fails(string parameterName, string parameterValue, strin
7574
[InlineData("filter[caption]", "isnull:", "equals(caption,null)")]
7675
[InlineData("filter[caption]", "isnotnull:", "not(equals(caption,null))")]
7776
[InlineData("filter[caption]", "unknown:some", "equals(caption,'unknown:some')")]
77+
[InlineData("filter[caption]", " ", "equals(caption,' ')")]
7878
[InlineData("filter[author.userName]", "Jack", "equals(author.userName,'Jack')")]
7979
[InlineData("filter", "expr:equals(caption,'some')", "equals(caption,'some')")]
8080
[InlineData("filter", "expr:equals(author,null)", "equals(author,null)")]

0 commit comments

Comments
 (0)