Skip to content

Commit 56cfe08

Browse files
authored
Merge pull request #1259 from bart-vmware/fix-secondary-reverse-filter
Fixed: incorrect meta:total on secondary endpoint with filter
2 parents 0adebfd + a2c50e4 commit 56cfe08

File tree

3 files changed

+40
-7
lines changed

3 files changed

+40
-7
lines changed

src/JsonApiDotNetCore/Queries/Internal/QueryLayerComposer.cs

+1-3
Original file line numberDiff line numberDiff line change
@@ -82,13 +82,11 @@ public QueryLayerComposer(IEnumerable<IQueryConstraintProvider> constraintProvid
8282

8383
ExpressionInScope[] constraints = _constraintProviders.SelectMany(provider => provider.GetConstraints()).ToArray();
8484

85-
var secondaryScope = new ResourceFieldChainExpression(hasManyRelationship);
86-
8785
// @formatter:wrap_chained_method_calls chop_always
8886
// @formatter:keep_existing_linebreaks true
8987

9088
FilterExpression[] filtersInSecondaryScope = constraints
91-
.Where(constraint => secondaryScope.Equals(constraint.Scope))
89+
.Where(constraint => constraint.Scope == null)
9290
.Select(constraint => constraint.Expression)
9391
.OfType<FilterExpression>()
9492
.ToArray();

test/JsonApiDotNetCoreTests/IntegrationTests/Meta/SupportTicket.cs

+3
Original file line numberDiff line numberDiff line change
@@ -10,4 +10,7 @@ public sealed class SupportTicket : Identifiable<int>
1010
{
1111
[Attr]
1212
public string Description { get; set; } = null!;
13+
14+
[HasOne]
15+
public ProductFamily? ProductFamily { get; set; }
1316
}

test/JsonApiDotNetCoreTests/IntegrationTests/Meta/TopLevelCountTests.cs

+36-4
Original file line numberDiff line numberDiff line change
@@ -32,19 +32,51 @@ public TopLevelCountTests(IntegrationTestContext<TestableStartup<MetaDbContext>,
3232
}
3333

3434
[Fact]
35-
public async Task Renders_resource_count_for_collection()
35+
public async Task Renders_resource_count_for_primary_resources_endpoint_with_filter()
3636
{
3737
// Arrange
38-
SupportTicket ticket = _fakers.SupportTicket.Generate();
38+
List<SupportTicket> tickets = _fakers.SupportTicket.Generate(2);
39+
40+
tickets[1].Description = "Update firmware version";
3941

4042
await _testContext.RunOnDatabaseAsync(async dbContext =>
4143
{
4244
await dbContext.ClearTableAsync<SupportTicket>();
43-
dbContext.SupportTickets.Add(ticket);
45+
dbContext.SupportTickets.AddRange(tickets);
4446
await dbContext.SaveChangesAsync();
4547
});
4648

47-
const string route = "/supportTickets";
49+
const string route = "/supportTickets?filter=startsWith(description,'Update ')";
50+
51+
// Act
52+
(HttpResponseMessage httpResponse, Document responseDocument) = await _testContext.ExecuteGetAsync<Document>(route);
53+
54+
// Assert
55+
httpResponse.ShouldHaveStatusCode(HttpStatusCode.OK);
56+
57+
responseDocument.Meta.ShouldContainKey("total").With(value =>
58+
{
59+
JsonElement element = value.Should().BeOfType<JsonElement>().Subject;
60+
element.GetInt32().Should().Be(1);
61+
});
62+
}
63+
64+
[Fact]
65+
public async Task Renders_resource_count_for_secondary_resources_endpoint_with_filter()
66+
{
67+
// Arrange
68+
ProductFamily family = _fakers.ProductFamily.Generate();
69+
family.Tickets = _fakers.SupportTicket.Generate(2);
70+
71+
family.Tickets[1].Description = "Update firmware version";
72+
73+
await _testContext.RunOnDatabaseAsync(async dbContext =>
74+
{
75+
dbContext.ProductFamilies.Add(family);
76+
await dbContext.SaveChangesAsync();
77+
});
78+
79+
string route = $"/productFamilies/{family.StringId}/tickets?filter=contains(description,'firmware')";
4880

4981
// Act
5082
(HttpResponseMessage httpResponse, Document responseDocument) = await _testContext.ExecuteGetAsync<Document>(route);

0 commit comments

Comments
 (0)