@@ -224,5 +224,133 @@ public void Can_Disable_Fields()
224224 // assert
225225 Assert . Empty ( querySet . Fields ) ;
226226 }
227+
228+ [ Fact ]
229+ public void Can_Parse_Fields_Query ( )
230+ {
231+ // arrange
232+ const string type = "articles" ;
233+ const string attrName = "some-field" ;
234+ const string internalAttrName = "SomeField" ;
235+
236+ var query = new Dictionary < string , StringValues > { { $ "fields[{ type } ]", new StringValues ( attrName ) } } ;
237+
238+ _queryCollectionMock
239+ . Setup ( m => m . GetEnumerator ( ) )
240+ . Returns ( query . GetEnumerator ( ) ) ;
241+
242+ _controllerContextMock
243+ . Setup ( m => m . RequestEntity )
244+ . Returns ( new ContextEntity
245+ {
246+ EntityName = type ,
247+ Attributes = new List < AttrAttribute >
248+ {
249+ new AttrAttribute ( attrName )
250+ {
251+ InternalAttributeName = internalAttrName
252+ }
253+ }
254+ } ) ;
255+
256+ var queryParser = new QueryParser ( _controllerContextMock . Object , new JsonApiOptions ( ) ) ;
257+
258+ // act
259+ var querySet = queryParser . Parse ( _queryCollectionMock . Object ) ;
260+
261+ // assert
262+ Assert . NotEmpty ( querySet . Fields ) ;
263+ Assert . Equal ( 2 , querySet . Fields . Count ) ;
264+ Assert . Equal ( "Id" , querySet . Fields [ 0 ] ) ;
265+ Assert . Equal ( internalAttrName , querySet . Fields [ 1 ] ) ;
266+ }
267+
268+ [ Fact ]
269+ public void Throws_JsonApiException_If_Field_DoesNotExist ( )
270+ {
271+ // arrange
272+ const string type = "articles" ;
273+ const string attrName = "dne" ;
274+
275+ var query = new Dictionary < string , StringValues > { { $ "fields[{ type } ]", new StringValues ( attrName ) } } ;
276+
277+ _queryCollectionMock
278+ . Setup ( m => m . GetEnumerator ( ) )
279+ . Returns ( query . GetEnumerator ( ) ) ;
280+
281+ _controllerContextMock
282+ . Setup ( m => m . RequestEntity )
283+ . Returns ( new ContextEntity
284+ {
285+ EntityName = type ,
286+ Attributes = new List < AttrAttribute > ( )
287+ } ) ;
288+
289+ var queryParser = new QueryParser ( _controllerContextMock . Object , new JsonApiOptions ( ) ) ;
290+
291+ // act , assert
292+ var ex = Assert . Throws < JsonApiException > ( ( ) => queryParser . Parse ( _queryCollectionMock . Object ) ) ;
293+ Assert . Equal ( 400 , ex . GetStatusCode ( ) ) ;
294+ }
295+
296+ [ Theory ]
297+ [ InlineData ( "1" , 1 , false ) ]
298+ [ InlineData ( "abcde" , 0 , true ) ]
299+ [ InlineData ( "" , 0 , true ) ]
300+ public void Can_Parse_Page_Size_Query ( string value , int expectedValue , bool shouldThrow )
301+ {
302+ // arrange
303+ var query = new Dictionary < string , StringValues >
304+ { { "page[size]" , new StringValues ( value ) }
305+ } ;
306+
307+ _queryCollectionMock
308+ . Setup ( m => m . GetEnumerator ( ) )
309+ . Returns ( query . GetEnumerator ( ) ) ;
310+
311+ var queryParser = new QueryParser ( _controllerContextMock . Object , new JsonApiOptions ( ) ) ;
312+
313+ // act
314+ if ( shouldThrow )
315+ {
316+ var ex = Assert . Throws < JsonApiException > ( ( ) => queryParser . Parse ( _queryCollectionMock . Object ) ) ;
317+ Assert . Equal ( 400 , ex . GetStatusCode ( ) ) ;
318+ }
319+ else
320+ {
321+ var querySet = queryParser . Parse ( _queryCollectionMock . Object ) ;
322+ Assert . Equal ( expectedValue , querySet . PageQuery . PageSize ) ;
323+ }
324+ }
325+
326+ [ Theory ]
327+ [ InlineData ( "1" , 1 , false ) ]
328+ [ InlineData ( "abcde" , 0 , true ) ]
329+ [ InlineData ( "" , 0 , true ) ]
330+ public void Can_Parse_Page_Number_Query ( string value , int expectedValue , bool shouldThrow )
331+ {
332+ // arrange
333+ var query = new Dictionary < string , StringValues >
334+ { { "page[number]" , new StringValues ( value ) }
335+ } ;
336+
337+ _queryCollectionMock
338+ . Setup ( m => m . GetEnumerator ( ) )
339+ . Returns ( query . GetEnumerator ( ) ) ;
340+
341+ var queryParser = new QueryParser ( _controllerContextMock . Object , new JsonApiOptions ( ) ) ;
342+
343+ // act
344+ if ( shouldThrow )
345+ {
346+ var ex = Assert . Throws < JsonApiException > ( ( ) => queryParser . Parse ( _queryCollectionMock . Object ) ) ;
347+ Assert . Equal ( 400 , ex . GetStatusCode ( ) ) ;
348+ }
349+ else
350+ {
351+ var querySet = queryParser . Parse ( _queryCollectionMock . Object ) ;
352+ Assert . Equal ( expectedValue , querySet . PageQuery . PageOffset ) ;
353+ }
354+ }
227355 }
228- }
356+ }
0 commit comments