22using System . Net . Http ;
33using System . Threading . Tasks ;
44using DotNetCoreDocs ;
5- using DotNetCoreDocs . Models ;
65using DotNetCoreDocs . Writers ;
76using JsonApiDotNetCoreExample ;
87using Microsoft . AspNetCore . Hosting ;
98using Microsoft . AspNetCore . TestHost ;
10- using Newtonsoft . Json ;
119using Xunit ;
12- using JsonApiDotNetCore . Internal ;
1310using JsonApiDotNetCoreExample . Data ;
1411using Bogus ;
1512using JsonApiDotNetCoreExample . Models ;
1613using JsonApiDotNetCore . Serialization ;
1714using System . Linq ;
15+ using Person = JsonApiDotNetCoreExample . Models . Person ;
1816
1917namespace JsonApiDotNetCoreExampleTests . Acceptance . Spec
2018{
@@ -23,13 +21,18 @@ public class AttributeFilterTests
2321 {
2422 private DocsFixture < Startup , JsonDocWriter > _fixture ;
2523 private Faker < TodoItem > _todoItemFaker ;
26-
24+ private readonly Faker < Person > _personFaker ;
25+
2726 public AttributeFilterTests ( DocsFixture < Startup , JsonDocWriter > fixture )
2827 {
2928 _fixture = fixture ;
3029 _todoItemFaker = new Faker < TodoItem > ( )
3130 . RuleFor ( t => t . Description , f => f . Lorem . Sentence ( ) )
3231 . RuleFor ( t => t . Ordinal , f => f . Random . Number ( ) ) ;
32+
33+ _personFaker = new Faker < Person > ( )
34+ . RuleFor ( p => p . FirstName , f => f . Name . FirstName ( ) )
35+ . RuleFor ( p => p . LastName , f => f . Name . LastName ( ) ) ;
3336 }
3437
3538 [ Fact ]
@@ -63,5 +66,39 @@ public async Task Can_Filter_On_Guid_Properties()
6366 Assert . Equal ( todoItem . Id , todoItemResponse . Id ) ;
6467 Assert . Equal ( todoItem . GuidProperty , todoItemResponse . GuidProperty ) ;
6568 }
69+
70+
71+ [ Fact ]
72+ public async Task Can_Filter_On_Related_Attrs ( )
73+ {
74+ // arrange
75+ var context = _fixture . GetService < AppDbContext > ( ) ;
76+ var person = _personFaker . Generate ( ) ;
77+ var todoItem = _todoItemFaker . Generate ( ) ;
78+ todoItem . Owner = person ;
79+ context . TodoItems . Add ( todoItem ) ;
80+ await context . SaveChangesAsync ( ) ;
81+
82+ var builder = new WebHostBuilder ( )
83+ . UseStartup < Startup > ( ) ;
84+ var httpMethod = new HttpMethod ( "GET" ) ;
85+ var route = $ "/api/v1/todo-items?include[owner]&filter[owner.first-name]={ person . FirstName } ";
86+ var server = new TestServer ( builder ) ;
87+ var client = server . CreateClient ( ) ;
88+ var request = new HttpRequestMessage ( httpMethod , route ) ;
89+
90+ // act
91+ var response = await client . SendAsync ( request ) ;
92+ var body = await response . Content . ReadAsStringAsync ( ) ;
93+ var deserializedBody = _fixture
94+ . GetService < IJsonApiDeSerializer > ( )
95+ . DeserializeList < TodoItem > ( body ) ;
96+
97+ // assert
98+ Assert . Equal ( HttpStatusCode . OK , response . StatusCode ) ;
99+ Assert . NotEmpty ( deserializedBody ) ;
100+ foreach ( var item in deserializedBody )
101+ Assert . Equal ( person . FirstName , item . Owner . FirstName ) ;
102+ }
66103 }
67104}
0 commit comments