From 7ac040b62beeb71d6716a027017fcda113c02f8a Mon Sep 17 00:00:00 2001 From: Bart Koelman Date: Wed, 3 Nov 2021 08:14:18 +0100 Subject: [PATCH 1/6] JSON:API spec compliance: do not unescape brackets in response From https://jsonapi.org/format/1.1/#appendix-query-details-square-brackets: > According to the query parameter serialization rules above, a compliant implementation will percent-encode these square brackets. --- .../Serialization/Response/LinkBuilder.cs | 9 ++----- .../PaginationWithTotalCountTests.cs | 27 ++++++++++--------- .../PaginationWithoutTotalCountTests.cs | 12 ++++----- 3 files changed, 22 insertions(+), 26 deletions(-) diff --git a/src/JsonApiDotNetCore/Serialization/Response/LinkBuilder.cs b/src/JsonApiDotNetCore/Serialization/Response/LinkBuilder.cs index e810552d18..50fd7d61e9 100644 --- a/src/JsonApiDotNetCore/Serialization/Response/LinkBuilder.cs +++ b/src/JsonApiDotNetCore/Serialization/Response/LinkBuilder.cs @@ -114,6 +114,7 @@ private bool ShouldIncludeTopLevelLink(LinkTypes linkType, ResourceType? resourc private string GetLinkForTopLevelSelf() { + // Note: in tests, this does not properly escape special characters due to WebApplicationFactory short-circuiting. return _options.UseRelativeLinks ? HttpContext.Request.GetEncodedPathAndQuery() : HttpContext.Request.GetEncodedUrl(); } @@ -223,13 +224,7 @@ private string GetQueryStringInPaginationLink(int pageOffset, string? pageSizeVa parameters[PageNumberParameterName] = pageOffset.ToString(); } - string queryStringValue = QueryString.Create(parameters).Value ?? string.Empty; - return DecodeSpecialCharacters(queryStringValue); - } - - private static string DecodeSpecialCharacters(string uri) - { - return uri.Replace("%5B", "[").Replace("%5D", "]").Replace("%27", "'").Replace("%3A", ":"); + return QueryString.Create(parameters).Value ?? string.Empty; } /// diff --git a/test/JsonApiDotNetCoreTests/IntegrationTests/QueryStrings/Pagination/PaginationWithTotalCountTests.cs b/test/JsonApiDotNetCoreTests/IntegrationTests/QueryStrings/Pagination/PaginationWithTotalCountTests.cs index 34c07fd2fc..eda3a85963 100644 --- a/test/JsonApiDotNetCoreTests/IntegrationTests/QueryStrings/Pagination/PaginationWithTotalCountTests.cs +++ b/test/JsonApiDotNetCoreTests/IntegrationTests/QueryStrings/Pagination/PaginationWithTotalCountTests.cs @@ -65,8 +65,8 @@ await _testContext.RunOnDatabaseAsync(async dbContext => responseDocument.Links.ShouldNotBeNull(); responseDocument.Links.Self.Should().Be($"{HostPrefix}{route}"); - responseDocument.Links.First.Should().Be($"{HostPrefix}/blogPosts?page[size]=1"); - responseDocument.Links.Last.Should().Be(responseDocument.Links.Self); + responseDocument.Links.First.Should().Be($"{HostPrefix}/blogPosts?page%5Bsize%5D=1"); + responseDocument.Links.Last.Should().Be($"{HostPrefix}/blogPosts?page%5Bnumber%5D=2&page%5Bsize%5D=1"); responseDocument.Links.Prev.Should().Be(responseDocument.Links.First); responseDocument.Links.Next.Should().BeNull(); } @@ -127,10 +127,10 @@ await _testContext.RunOnDatabaseAsync(async dbContext => responseDocument.Links.ShouldNotBeNull(); responseDocument.Links.Self.Should().Be($"{HostPrefix}{route}"); - responseDocument.Links.First.Should().Be($"{HostPrefix}/blogs/{blog.StringId}/posts?page[size]=1"); + responseDocument.Links.First.Should().Be($"{HostPrefix}/blogs/{blog.StringId}/posts?page%5Bsize%5D=1"); responseDocument.Links.Last.Should().BeNull(); responseDocument.Links.Prev.Should().Be(responseDocument.Links.First); - responseDocument.Links.Next.Should().Be($"{HostPrefix}/blogs/{blog.StringId}/posts?page[number]=3&page[size]=1"); + responseDocument.Links.Next.Should().Be($"{HostPrefix}/blogs/{blog.StringId}/posts?page%5Bnumber%5D=3&page%5Bsize%5D=1"); } [Fact] @@ -194,8 +194,8 @@ await _testContext.RunOnDatabaseAsync(async dbContext => responseDocument.Links.ShouldNotBeNull(); responseDocument.Links.Self.Should().Be($"{HostPrefix}{route}"); - responseDocument.Links.First.Should().Be($"{HostPrefix}/blogs?include=posts&page[size]=2,posts:1"); - responseDocument.Links.Last.Should().Be($"{HostPrefix}/blogs?include=posts&page[number]=2&page[size]=2,posts:1"); + responseDocument.Links.First.Should().Be($"{HostPrefix}/blogs?include=posts&page%5Bsize%5D=2,posts%3A1"); + responseDocument.Links.Last.Should().Be($"{HostPrefix}/blogs?include=posts&page%5Bnumber%5D=2&page%5Bsize%5D=2,posts%3A1"); responseDocument.Links.Prev.Should().BeNull(); responseDocument.Links.Next.Should().Be(responseDocument.Links.Last); } @@ -260,7 +260,7 @@ await _testContext.RunOnDatabaseAsync(async dbContext => responseDocument.Links.ShouldNotBeNull(); responseDocument.Links.Self.Should().Be($"{HostPrefix}{route}"); - responseDocument.Links.First.Should().Be($"{HostPrefix}/blogs/{blog.StringId}/relationships/posts?page[size]=1"); + responseDocument.Links.First.Should().Be($"{HostPrefix}/blogs/{blog.StringId}/relationships/posts?page%5Bsize%5D=1"); responseDocument.Links.Last.Should().BeNull(); responseDocument.Links.Prev.Should().Be(responseDocument.Links.First); responseDocument.Links.Next.Should().BeNull(); @@ -302,7 +302,7 @@ await _testContext.RunOnDatabaseAsync(async dbContext => responseDocument.Links.ShouldNotBeNull(); responseDocument.Links.Self.Should().Be($"{HostPrefix}{route}"); - responseDocument.Links.First.Should().Be($"{HostPrefix}/blogPosts?include=labels&page[size]=labels:1"); + responseDocument.Links.First.Should().Be($"{HostPrefix}/blogPosts?include=labels&page%5Bsize%5D=labels%3A1"); responseDocument.Links.Last.Should().Be(responseDocument.Links.First); responseDocument.Links.Prev.Should().BeNull(); responseDocument.Links.Next.Should().BeNull(); @@ -335,7 +335,7 @@ await _testContext.RunOnDatabaseAsync(async dbContext => responseDocument.Links.ShouldNotBeNull(); responseDocument.Links.Self.Should().Be($"{HostPrefix}{route}"); - responseDocument.Links.First.Should().Be($"{HostPrefix}/blogPosts/{post.StringId}/relationships/labels?page[size]=1"); + responseDocument.Links.First.Should().Be($"{HostPrefix}/blogPosts/{post.StringId}/relationships/labels?page%5Bsize%5D=1"); responseDocument.Links.Last.Should().BeNull(); responseDocument.Links.Prev.Should().Be(responseDocument.Links.First); responseDocument.Links.Next.Should().BeNull(); @@ -384,8 +384,8 @@ await _testContext.RunOnDatabaseAsync(async dbContext => responseDocument.Links.ShouldNotBeNull(); responseDocument.Links.Self.Should().Be($"{HostPrefix}{route}"); - responseDocument.Links.First.Should().Be($"{linkPrefix}&page[size]=1,owner.posts:1,owner.posts.comments:1"); - responseDocument.Links.Last.Should().Be($"{linkPrefix}&page[size]=1,owner.posts:1,owner.posts.comments:1&page[number]=2"); + responseDocument.Links.First.Should().Be($"{linkPrefix}&page%5Bsize%5D=1,owner.posts%3A1,owner.posts.comments%3A1"); + responseDocument.Links.Last.Should().Be($"{linkPrefix}&page%5Bsize%5D=1,owner.posts%3A1,owner.posts.comments%3A1&page%5Bnumber%5D=2"); responseDocument.Links.Prev.Should().Be(responseDocument.Links.First); responseDocument.Links.Next.Should().BeNull(); } @@ -467,7 +467,7 @@ await _testContext.RunOnDatabaseAsync(async dbContext => responseDocument.Links.First.Should().Be(responseDocument.Links.Self); responseDocument.Links.Last.Should().BeNull(); responseDocument.Links.Prev.Should().BeNull(); - responseDocument.Links.Next.Should().Be($"{HostPrefix}/blogs/{blog.StringId}/posts?page[number]=2"); + responseDocument.Links.Next.Should().Be($"{HostPrefix}/blogs/{blog.StringId}/posts?page%5Bnumber%5D=2"); } [Fact] @@ -587,7 +587,8 @@ await _testContext.RunOnDatabaseAsync(async dbContext => static string SetPageNumberInUrl(string url, int pageNumber) { - return pageNumber != 1 ? $"{url}&page[number]={pageNumber}" : url; + string link = pageNumber != 1 ? $"{url}&page[number]={pageNumber}" : url; + return link.Replace("[", "%5B").Replace("]", "%5D").Replace("'", "%27"); } } } diff --git a/test/JsonApiDotNetCoreTests/IntegrationTests/QueryStrings/Pagination/PaginationWithoutTotalCountTests.cs b/test/JsonApiDotNetCoreTests/IntegrationTests/QueryStrings/Pagination/PaginationWithoutTotalCountTests.cs index cffa5287b7..e62caf04eb 100644 --- a/test/JsonApiDotNetCoreTests/IntegrationTests/QueryStrings/Pagination/PaginationWithoutTotalCountTests.cs +++ b/test/JsonApiDotNetCoreTests/IntegrationTests/QueryStrings/Pagination/PaginationWithoutTotalCountTests.cs @@ -78,7 +78,7 @@ await _testContext.RunOnDatabaseAsync(async dbContext => responseDocument.Links.ShouldNotBeNull(); responseDocument.Links.Self.Should().Be($"{HostPrefix}{route}"); - responseDocument.Links.First.Should().Be($"{HostPrefix}{route}"); + responseDocument.Links.First.Should().Be($"{HostPrefix}/blogPosts?page%5Bsize%5D=8&foo=bar"); responseDocument.Links.Last.Should().BeNull(); responseDocument.Links.Prev.Should().BeNull(); responseDocument.Links.Next.Should().BeNull(); @@ -137,7 +137,7 @@ await _testContext.RunOnDatabaseAsync(async dbContext => responseDocument.Links.Self.Should().Be($"{HostPrefix}{route}"); responseDocument.Links.First.Should().Be($"{HostPrefix}/blogPosts?foo=bar"); responseDocument.Links.Last.Should().BeNull(); - responseDocument.Links.Prev.Should().Be($"{HostPrefix}/blogPosts?foo=bar&page[number]=2"); + responseDocument.Links.Prev.Should().Be($"{HostPrefix}/blogPosts?foo=bar&page%5Bnumber%5D=2"); responseDocument.Links.Next.Should().BeNull(); } @@ -168,8 +168,8 @@ await _testContext.RunOnDatabaseAsync(async dbContext => responseDocument.Links.Self.Should().Be($"{HostPrefix}{route}"); responseDocument.Links.First.Should().Be($"{HostPrefix}/blogPosts?foo=bar"); responseDocument.Links.Last.Should().BeNull(); - responseDocument.Links.Prev.Should().Be($"{HostPrefix}/blogPosts?page[number]=2&foo=bar"); - responseDocument.Links.Next.Should().Be($"{HostPrefix}/blogPosts?page[number]=4&foo=bar"); + responseDocument.Links.Prev.Should().Be($"{HostPrefix}/blogPosts?page%5Bnumber%5D=2&foo=bar"); + responseDocument.Links.Next.Should().Be($"{HostPrefix}/blogPosts?page%5Bnumber%5D=4&foo=bar"); } [Fact] @@ -199,8 +199,8 @@ await _testContext.RunOnDatabaseAsync(async dbContext => responseDocument.Links.Self.Should().Be($"{HostPrefix}{route}"); responseDocument.Links.First.Should().Be($"{HostPrefix}/webAccounts/{account.StringId}/posts?foo=bar"); responseDocument.Links.Last.Should().BeNull(); - responseDocument.Links.Prev.Should().Be($"{HostPrefix}/webAccounts/{account.StringId}/posts?page[number]=2&foo=bar"); - responseDocument.Links.Next.Should().Be($"{HostPrefix}/webAccounts/{account.StringId}/posts?page[number]=4&foo=bar"); + responseDocument.Links.Prev.Should().Be($"{HostPrefix}/webAccounts/{account.StringId}/posts?page%5Bnumber%5D=2&foo=bar"); + responseDocument.Links.Next.Should().Be($"{HostPrefix}/webAccounts/{account.StringId}/posts?page%5Bnumber%5D=4&foo=bar"); } } } From 3ddac8c8d74819012e5b2b3977af29365e3751ca Mon Sep 17 00:00:00 2001 From: Bart Koelman Date: Wed, 3 Nov 2021 11:45:28 +0100 Subject: [PATCH 2/6] Updated existing IResourceDefinition tests to capture all relevant callbacks --- .../TelevisionBroadcastDefinition.cs | 4 +- ...reateResourceWithClientGeneratedIdTests.cs | 2 + ...mplicitlyChangingTextLanguageDefinition.cs | 9 +- .../Meta/AtomicResourceMetaTests.cs | 6 +- .../Meta/AtomicResponseMetaTests.cs | 1 + .../Meta/MusicTrackMetaDefinition.cs | 10 +- .../Meta/TextLanguageMetaDefinition.cs | 9 +- .../Mixed/AtomicSerializationTests.cs | 2 + ...micSerializationResourceDefinitionTests.cs | 16 +- .../Serialization/RecordCompanyDefinition.cs | 12 +- ...icSparseFieldSetResourceDefinitionTests.cs | 16 +- .../SparseFieldSets/LyricTextDefinition.cs | 15 +- .../Resources/AtomicUpdateResourceTests.cs | 2 + .../HitCountingResourceDefinition.cs | 197 ++++++++++++++++++ .../Meta/ResourceMetaTests.cs | 8 +- .../Meta/SupportTicketDefinition.cs | 12 +- .../FireForgetGroupDefinition.cs | 10 +- .../FireForgetTests.Group.cs | 56 ++--- .../FireForgetTests.User.cs | 76 +++---- .../FireAndForgetDelivery/FireForgetTests.cs | 6 +- .../FireForgetUserDefinition.cs | 10 +- .../Microservices/MessagingGroupDefinition.cs | 24 +-- .../Microservices/MessagingUserDefinition.cs | 22 +- .../OutboxGroupDefinition.cs | 8 +- .../OutboxTests.Group.cs | 47 +++-- .../OutboxTests.User.cs | 65 +++--- .../TransactionalOutboxPattern/OutboxTests.cs | 4 +- .../OutboxUserDefinition.cs | 8 +- .../ResourceDefinitionExtensibilityPoint.cs | 39 ++++ .../ResourceDefinitionHitCounter.cs | 26 +-- .../Reading/MoonDefinition.cs | 12 +- .../Reading/PlanetDefinition.cs | 13 +- .../Reading/ResourceDefinitionReadTests.cs | 180 +++++++++++----- .../Reading/StarDefinition.cs | 15 +- .../ResourceDefinitionSerializationTests.cs | 36 ++-- .../Serialization/StudentDefinition.cs | 13 +- 36 files changed, 643 insertions(+), 348 deletions(-) create mode 100644 test/JsonApiDotNetCoreTests/IntegrationTests/HitCountingResourceDefinition.cs create mode 100644 test/JsonApiDotNetCoreTests/IntegrationTests/ResourceDefinitionExtensibilityPoint.cs diff --git a/test/JsonApiDotNetCoreTests/IntegrationTests/Archiving/TelevisionBroadcastDefinition.cs b/test/JsonApiDotNetCoreTests/IntegrationTests/Archiving/TelevisionBroadcastDefinition.cs index 2cb9d2a4a6..fdf13c8f86 100644 --- a/test/JsonApiDotNetCoreTests/IntegrationTests/Archiving/TelevisionBroadcastDefinition.cs +++ b/test/JsonApiDotNetCoreTests/IntegrationTests/Archiving/TelevisionBroadcastDefinition.cs @@ -52,7 +52,7 @@ public TelevisionBroadcastDefinition(IResourceGraph resourceGraph, TelevisionDbC } } - return base.OnApplyFilter(existingFilter); + return existingFilter; } private bool IsReturningCollectionOfTelevisionBroadcasts() @@ -119,7 +119,7 @@ public override Task OnPrepareWriteAsync(TelevisionBroadcast broadcast, WriteOpe _storedArchivedAt = broadcast.ArchivedAt; } - return base.OnPrepareWriteAsync(broadcast, writeOperation, cancellationToken); + return Task.CompletedTask; } public override async Task OnWritingAsync(TelevisionBroadcast broadcast, WriteOperationKind writeOperation, CancellationToken cancellationToken) diff --git a/test/JsonApiDotNetCoreTests/IntegrationTests/AtomicOperations/Creating/AtomicCreateResourceWithClientGeneratedIdTests.cs b/test/JsonApiDotNetCoreTests/IntegrationTests/AtomicOperations/Creating/AtomicCreateResourceWithClientGeneratedIdTests.cs index 8932b1e635..cc663f92f8 100644 --- a/test/JsonApiDotNetCoreTests/IntegrationTests/AtomicOperations/Creating/AtomicCreateResourceWithClientGeneratedIdTests.cs +++ b/test/JsonApiDotNetCoreTests/IntegrationTests/AtomicOperations/Creating/AtomicCreateResourceWithClientGeneratedIdTests.cs @@ -29,6 +29,8 @@ public AtomicCreateResourceWithClientGeneratedIdTests(IntegrationTestContext { services.AddResourceDefinition(); + + services.AddSingleton(); }); var options = (JsonApiOptions)testContext.Factory.Services.GetRequiredService(); diff --git a/test/JsonApiDotNetCoreTests/IntegrationTests/AtomicOperations/ImplicitlyChangingTextLanguageDefinition.cs b/test/JsonApiDotNetCoreTests/IntegrationTests/AtomicOperations/ImplicitlyChangingTextLanguageDefinition.cs index 3f5aadc2b3..ec80bc14b8 100644 --- a/test/JsonApiDotNetCoreTests/IntegrationTests/AtomicOperations/ImplicitlyChangingTextLanguageDefinition.cs +++ b/test/JsonApiDotNetCoreTests/IntegrationTests/AtomicOperations/ImplicitlyChangingTextLanguageDefinition.cs @@ -4,7 +4,6 @@ using JetBrains.Annotations; using JsonApiDotNetCore.Configuration; using JsonApiDotNetCore.Middleware; -using JsonApiDotNetCore.Resources; using Microsoft.EntityFrameworkCore; namespace JsonApiDotNetCoreTests.IntegrationTests.AtomicOperations @@ -13,20 +12,22 @@ namespace JsonApiDotNetCoreTests.IntegrationTests.AtomicOperations /// Used to simulate side effects that occur in the database while saving, typically caused by database triggers. /// [UsedImplicitly(ImplicitUseKindFlags.InstantiatedNoFixedConstructorSignature)] - public class ImplicitlyChangingTextLanguageDefinition : JsonApiResourceDefinition + public class ImplicitlyChangingTextLanguageDefinition : HitCountingResourceDefinition { internal const string Suffix = " (changed)"; private readonly OperationsDbContext _dbContext; - public ImplicitlyChangingTextLanguageDefinition(IResourceGraph resourceGraph, OperationsDbContext dbContext) - : base(resourceGraph) + public ImplicitlyChangingTextLanguageDefinition(IResourceGraph resourceGraph, ResourceDefinitionHitCounter hitCounter, OperationsDbContext dbContext) + : base(resourceGraph, hitCounter) { _dbContext = dbContext; } public override async Task OnWriteSucceededAsync(TextLanguage resource, WriteOperationKind writeOperation, CancellationToken cancellationToken) { + await base.OnWriteSucceededAsync(resource, writeOperation, cancellationToken); + if (writeOperation is not WriteOperationKind.DeleteResource) { string statement = $"Update \"TextLanguages\" SET \"IsoCode\" = '{resource.IsoCode}{Suffix}' WHERE \"Id\" = '{resource.StringId}'"; diff --git a/test/JsonApiDotNetCoreTests/IntegrationTests/AtomicOperations/Meta/AtomicResourceMetaTests.cs b/test/JsonApiDotNetCoreTests/IntegrationTests/AtomicOperations/Meta/AtomicResourceMetaTests.cs index c4fe7fcaa7..25f1d442c9 100644 --- a/test/JsonApiDotNetCoreTests/IntegrationTests/AtomicOperations/Meta/AtomicResourceMetaTests.cs +++ b/test/JsonApiDotNetCoreTests/IntegrationTests/AtomicOperations/Meta/AtomicResourceMetaTests.cs @@ -111,8 +111,8 @@ public async Task Returns_resource_meta_in_create_resource_with_side_effects() hitCounter.HitExtensibilityPoints.Should().BeEquivalentTo(new[] { - (typeof(MusicTrack), ResourceDefinitionHitCounter.ExtensibilityPoint.GetMeta), - (typeof(MusicTrack), ResourceDefinitionHitCounter.ExtensibilityPoint.GetMeta) + (typeof(MusicTrack), ResourceDefinitionExtensibilityPoint.GetMeta), + (typeof(MusicTrack), ResourceDefinitionExtensibilityPoint.GetMeta) }, options => options.WithStrictOrdering()); } @@ -172,7 +172,7 @@ await _testContext.RunOnDatabaseAsync(async dbContext => hitCounter.HitExtensibilityPoints.Should().BeEquivalentTo(new[] { - (typeof(TextLanguage), ResourceDefinitionHitCounter.ExtensibilityPoint.GetMeta) + (typeof(TextLanguage), ResourceDefinitionExtensibilityPoint.GetMeta) }, options => options.WithStrictOrdering()); } } diff --git a/test/JsonApiDotNetCoreTests/IntegrationTests/AtomicOperations/Meta/AtomicResponseMetaTests.cs b/test/JsonApiDotNetCoreTests/IntegrationTests/AtomicOperations/Meta/AtomicResponseMetaTests.cs index 103dc746f5..5f74d971fa 100644 --- a/test/JsonApiDotNetCoreTests/IntegrationTests/AtomicOperations/Meta/AtomicResponseMetaTests.cs +++ b/test/JsonApiDotNetCoreTests/IntegrationTests/AtomicOperations/Meta/AtomicResponseMetaTests.cs @@ -28,6 +28,7 @@ public AtomicResponseMetaTests(IntegrationTestContext(); + services.AddSingleton(); services.AddSingleton(); }); } diff --git a/test/JsonApiDotNetCoreTests/IntegrationTests/AtomicOperations/Meta/MusicTrackMetaDefinition.cs b/test/JsonApiDotNetCoreTests/IntegrationTests/AtomicOperations/Meta/MusicTrackMetaDefinition.cs index 1ee27009e1..827e37cb51 100644 --- a/test/JsonApiDotNetCoreTests/IntegrationTests/AtomicOperations/Meta/MusicTrackMetaDefinition.cs +++ b/test/JsonApiDotNetCoreTests/IntegrationTests/AtomicOperations/Meta/MusicTrackMetaDefinition.cs @@ -2,24 +2,22 @@ using System.Collections.Generic; using JetBrains.Annotations; using JsonApiDotNetCore.Configuration; -using JsonApiDotNetCore.Resources; namespace JsonApiDotNetCoreTests.IntegrationTests.AtomicOperations.Meta { [UsedImplicitly(ImplicitUseKindFlags.InstantiatedNoFixedConstructorSignature)] - public sealed class MusicTrackMetaDefinition : JsonApiResourceDefinition + public sealed class MusicTrackMetaDefinition : HitCountingResourceDefinition { - private readonly ResourceDefinitionHitCounter _hitCounter; + protected override ResourceDefinitionExtensibilityPoint ExtensibilityPointsToTrack => ResourceDefinitionExtensibilityPoint.GetMeta; public MusicTrackMetaDefinition(IResourceGraph resourceGraph, ResourceDefinitionHitCounter hitCounter) - : base(resourceGraph) + : base(resourceGraph, hitCounter) { - _hitCounter = hitCounter; } public override IDictionary GetMeta(MusicTrack resource) { - _hitCounter.TrackInvocation(ResourceDefinitionHitCounter.ExtensibilityPoint.GetMeta); + base.GetMeta(resource); return new Dictionary { diff --git a/test/JsonApiDotNetCoreTests/IntegrationTests/AtomicOperations/Meta/TextLanguageMetaDefinition.cs b/test/JsonApiDotNetCoreTests/IntegrationTests/AtomicOperations/Meta/TextLanguageMetaDefinition.cs index bb9f9ec006..cc89eaf576 100644 --- a/test/JsonApiDotNetCoreTests/IntegrationTests/AtomicOperations/Meta/TextLanguageMetaDefinition.cs +++ b/test/JsonApiDotNetCoreTests/IntegrationTests/AtomicOperations/Meta/TextLanguageMetaDefinition.cs @@ -9,17 +9,16 @@ public sealed class TextLanguageMetaDefinition : ImplicitlyChangingTextLanguageD { internal const string NoticeText = "See https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes for ISO 639-1 language codes."; - private readonly ResourceDefinitionHitCounter _hitCounter; + protected override ResourceDefinitionExtensibilityPoint ExtensibilityPointsToTrack => ResourceDefinitionExtensibilityPoint.GetMeta; - public TextLanguageMetaDefinition(IResourceGraph resourceGraph, OperationsDbContext dbContext, ResourceDefinitionHitCounter hitCounter) - : base(resourceGraph, dbContext) + public TextLanguageMetaDefinition(IResourceGraph resourceGraph, ResourceDefinitionHitCounter hitCounter, OperationsDbContext dbContext) + : base(resourceGraph, hitCounter, dbContext) { - _hitCounter = hitCounter; } public override IDictionary GetMeta(TextLanguage resource) { - _hitCounter.TrackInvocation(ResourceDefinitionHitCounter.ExtensibilityPoint.GetMeta); + base.GetMeta(resource); return new Dictionary { diff --git a/test/JsonApiDotNetCoreTests/IntegrationTests/AtomicOperations/Mixed/AtomicSerializationTests.cs b/test/JsonApiDotNetCoreTests/IntegrationTests/AtomicOperations/Mixed/AtomicSerializationTests.cs index f034fb9411..358bb9935d 100644 --- a/test/JsonApiDotNetCoreTests/IntegrationTests/AtomicOperations/Mixed/AtomicSerializationTests.cs +++ b/test/JsonApiDotNetCoreTests/IntegrationTests/AtomicOperations/Mixed/AtomicSerializationTests.cs @@ -27,6 +27,8 @@ public AtomicSerializationTests(IntegrationTestContext { services.AddResourceDefinition(); + + services.AddSingleton(); }); var options = (JsonApiOptions)testContext.Factory.Services.GetRequiredService(); diff --git a/test/JsonApiDotNetCoreTests/IntegrationTests/AtomicOperations/ResourceDefinitions/Serialization/AtomicSerializationResourceDefinitionTests.cs b/test/JsonApiDotNetCoreTests/IntegrationTests/AtomicOperations/ResourceDefinitions/Serialization/AtomicSerializationResourceDefinitionTests.cs index c608be732d..1a1a3da22d 100644 --- a/test/JsonApiDotNetCoreTests/IntegrationTests/AtomicOperations/ResourceDefinitions/Serialization/AtomicSerializationResourceDefinitionTests.cs +++ b/test/JsonApiDotNetCoreTests/IntegrationTests/AtomicOperations/ResourceDefinitions/Serialization/AtomicSerializationResourceDefinitionTests.cs @@ -123,10 +123,10 @@ await _testContext.RunOnDatabaseAsync(async dbContext => hitCounter.HitExtensibilityPoints.Should().BeEquivalentTo(new[] { - (typeof(RecordCompany), ResourceDefinitionHitCounter.ExtensibilityPoint.OnDeserialize), - (typeof(RecordCompany), ResourceDefinitionHitCounter.ExtensibilityPoint.OnDeserialize), - (typeof(RecordCompany), ResourceDefinitionHitCounter.ExtensibilityPoint.OnSerialize), - (typeof(RecordCompany), ResourceDefinitionHitCounter.ExtensibilityPoint.OnSerialize) + (typeof(RecordCompany), ResourceDefinitionExtensibilityPoint.OnDeserialize), + (typeof(RecordCompany), ResourceDefinitionExtensibilityPoint.OnDeserialize), + (typeof(RecordCompany), ResourceDefinitionExtensibilityPoint.OnSerialize), + (typeof(RecordCompany), ResourceDefinitionExtensibilityPoint.OnSerialize) }, options => options.WithStrictOrdering()); } @@ -275,10 +275,10 @@ await _testContext.RunOnDatabaseAsync(async dbContext => hitCounter.HitExtensibilityPoints.Should().BeEquivalentTo(new[] { - (typeof(RecordCompany), ResourceDefinitionHitCounter.ExtensibilityPoint.OnDeserialize), - (typeof(RecordCompany), ResourceDefinitionHitCounter.ExtensibilityPoint.OnDeserialize), - (typeof(RecordCompany), ResourceDefinitionHitCounter.ExtensibilityPoint.OnSerialize), - (typeof(RecordCompany), ResourceDefinitionHitCounter.ExtensibilityPoint.OnSerialize) + (typeof(RecordCompany), ResourceDefinitionExtensibilityPoint.OnDeserialize), + (typeof(RecordCompany), ResourceDefinitionExtensibilityPoint.OnDeserialize), + (typeof(RecordCompany), ResourceDefinitionExtensibilityPoint.OnSerialize), + (typeof(RecordCompany), ResourceDefinitionExtensibilityPoint.OnSerialize) }, options => options.WithStrictOrdering()); } diff --git a/test/JsonApiDotNetCoreTests/IntegrationTests/AtomicOperations/ResourceDefinitions/Serialization/RecordCompanyDefinition.cs b/test/JsonApiDotNetCoreTests/IntegrationTests/AtomicOperations/ResourceDefinitions/Serialization/RecordCompanyDefinition.cs index fed5e96b21..8f40683f22 100644 --- a/test/JsonApiDotNetCoreTests/IntegrationTests/AtomicOperations/ResourceDefinitions/Serialization/RecordCompanyDefinition.cs +++ b/test/JsonApiDotNetCoreTests/IntegrationTests/AtomicOperations/ResourceDefinitions/Serialization/RecordCompanyDefinition.cs @@ -1,23 +1,21 @@ using JetBrains.Annotations; using JsonApiDotNetCore.Configuration; -using JsonApiDotNetCore.Resources; namespace JsonApiDotNetCoreTests.IntegrationTests.AtomicOperations.ResourceDefinitions.Serialization { [UsedImplicitly(ImplicitUseKindFlags.InstantiatedNoFixedConstructorSignature)] - public sealed class RecordCompanyDefinition : JsonApiResourceDefinition + public sealed class RecordCompanyDefinition : HitCountingResourceDefinition { - private readonly ResourceDefinitionHitCounter _hitCounter; + protected override ResourceDefinitionExtensibilityPoint ExtensibilityPointsToTrack => ResourceDefinitionExtensibilityPoint.Serialization; public RecordCompanyDefinition(IResourceGraph resourceGraph, ResourceDefinitionHitCounter hitCounter) - : base(resourceGraph) + : base(resourceGraph, hitCounter) { - _hitCounter = hitCounter; } public override void OnDeserialize(RecordCompany resource) { - _hitCounter.TrackInvocation(ResourceDefinitionHitCounter.ExtensibilityPoint.OnDeserialize); + base.OnDeserialize(resource); if (!string.IsNullOrEmpty(resource.Name)) { @@ -27,7 +25,7 @@ public override void OnDeserialize(RecordCompany resource) public override void OnSerialize(RecordCompany resource) { - _hitCounter.TrackInvocation(ResourceDefinitionHitCounter.ExtensibilityPoint.OnSerialize); + base.OnSerialize(resource); if (!string.IsNullOrEmpty(resource.CountryOfResidence)) { diff --git a/test/JsonApiDotNetCoreTests/IntegrationTests/AtomicOperations/ResourceDefinitions/SparseFieldSets/AtomicSparseFieldSetResourceDefinitionTests.cs b/test/JsonApiDotNetCoreTests/IntegrationTests/AtomicOperations/ResourceDefinitions/SparseFieldSets/AtomicSparseFieldSetResourceDefinitionTests.cs index 297fdbf5c1..447081061d 100644 --- a/test/JsonApiDotNetCoreTests/IntegrationTests/AtomicOperations/ResourceDefinitions/SparseFieldSets/AtomicSparseFieldSetResourceDefinitionTests.cs +++ b/test/JsonApiDotNetCoreTests/IntegrationTests/AtomicOperations/ResourceDefinitions/SparseFieldSets/AtomicSparseFieldSetResourceDefinitionTests.cs @@ -105,10 +105,10 @@ public async Task Hides_text_in_create_resource_with_side_effects() hitCounter.HitExtensibilityPoints.Should().BeEquivalentTo(new[] { - (typeof(Lyric), ResourceDefinitionHitCounter.ExtensibilityPoint.OnApplySparseFieldSet), - (typeof(Lyric), ResourceDefinitionHitCounter.ExtensibilityPoint.OnApplySparseFieldSet), - (typeof(Lyric), ResourceDefinitionHitCounter.ExtensibilityPoint.OnApplySparseFieldSet), - (typeof(Lyric), ResourceDefinitionHitCounter.ExtensibilityPoint.OnApplySparseFieldSet) + (typeof(Lyric), ResourceDefinitionExtensibilityPoint.OnApplySparseFieldSet), + (typeof(Lyric), ResourceDefinitionExtensibilityPoint.OnApplySparseFieldSet), + (typeof(Lyric), ResourceDefinitionExtensibilityPoint.OnApplySparseFieldSet), + (typeof(Lyric), ResourceDefinitionExtensibilityPoint.OnApplySparseFieldSet) }, options => options.WithStrictOrdering()); } @@ -184,10 +184,10 @@ await _testContext.RunOnDatabaseAsync(async dbContext => hitCounter.HitExtensibilityPoints.Should().BeEquivalentTo(new[] { - (typeof(Lyric), ResourceDefinitionHitCounter.ExtensibilityPoint.OnApplySparseFieldSet), - (typeof(Lyric), ResourceDefinitionHitCounter.ExtensibilityPoint.OnApplySparseFieldSet), - (typeof(Lyric), ResourceDefinitionHitCounter.ExtensibilityPoint.OnApplySparseFieldSet), - (typeof(Lyric), ResourceDefinitionHitCounter.ExtensibilityPoint.OnApplySparseFieldSet) + (typeof(Lyric), ResourceDefinitionExtensibilityPoint.OnApplySparseFieldSet), + (typeof(Lyric), ResourceDefinitionExtensibilityPoint.OnApplySparseFieldSet), + (typeof(Lyric), ResourceDefinitionExtensibilityPoint.OnApplySparseFieldSet), + (typeof(Lyric), ResourceDefinitionExtensibilityPoint.OnApplySparseFieldSet) }, options => options.WithStrictOrdering()); } } diff --git a/test/JsonApiDotNetCoreTests/IntegrationTests/AtomicOperations/ResourceDefinitions/SparseFieldSets/LyricTextDefinition.cs b/test/JsonApiDotNetCoreTests/IntegrationTests/AtomicOperations/ResourceDefinitions/SparseFieldSets/LyricTextDefinition.cs index 7b41cd1545..8b8949f6ec 100644 --- a/test/JsonApiDotNetCoreTests/IntegrationTests/AtomicOperations/ResourceDefinitions/SparseFieldSets/LyricTextDefinition.cs +++ b/test/JsonApiDotNetCoreTests/IntegrationTests/AtomicOperations/ResourceDefinitions/SparseFieldSets/LyricTextDefinition.cs @@ -1,30 +1,27 @@ using JetBrains.Annotations; using JsonApiDotNetCore.Configuration; using JsonApiDotNetCore.Queries.Expressions; -using JsonApiDotNetCore.Resources; namespace JsonApiDotNetCoreTests.IntegrationTests.AtomicOperations.ResourceDefinitions.SparseFieldSets { [UsedImplicitly(ImplicitUseKindFlags.InstantiatedNoFixedConstructorSignature)] - public sealed class LyricTextDefinition : JsonApiResourceDefinition + public sealed class LyricTextDefinition : HitCountingResourceDefinition { private readonly LyricPermissionProvider _lyricPermissionProvider; - private readonly ResourceDefinitionHitCounter _hitCounter; + + protected override ResourceDefinitionExtensibilityPoint ExtensibilityPointsToTrack => ResourceDefinitionExtensibilityPoint.OnApplySparseFieldSet; public LyricTextDefinition(IResourceGraph resourceGraph, LyricPermissionProvider lyricPermissionProvider, ResourceDefinitionHitCounter hitCounter) - : base(resourceGraph) + : base(resourceGraph, hitCounter) { _lyricPermissionProvider = lyricPermissionProvider; - _hitCounter = hitCounter; } public override SparseFieldSetExpression? OnApplySparseFieldSet(SparseFieldSetExpression? existingSparseFieldSet) { - _hitCounter.TrackInvocation(ResourceDefinitionHitCounter.ExtensibilityPoint.OnApplySparseFieldSet); + base.OnApplySparseFieldSet(existingSparseFieldSet); - return _lyricPermissionProvider.CanViewText - ? base.OnApplySparseFieldSet(existingSparseFieldSet) - : existingSparseFieldSet.Excluding(lyric => lyric.Text, ResourceGraph); + return _lyricPermissionProvider.CanViewText ? existingSparseFieldSet : existingSparseFieldSet.Excluding(lyric => lyric.Text, ResourceGraph); } } } diff --git a/test/JsonApiDotNetCoreTests/IntegrationTests/AtomicOperations/Updating/Resources/AtomicUpdateResourceTests.cs b/test/JsonApiDotNetCoreTests/IntegrationTests/AtomicOperations/Updating/Resources/AtomicUpdateResourceTests.cs index f7dca8b732..783bacf575 100644 --- a/test/JsonApiDotNetCoreTests/IntegrationTests/AtomicOperations/Updating/Resources/AtomicUpdateResourceTests.cs +++ b/test/JsonApiDotNetCoreTests/IntegrationTests/AtomicOperations/Updating/Resources/AtomicUpdateResourceTests.cs @@ -32,6 +32,8 @@ public AtomicUpdateResourceTests(IntegrationTestContext { services.AddResourceDefinition(); + + services.AddSingleton(); }); var options = (JsonApiOptions)testContext.Factory.Services.GetRequiredService(); diff --git a/test/JsonApiDotNetCoreTests/IntegrationTests/HitCountingResourceDefinition.cs b/test/JsonApiDotNetCoreTests/IntegrationTests/HitCountingResourceDefinition.cs new file mode 100644 index 0000000000..5e3fb239f5 --- /dev/null +++ b/test/JsonApiDotNetCoreTests/IntegrationTests/HitCountingResourceDefinition.cs @@ -0,0 +1,197 @@ +using System.Collections.Generic; +using System.Collections.Immutable; +using System.Threading; +using System.Threading.Tasks; +using JsonApiDotNetCore; +using JsonApiDotNetCore.Configuration; +using JsonApiDotNetCore.Middleware; +using JsonApiDotNetCore.Queries.Expressions; +using JsonApiDotNetCore.Resources; +using JsonApiDotNetCore.Resources.Annotations; + +namespace JsonApiDotNetCoreTests.IntegrationTests +{ + /// + /// Tracks invocations on callback methods. This is used solely in our tests, so we can assert which + /// calls were made, and in which order. + /// + public abstract class HitCountingResourceDefinition : JsonApiResourceDefinition + where TResource : class, IIdentifiable + { + private readonly ResourceDefinitionHitCounter _hitCounter; + + protected virtual ResourceDefinitionExtensibilityPoint ExtensibilityPointsToTrack => ResourceDefinitionExtensibilityPoint.All; + + protected HitCountingResourceDefinition(IResourceGraph resourceGraph, ResourceDefinitionHitCounter hitCounter) + : base(resourceGraph) + { + ArgumentGuard.NotNull(hitCounter, nameof(hitCounter)); + + _hitCounter = hitCounter; + } + + public override IImmutableSet OnApplyIncludes(IImmutableSet existingIncludes) + { + if (ExtensibilityPointsToTrack.HasFlag(ResourceDefinitionExtensibilityPoint.OnApplyIncludes)) + { + _hitCounter.TrackInvocation(ResourceDefinitionExtensibilityPoint.OnApplyIncludes); + } + + return base.OnApplyIncludes(existingIncludes); + } + + public override FilterExpression? OnApplyFilter(FilterExpression? existingFilter) + { + if (ExtensibilityPointsToTrack.HasFlag(ResourceDefinitionExtensibilityPoint.OnApplyFilter)) + { + _hitCounter.TrackInvocation(ResourceDefinitionExtensibilityPoint.OnApplyFilter); + } + + return base.OnApplyFilter(existingFilter); + } + + public override SortExpression? OnApplySort(SortExpression? existingSort) + { + if (ExtensibilityPointsToTrack.HasFlag(ResourceDefinitionExtensibilityPoint.OnApplySort)) + { + _hitCounter.TrackInvocation(ResourceDefinitionExtensibilityPoint.OnApplySort); + } + + return base.OnApplySort(existingSort); + } + + public override PaginationExpression? OnApplyPagination(PaginationExpression? existingPagination) + { + if (ExtensibilityPointsToTrack.HasFlag(ResourceDefinitionExtensibilityPoint.OnApplyPagination)) + { + _hitCounter.TrackInvocation(ResourceDefinitionExtensibilityPoint.OnApplyPagination); + } + + return base.OnApplyPagination(existingPagination); + } + + public override SparseFieldSetExpression? OnApplySparseFieldSet(SparseFieldSetExpression? existingSparseFieldSet) + { + if (ExtensibilityPointsToTrack.HasFlag(ResourceDefinitionExtensibilityPoint.OnApplySparseFieldSet)) + { + _hitCounter.TrackInvocation(ResourceDefinitionExtensibilityPoint.OnApplySparseFieldSet); + } + + return base.OnApplySparseFieldSet(existingSparseFieldSet); + } + + public override QueryStringParameterHandlers? OnRegisterQueryableHandlersForQueryStringParameters() + { + if (ExtensibilityPointsToTrack.HasFlag(ResourceDefinitionExtensibilityPoint.OnRegisterQueryableHandlersForQueryStringParameters)) + { + _hitCounter.TrackInvocation(ResourceDefinitionExtensibilityPoint.OnRegisterQueryableHandlersForQueryStringParameters); + } + + return base.OnRegisterQueryableHandlersForQueryStringParameters(); + } + + public override IDictionary? GetMeta(TResource resource) + { + if (ExtensibilityPointsToTrack.HasFlag(ResourceDefinitionExtensibilityPoint.GetMeta)) + { + _hitCounter.TrackInvocation(ResourceDefinitionExtensibilityPoint.GetMeta); + } + + return base.GetMeta(resource); + } + + public override Task OnPrepareWriteAsync(TResource resource, WriteOperationKind writeOperation, CancellationToken cancellationToken) + { + if (ExtensibilityPointsToTrack.HasFlag(ResourceDefinitionExtensibilityPoint.OnPrepareWriteAsync)) + { + _hitCounter.TrackInvocation(ResourceDefinitionExtensibilityPoint.OnPrepareWriteAsync); + } + + return base.OnPrepareWriteAsync(resource, writeOperation, cancellationToken); + } + + public override Task OnSetToOneRelationshipAsync(TResource leftResource, HasOneAttribute hasOneRelationship, + IIdentifiable? rightResourceId, WriteOperationKind writeOperation, CancellationToken cancellationToken) + { + if (ExtensibilityPointsToTrack.HasFlag(ResourceDefinitionExtensibilityPoint.OnSetToOneRelationshipAsync)) + { + _hitCounter.TrackInvocation(ResourceDefinitionExtensibilityPoint.OnSetToOneRelationshipAsync); + } + + return base.OnSetToOneRelationshipAsync(leftResource, hasOneRelationship, rightResourceId, writeOperation, cancellationToken); + } + + public override Task OnSetToManyRelationshipAsync(TResource leftResource, HasManyAttribute hasManyRelationship, ISet rightResourceIds, + WriteOperationKind writeOperation, CancellationToken cancellationToken) + { + if (ExtensibilityPointsToTrack.HasFlag(ResourceDefinitionExtensibilityPoint.OnSetToManyRelationshipAsync)) + { + _hitCounter.TrackInvocation(ResourceDefinitionExtensibilityPoint.OnSetToManyRelationshipAsync); + } + + return base.OnSetToManyRelationshipAsync(leftResource, hasManyRelationship, rightResourceIds, writeOperation, cancellationToken); + } + + public override Task OnAddToRelationshipAsync(TId leftResourceId, HasManyAttribute hasManyRelationship, ISet rightResourceIds, + CancellationToken cancellationToken) + { + if (ExtensibilityPointsToTrack.HasFlag(ResourceDefinitionExtensibilityPoint.OnAddToRelationshipAsync)) + { + _hitCounter.TrackInvocation(ResourceDefinitionExtensibilityPoint.OnAddToRelationshipAsync); + } + + return base.OnAddToRelationshipAsync(leftResourceId, hasManyRelationship, rightResourceIds, cancellationToken); + } + + public override Task OnRemoveFromRelationshipAsync(TResource leftResource, HasManyAttribute hasManyRelationship, ISet rightResourceIds, + CancellationToken cancellationToken) + { + if (ExtensibilityPointsToTrack.HasFlag(ResourceDefinitionExtensibilityPoint.OnRemoveFromRelationshipAsync)) + { + _hitCounter.TrackInvocation(ResourceDefinitionExtensibilityPoint.OnRemoveFromRelationshipAsync); + } + + return base.OnRemoveFromRelationshipAsync(leftResource, hasManyRelationship, rightResourceIds, cancellationToken); + } + + public override Task OnWritingAsync(TResource resource, WriteOperationKind writeOperation, CancellationToken cancellationToken) + { + if (ExtensibilityPointsToTrack.HasFlag(ResourceDefinitionExtensibilityPoint.OnWritingAsync)) + { + _hitCounter.TrackInvocation(ResourceDefinitionExtensibilityPoint.OnWritingAsync); + } + + return base.OnWritingAsync(resource, writeOperation, cancellationToken); + } + + public override Task OnWriteSucceededAsync(TResource resource, WriteOperationKind writeOperation, CancellationToken cancellationToken) + { + if (ExtensibilityPointsToTrack.HasFlag(ResourceDefinitionExtensibilityPoint.OnWriteSucceededAsync)) + { + _hitCounter.TrackInvocation(ResourceDefinitionExtensibilityPoint.OnWriteSucceededAsync); + } + + return base.OnWriteSucceededAsync(resource, writeOperation, cancellationToken); + } + + public override void OnDeserialize(TResource resource) + { + if (ExtensibilityPointsToTrack.HasFlag(ResourceDefinitionExtensibilityPoint.OnDeserialize)) + { + _hitCounter.TrackInvocation(ResourceDefinitionExtensibilityPoint.OnDeserialize); + } + + base.OnDeserialize(resource); + } + + public override void OnSerialize(TResource resource) + { + if (ExtensibilityPointsToTrack.HasFlag(ResourceDefinitionExtensibilityPoint.OnSerialize)) + { + _hitCounter.TrackInvocation(ResourceDefinitionExtensibilityPoint.OnSerialize); + } + + base.OnSerialize(resource); + } + } +} diff --git a/test/JsonApiDotNetCoreTests/IntegrationTests/Meta/ResourceMetaTests.cs b/test/JsonApiDotNetCoreTests/IntegrationTests/Meta/ResourceMetaTests.cs index c425d264c3..3aea1c5d18 100644 --- a/test/JsonApiDotNetCoreTests/IntegrationTests/Meta/ResourceMetaTests.cs +++ b/test/JsonApiDotNetCoreTests/IntegrationTests/Meta/ResourceMetaTests.cs @@ -65,9 +65,9 @@ await _testContext.RunOnDatabaseAsync(async dbContext => hitCounter.HitExtensibilityPoints.Should().BeEquivalentTo(new[] { - (typeof(SupportTicket), ResourceDefinitionHitCounter.ExtensibilityPoint.GetMeta), - (typeof(SupportTicket), ResourceDefinitionHitCounter.ExtensibilityPoint.GetMeta), - (typeof(SupportTicket), ResourceDefinitionHitCounter.ExtensibilityPoint.GetMeta) + (typeof(SupportTicket), ResourceDefinitionExtensibilityPoint.GetMeta), + (typeof(SupportTicket), ResourceDefinitionExtensibilityPoint.GetMeta), + (typeof(SupportTicket), ResourceDefinitionExtensibilityPoint.GetMeta) }, options => options.WithStrictOrdering()); } @@ -102,7 +102,7 @@ await _testContext.RunOnDatabaseAsync(async dbContext => hitCounter.HitExtensibilityPoints.Should().BeEquivalentTo(new[] { - (typeof(SupportTicket), ResourceDefinitionHitCounter.ExtensibilityPoint.GetMeta) + (typeof(SupportTicket), ResourceDefinitionExtensibilityPoint.GetMeta) }, options => options.WithStrictOrdering()); } } diff --git a/test/JsonApiDotNetCoreTests/IntegrationTests/Meta/SupportTicketDefinition.cs b/test/JsonApiDotNetCoreTests/IntegrationTests/Meta/SupportTicketDefinition.cs index 4fd71a830a..00b7e7ecdc 100644 --- a/test/JsonApiDotNetCoreTests/IntegrationTests/Meta/SupportTicketDefinition.cs +++ b/test/JsonApiDotNetCoreTests/IntegrationTests/Meta/SupportTicketDefinition.cs @@ -2,24 +2,22 @@ using System.Collections.Generic; using JetBrains.Annotations; using JsonApiDotNetCore.Configuration; -using JsonApiDotNetCore.Resources; namespace JsonApiDotNetCoreTests.IntegrationTests.Meta { [UsedImplicitly(ImplicitUseKindFlags.InstantiatedNoFixedConstructorSignature)] - public sealed class SupportTicketDefinition : JsonApiResourceDefinition + public sealed class SupportTicketDefinition : HitCountingResourceDefinition { - private readonly ResourceDefinitionHitCounter _hitCounter; + protected override ResourceDefinitionExtensibilityPoint ExtensibilityPointsToTrack => ResourceDefinitionExtensibilityPoint.GetMeta; public SupportTicketDefinition(IResourceGraph resourceGraph, ResourceDefinitionHitCounter hitCounter) - : base(resourceGraph) + : base(resourceGraph, hitCounter) { - _hitCounter = hitCounter; } public override IDictionary? GetMeta(SupportTicket resource) { - _hitCounter.TrackInvocation(ResourceDefinitionHitCounter.ExtensibilityPoint.GetMeta); + base.GetMeta(resource); if (!string.IsNullOrEmpty(resource.Description) && resource.Description.StartsWith("Critical:", StringComparison.Ordinal)) { @@ -29,7 +27,7 @@ public SupportTicketDefinition(IResourceGraph resourceGraph, ResourceDefinitionH }; } - return base.GetMeta(resource); + return null; } } } diff --git a/test/JsonApiDotNetCoreTests/IntegrationTests/Microservices/FireAndForgetDelivery/FireForgetGroupDefinition.cs b/test/JsonApiDotNetCoreTests/IntegrationTests/Microservices/FireAndForgetDelivery/FireForgetGroupDefinition.cs index 6001e055e7..23c17aa47f 100644 --- a/test/JsonApiDotNetCoreTests/IntegrationTests/Microservices/FireAndForgetDelivery/FireForgetGroupDefinition.cs +++ b/test/JsonApiDotNetCoreTests/IntegrationTests/Microservices/FireAndForgetDelivery/FireForgetGroupDefinition.cs @@ -12,7 +12,6 @@ namespace JsonApiDotNetCoreTests.IntegrationTests.Microservices.FireAndForgetDel public sealed class FireForgetGroupDefinition : MessagingGroupDefinition { private readonly MessageBroker _messageBroker; - private readonly ResourceDefinitionHitCounter _hitCounter; private DomainGroup? _groupToDelete; public FireForgetGroupDefinition(IResourceGraph resourceGraph, FireForgetDbContext dbContext, MessageBroker messageBroker, @@ -20,12 +19,11 @@ public FireForgetGroupDefinition(IResourceGraph resourceGraph, FireForgetDbConte : base(resourceGraph, dbContext.Users, dbContext.Groups, hitCounter) { _messageBroker = messageBroker; - _hitCounter = hitCounter; } public override async Task OnWritingAsync(DomainGroup group, WriteOperationKind writeOperation, CancellationToken cancellationToken) { - _hitCounter.TrackInvocation(ResourceDefinitionHitCounter.ExtensibilityPoint.OnWritingAsync); + await base.OnWritingAsync(group, writeOperation, cancellationToken); if (writeOperation == WriteOperationKind.DeleteResource) { @@ -33,11 +31,11 @@ public override async Task OnWritingAsync(DomainGroup group, WriteOperationKind } } - public override Task OnWriteSucceededAsync(DomainGroup group, WriteOperationKind writeOperation, CancellationToken cancellationToken) + public override async Task OnWriteSucceededAsync(DomainGroup group, WriteOperationKind writeOperation, CancellationToken cancellationToken) { - _hitCounter.TrackInvocation(ResourceDefinitionHitCounter.ExtensibilityPoint.OnWriteSucceededAsync); + await base.OnWriteSucceededAsync(group, writeOperation, cancellationToken); - return FinishWriteAsync(group, writeOperation, cancellationToken); + await FinishWriteAsync(group, writeOperation, cancellationToken); } protected override Task FlushMessageAsync(OutgoingMessage message, CancellationToken cancellationToken) diff --git a/test/JsonApiDotNetCoreTests/IntegrationTests/Microservices/FireAndForgetDelivery/FireForgetTests.Group.cs b/test/JsonApiDotNetCoreTests/IntegrationTests/Microservices/FireAndForgetDelivery/FireForgetTests.Group.cs index 4ca0baede4..ec9cfa3c7e 100644 --- a/test/JsonApiDotNetCoreTests/IntegrationTests/Microservices/FireAndForgetDelivery/FireForgetTests.Group.cs +++ b/test/JsonApiDotNetCoreTests/IntegrationTests/Microservices/FireAndForgetDelivery/FireForgetTests.Group.cs @@ -48,9 +48,9 @@ public async Task Create_group_sends_messages() hitCounter.HitExtensibilityPoints.Should().BeEquivalentTo(new[] { - (typeof(DomainGroup), ResourceDefinitionHitCounter.ExtensibilityPoint.OnPrepareWriteAsync), - (typeof(DomainGroup), ResourceDefinitionHitCounter.ExtensibilityPoint.OnWritingAsync), - (typeof(DomainGroup), ResourceDefinitionHitCounter.ExtensibilityPoint.OnWriteSucceededAsync) + (typeof(DomainGroup), ResourceDefinitionExtensibilityPoint.OnPrepareWriteAsync), + (typeof(DomainGroup), ResourceDefinitionExtensibilityPoint.OnWritingAsync), + (typeof(DomainGroup), ResourceDefinitionExtensibilityPoint.OnWriteSucceededAsync) }, options => options.WithStrictOrdering()); messageBroker.SentMessages.ShouldHaveCount(1); @@ -126,10 +126,10 @@ await _testContext.RunOnDatabaseAsync(async dbContext => hitCounter.HitExtensibilityPoints.Should().BeEquivalentTo(new[] { - (typeof(DomainGroup), ResourceDefinitionHitCounter.ExtensibilityPoint.OnPrepareWriteAsync), - (typeof(DomainGroup), ResourceDefinitionHitCounter.ExtensibilityPoint.OnSetToManyRelationshipAsync), - (typeof(DomainGroup), ResourceDefinitionHitCounter.ExtensibilityPoint.OnWritingAsync), - (typeof(DomainGroup), ResourceDefinitionHitCounter.ExtensibilityPoint.OnWriteSucceededAsync) + (typeof(DomainGroup), ResourceDefinitionExtensibilityPoint.OnPrepareWriteAsync), + (typeof(DomainGroup), ResourceDefinitionExtensibilityPoint.OnSetToManyRelationshipAsync), + (typeof(DomainGroup), ResourceDefinitionExtensibilityPoint.OnWritingAsync), + (typeof(DomainGroup), ResourceDefinitionExtensibilityPoint.OnWriteSucceededAsync) }, options => options.WithStrictOrdering()); messageBroker.SentMessages.ShouldHaveCount(3); @@ -192,9 +192,9 @@ await _testContext.RunOnDatabaseAsync(async dbContext => hitCounter.HitExtensibilityPoints.Should().BeEquivalentTo(new[] { - (typeof(DomainGroup), ResourceDefinitionHitCounter.ExtensibilityPoint.OnPrepareWriteAsync), - (typeof(DomainGroup), ResourceDefinitionHitCounter.ExtensibilityPoint.OnWritingAsync), - (typeof(DomainGroup), ResourceDefinitionHitCounter.ExtensibilityPoint.OnWriteSucceededAsync) + (typeof(DomainGroup), ResourceDefinitionExtensibilityPoint.OnPrepareWriteAsync), + (typeof(DomainGroup), ResourceDefinitionExtensibilityPoint.OnWritingAsync), + (typeof(DomainGroup), ResourceDefinitionExtensibilityPoint.OnWriteSucceededAsync) }, options => options.WithStrictOrdering()); messageBroker.SentMessages.ShouldHaveCount(1); @@ -276,10 +276,10 @@ await _testContext.RunOnDatabaseAsync(async dbContext => hitCounter.HitExtensibilityPoints.Should().BeEquivalentTo(new[] { - (typeof(DomainGroup), ResourceDefinitionHitCounter.ExtensibilityPoint.OnPrepareWriteAsync), - (typeof(DomainGroup), ResourceDefinitionHitCounter.ExtensibilityPoint.OnSetToManyRelationshipAsync), - (typeof(DomainGroup), ResourceDefinitionHitCounter.ExtensibilityPoint.OnWritingAsync), - (typeof(DomainGroup), ResourceDefinitionHitCounter.ExtensibilityPoint.OnWriteSucceededAsync) + (typeof(DomainGroup), ResourceDefinitionExtensibilityPoint.OnPrepareWriteAsync), + (typeof(DomainGroup), ResourceDefinitionExtensibilityPoint.OnSetToManyRelationshipAsync), + (typeof(DomainGroup), ResourceDefinitionExtensibilityPoint.OnWritingAsync), + (typeof(DomainGroup), ResourceDefinitionExtensibilityPoint.OnWriteSucceededAsync) }, options => options.WithStrictOrdering()); messageBroker.SentMessages.ShouldHaveCount(3); @@ -325,8 +325,8 @@ await _testContext.RunOnDatabaseAsync(async dbContext => hitCounter.HitExtensibilityPoints.Should().BeEquivalentTo(new[] { - (typeof(DomainGroup), ResourceDefinitionHitCounter.ExtensibilityPoint.OnWritingAsync), - (typeof(DomainGroup), ResourceDefinitionHitCounter.ExtensibilityPoint.OnWriteSucceededAsync) + (typeof(DomainGroup), ResourceDefinitionExtensibilityPoint.OnWritingAsync), + (typeof(DomainGroup), ResourceDefinitionExtensibilityPoint.OnWriteSucceededAsync) }, options => options.WithStrictOrdering()); messageBroker.SentMessages.ShouldHaveCount(1); @@ -363,8 +363,8 @@ await _testContext.RunOnDatabaseAsync(async dbContext => hitCounter.HitExtensibilityPoints.Should().BeEquivalentTo(new[] { - (typeof(DomainGroup), ResourceDefinitionHitCounter.ExtensibilityPoint.OnWritingAsync), - (typeof(DomainGroup), ResourceDefinitionHitCounter.ExtensibilityPoint.OnWriteSucceededAsync) + (typeof(DomainGroup), ResourceDefinitionExtensibilityPoint.OnWritingAsync), + (typeof(DomainGroup), ResourceDefinitionExtensibilityPoint.OnWriteSucceededAsync) }, options => options.WithStrictOrdering()); messageBroker.SentMessages.ShouldHaveCount(2); @@ -437,10 +437,10 @@ await _testContext.RunOnDatabaseAsync(async dbContext => hitCounter.HitExtensibilityPoints.Should().BeEquivalentTo(new[] { - (typeof(DomainGroup), ResourceDefinitionHitCounter.ExtensibilityPoint.OnPrepareWriteAsync), - (typeof(DomainGroup), ResourceDefinitionHitCounter.ExtensibilityPoint.OnSetToManyRelationshipAsync), - (typeof(DomainGroup), ResourceDefinitionHitCounter.ExtensibilityPoint.OnWritingAsync), - (typeof(DomainGroup), ResourceDefinitionHitCounter.ExtensibilityPoint.OnWriteSucceededAsync) + (typeof(DomainGroup), ResourceDefinitionExtensibilityPoint.OnPrepareWriteAsync), + (typeof(DomainGroup), ResourceDefinitionExtensibilityPoint.OnSetToManyRelationshipAsync), + (typeof(DomainGroup), ResourceDefinitionExtensibilityPoint.OnWritingAsync), + (typeof(DomainGroup), ResourceDefinitionExtensibilityPoint.OnWriteSucceededAsync) }, options => options.WithStrictOrdering()); messageBroker.SentMessages.ShouldHaveCount(3); @@ -511,9 +511,9 @@ await _testContext.RunOnDatabaseAsync(async dbContext => hitCounter.HitExtensibilityPoints.Should().BeEquivalentTo(new[] { - (typeof(DomainGroup), ResourceDefinitionHitCounter.ExtensibilityPoint.OnAddToRelationshipAsync), - (typeof(DomainGroup), ResourceDefinitionHitCounter.ExtensibilityPoint.OnWritingAsync), - (typeof(DomainGroup), ResourceDefinitionHitCounter.ExtensibilityPoint.OnWriteSucceededAsync) + (typeof(DomainGroup), ResourceDefinitionExtensibilityPoint.OnAddToRelationshipAsync), + (typeof(DomainGroup), ResourceDefinitionExtensibilityPoint.OnWritingAsync), + (typeof(DomainGroup), ResourceDefinitionExtensibilityPoint.OnWriteSucceededAsync) }, options => options.WithStrictOrdering()); messageBroker.SentMessages.ShouldHaveCount(2); @@ -573,9 +573,9 @@ await _testContext.RunOnDatabaseAsync(async dbContext => hitCounter.HitExtensibilityPoints.Should().BeEquivalentTo(new[] { - (typeof(DomainGroup), ResourceDefinitionHitCounter.ExtensibilityPoint.OnRemoveFromRelationshipAsync), - (typeof(DomainGroup), ResourceDefinitionHitCounter.ExtensibilityPoint.OnWritingAsync), - (typeof(DomainGroup), ResourceDefinitionHitCounter.ExtensibilityPoint.OnWriteSucceededAsync) + (typeof(DomainGroup), ResourceDefinitionExtensibilityPoint.OnRemoveFromRelationshipAsync), + (typeof(DomainGroup), ResourceDefinitionExtensibilityPoint.OnWritingAsync), + (typeof(DomainGroup), ResourceDefinitionExtensibilityPoint.OnWriteSucceededAsync) }, options => options.WithStrictOrdering()); messageBroker.SentMessages.ShouldHaveCount(1); diff --git a/test/JsonApiDotNetCoreTests/IntegrationTests/Microservices/FireAndForgetDelivery/FireForgetTests.User.cs b/test/JsonApiDotNetCoreTests/IntegrationTests/Microservices/FireAndForgetDelivery/FireForgetTests.User.cs index 1610045a2f..703db5bd54 100644 --- a/test/JsonApiDotNetCoreTests/IntegrationTests/Microservices/FireAndForgetDelivery/FireForgetTests.User.cs +++ b/test/JsonApiDotNetCoreTests/IntegrationTests/Microservices/FireAndForgetDelivery/FireForgetTests.User.cs @@ -50,9 +50,9 @@ public async Task Create_user_sends_messages() hitCounter.HitExtensibilityPoints.Should().BeEquivalentTo(new[] { - (typeof(DomainUser), ResourceDefinitionHitCounter.ExtensibilityPoint.OnPrepareWriteAsync), - (typeof(DomainUser), ResourceDefinitionHitCounter.ExtensibilityPoint.OnWritingAsync), - (typeof(DomainUser), ResourceDefinitionHitCounter.ExtensibilityPoint.OnWriteSucceededAsync) + (typeof(DomainUser), ResourceDefinitionExtensibilityPoint.OnPrepareWriteAsync), + (typeof(DomainUser), ResourceDefinitionExtensibilityPoint.OnWritingAsync), + (typeof(DomainUser), ResourceDefinitionExtensibilityPoint.OnWriteSucceededAsync) }, options => options.WithStrictOrdering()); messageBroker.SentMessages.ShouldHaveCount(1); @@ -119,10 +119,10 @@ await _testContext.RunOnDatabaseAsync(async dbContext => hitCounter.HitExtensibilityPoints.Should().BeEquivalentTo(new[] { - (typeof(DomainUser), ResourceDefinitionHitCounter.ExtensibilityPoint.OnPrepareWriteAsync), - (typeof(DomainUser), ResourceDefinitionHitCounter.ExtensibilityPoint.OnSetToOneRelationshipAsync), - (typeof(DomainUser), ResourceDefinitionHitCounter.ExtensibilityPoint.OnWritingAsync), - (typeof(DomainUser), ResourceDefinitionHitCounter.ExtensibilityPoint.OnWriteSucceededAsync) + (typeof(DomainUser), ResourceDefinitionExtensibilityPoint.OnPrepareWriteAsync), + (typeof(DomainUser), ResourceDefinitionExtensibilityPoint.OnSetToOneRelationshipAsync), + (typeof(DomainUser), ResourceDefinitionExtensibilityPoint.OnWritingAsync), + (typeof(DomainUser), ResourceDefinitionExtensibilityPoint.OnWriteSucceededAsync) }, options => options.WithStrictOrdering()); messageBroker.SentMessages.ShouldHaveCount(2); @@ -183,9 +183,9 @@ await _testContext.RunOnDatabaseAsync(async dbContext => hitCounter.HitExtensibilityPoints.Should().BeEquivalentTo(new[] { - (typeof(DomainUser), ResourceDefinitionHitCounter.ExtensibilityPoint.OnPrepareWriteAsync), - (typeof(DomainUser), ResourceDefinitionHitCounter.ExtensibilityPoint.OnWritingAsync), - (typeof(DomainUser), ResourceDefinitionHitCounter.ExtensibilityPoint.OnWriteSucceededAsync) + (typeof(DomainUser), ResourceDefinitionExtensibilityPoint.OnPrepareWriteAsync), + (typeof(DomainUser), ResourceDefinitionExtensibilityPoint.OnWritingAsync), + (typeof(DomainUser), ResourceDefinitionExtensibilityPoint.OnWriteSucceededAsync) }, options => options.WithStrictOrdering()); messageBroker.SentMessages.ShouldHaveCount(2); @@ -251,10 +251,10 @@ await _testContext.RunOnDatabaseAsync(async dbContext => hitCounter.HitExtensibilityPoints.Should().BeEquivalentTo(new[] { - (typeof(DomainUser), ResourceDefinitionHitCounter.ExtensibilityPoint.OnPrepareWriteAsync), - (typeof(DomainUser), ResourceDefinitionHitCounter.ExtensibilityPoint.OnSetToOneRelationshipAsync), - (typeof(DomainUser), ResourceDefinitionHitCounter.ExtensibilityPoint.OnWritingAsync), - (typeof(DomainUser), ResourceDefinitionHitCounter.ExtensibilityPoint.OnWriteSucceededAsync) + (typeof(DomainUser), ResourceDefinitionExtensibilityPoint.OnPrepareWriteAsync), + (typeof(DomainUser), ResourceDefinitionExtensibilityPoint.OnSetToOneRelationshipAsync), + (typeof(DomainUser), ResourceDefinitionExtensibilityPoint.OnWritingAsync), + (typeof(DomainUser), ResourceDefinitionExtensibilityPoint.OnWriteSucceededAsync) }, options => options.WithStrictOrdering()); messageBroker.SentMessages.ShouldHaveCount(2); @@ -323,10 +323,10 @@ await _testContext.RunOnDatabaseAsync(async dbContext => hitCounter.HitExtensibilityPoints.Should().BeEquivalentTo(new[] { - (typeof(DomainUser), ResourceDefinitionHitCounter.ExtensibilityPoint.OnPrepareWriteAsync), - (typeof(DomainUser), ResourceDefinitionHitCounter.ExtensibilityPoint.OnSetToOneRelationshipAsync), - (typeof(DomainUser), ResourceDefinitionHitCounter.ExtensibilityPoint.OnWritingAsync), - (typeof(DomainUser), ResourceDefinitionHitCounter.ExtensibilityPoint.OnWriteSucceededAsync) + (typeof(DomainUser), ResourceDefinitionExtensibilityPoint.OnPrepareWriteAsync), + (typeof(DomainUser), ResourceDefinitionExtensibilityPoint.OnSetToOneRelationshipAsync), + (typeof(DomainUser), ResourceDefinitionExtensibilityPoint.OnWritingAsync), + (typeof(DomainUser), ResourceDefinitionExtensibilityPoint.OnWriteSucceededAsync) }, options => options.WithStrictOrdering()); messageBroker.SentMessages.ShouldHaveCount(2); @@ -397,10 +397,10 @@ await _testContext.RunOnDatabaseAsync(async dbContext => hitCounter.HitExtensibilityPoints.Should().BeEquivalentTo(new[] { - (typeof(DomainUser), ResourceDefinitionHitCounter.ExtensibilityPoint.OnPrepareWriteAsync), - (typeof(DomainUser), ResourceDefinitionHitCounter.ExtensibilityPoint.OnSetToOneRelationshipAsync), - (typeof(DomainUser), ResourceDefinitionHitCounter.ExtensibilityPoint.OnWritingAsync), - (typeof(DomainUser), ResourceDefinitionHitCounter.ExtensibilityPoint.OnWriteSucceededAsync) + (typeof(DomainUser), ResourceDefinitionExtensibilityPoint.OnPrepareWriteAsync), + (typeof(DomainUser), ResourceDefinitionExtensibilityPoint.OnSetToOneRelationshipAsync), + (typeof(DomainUser), ResourceDefinitionExtensibilityPoint.OnWritingAsync), + (typeof(DomainUser), ResourceDefinitionExtensibilityPoint.OnWriteSucceededAsync) }, options => options.WithStrictOrdering()); messageBroker.SentMessages.ShouldHaveCount(2); @@ -443,8 +443,8 @@ await _testContext.RunOnDatabaseAsync(async dbContext => hitCounter.HitExtensibilityPoints.Should().BeEquivalentTo(new[] { - (typeof(DomainUser), ResourceDefinitionHitCounter.ExtensibilityPoint.OnWritingAsync), - (typeof(DomainUser), ResourceDefinitionHitCounter.ExtensibilityPoint.OnWriteSucceededAsync) + (typeof(DomainUser), ResourceDefinitionExtensibilityPoint.OnWritingAsync), + (typeof(DomainUser), ResourceDefinitionExtensibilityPoint.OnWriteSucceededAsync) }, options => options.WithStrictOrdering()); messageBroker.SentMessages.ShouldHaveCount(1); @@ -481,8 +481,8 @@ await _testContext.RunOnDatabaseAsync(async dbContext => hitCounter.HitExtensibilityPoints.Should().BeEquivalentTo(new[] { - (typeof(DomainUser), ResourceDefinitionHitCounter.ExtensibilityPoint.OnWritingAsync), - (typeof(DomainUser), ResourceDefinitionHitCounter.ExtensibilityPoint.OnWriteSucceededAsync) + (typeof(DomainUser), ResourceDefinitionExtensibilityPoint.OnWritingAsync), + (typeof(DomainUser), ResourceDefinitionExtensibilityPoint.OnWriteSucceededAsync) }, options => options.WithStrictOrdering()); messageBroker.SentMessages.ShouldHaveCount(2); @@ -528,10 +528,10 @@ await _testContext.RunOnDatabaseAsync(async dbContext => hitCounter.HitExtensibilityPoints.Should().BeEquivalentTo(new[] { - (typeof(DomainUser), ResourceDefinitionHitCounter.ExtensibilityPoint.OnPrepareWriteAsync), - (typeof(DomainUser), ResourceDefinitionHitCounter.ExtensibilityPoint.OnSetToOneRelationshipAsync), - (typeof(DomainUser), ResourceDefinitionHitCounter.ExtensibilityPoint.OnWritingAsync), - (typeof(DomainUser), ResourceDefinitionHitCounter.ExtensibilityPoint.OnWriteSucceededAsync) + (typeof(DomainUser), ResourceDefinitionExtensibilityPoint.OnPrepareWriteAsync), + (typeof(DomainUser), ResourceDefinitionExtensibilityPoint.OnSetToOneRelationshipAsync), + (typeof(DomainUser), ResourceDefinitionExtensibilityPoint.OnWritingAsync), + (typeof(DomainUser), ResourceDefinitionExtensibilityPoint.OnWriteSucceededAsync) }, options => options.WithStrictOrdering()); messageBroker.SentMessages.ShouldHaveCount(1); @@ -578,10 +578,10 @@ await _testContext.RunOnDatabaseAsync(async dbContext => hitCounter.HitExtensibilityPoints.Should().BeEquivalentTo(new[] { - (typeof(DomainUser), ResourceDefinitionHitCounter.ExtensibilityPoint.OnPrepareWriteAsync), - (typeof(DomainUser), ResourceDefinitionHitCounter.ExtensibilityPoint.OnSetToOneRelationshipAsync), - (typeof(DomainUser), ResourceDefinitionHitCounter.ExtensibilityPoint.OnWritingAsync), - (typeof(DomainUser), ResourceDefinitionHitCounter.ExtensibilityPoint.OnWriteSucceededAsync) + (typeof(DomainUser), ResourceDefinitionExtensibilityPoint.OnPrepareWriteAsync), + (typeof(DomainUser), ResourceDefinitionExtensibilityPoint.OnSetToOneRelationshipAsync), + (typeof(DomainUser), ResourceDefinitionExtensibilityPoint.OnWritingAsync), + (typeof(DomainUser), ResourceDefinitionExtensibilityPoint.OnWriteSucceededAsync) }, options => options.WithStrictOrdering()); messageBroker.SentMessages.ShouldHaveCount(1); @@ -630,10 +630,10 @@ await _testContext.RunOnDatabaseAsync(async dbContext => hitCounter.HitExtensibilityPoints.Should().BeEquivalentTo(new[] { - (typeof(DomainUser), ResourceDefinitionHitCounter.ExtensibilityPoint.OnPrepareWriteAsync), - (typeof(DomainUser), ResourceDefinitionHitCounter.ExtensibilityPoint.OnSetToOneRelationshipAsync), - (typeof(DomainUser), ResourceDefinitionHitCounter.ExtensibilityPoint.OnWritingAsync), - (typeof(DomainUser), ResourceDefinitionHitCounter.ExtensibilityPoint.OnWriteSucceededAsync) + (typeof(DomainUser), ResourceDefinitionExtensibilityPoint.OnPrepareWriteAsync), + (typeof(DomainUser), ResourceDefinitionExtensibilityPoint.OnSetToOneRelationshipAsync), + (typeof(DomainUser), ResourceDefinitionExtensibilityPoint.OnWritingAsync), + (typeof(DomainUser), ResourceDefinitionExtensibilityPoint.OnWriteSucceededAsync) }, options => options.WithStrictOrdering()); messageBroker.SentMessages.ShouldHaveCount(1); diff --git a/test/JsonApiDotNetCoreTests/IntegrationTests/Microservices/FireAndForgetDelivery/FireForgetTests.cs b/test/JsonApiDotNetCoreTests/IntegrationTests/Microservices/FireAndForgetDelivery/FireForgetTests.cs index ebef3ea6fb..fef67a81be 100644 --- a/test/JsonApiDotNetCoreTests/IntegrationTests/Microservices/FireAndForgetDelivery/FireForgetTests.cs +++ b/test/JsonApiDotNetCoreTests/IntegrationTests/Microservices/FireAndForgetDelivery/FireForgetTests.cs @@ -65,7 +65,7 @@ public async Task Does_not_send_message_on_write_error() hitCounter.HitExtensibilityPoints.Should().BeEquivalentTo(new[] { - (typeof(DomainUser), ResourceDefinitionHitCounter.ExtensibilityPoint.OnWritingAsync) + (typeof(DomainUser), ResourceDefinitionExtensibilityPoint.OnWritingAsync) }, options => options.WithStrictOrdering()); messageBroker.SentMessages.Should().BeEmpty(); @@ -106,8 +106,8 @@ await _testContext.RunOnDatabaseAsync(async dbContext => hitCounter.HitExtensibilityPoints.Should().BeEquivalentTo(new[] { - (typeof(DomainUser), ResourceDefinitionHitCounter.ExtensibilityPoint.OnWritingAsync), - (typeof(DomainUser), ResourceDefinitionHitCounter.ExtensibilityPoint.OnWriteSucceededAsync) + (typeof(DomainUser), ResourceDefinitionExtensibilityPoint.OnWritingAsync), + (typeof(DomainUser), ResourceDefinitionExtensibilityPoint.OnWriteSucceededAsync) }, options => options.WithStrictOrdering()); messageBroker.SentMessages.ShouldHaveCount(1); diff --git a/test/JsonApiDotNetCoreTests/IntegrationTests/Microservices/FireAndForgetDelivery/FireForgetUserDefinition.cs b/test/JsonApiDotNetCoreTests/IntegrationTests/Microservices/FireAndForgetDelivery/FireForgetUserDefinition.cs index ee713cb291..512c340222 100644 --- a/test/JsonApiDotNetCoreTests/IntegrationTests/Microservices/FireAndForgetDelivery/FireForgetUserDefinition.cs +++ b/test/JsonApiDotNetCoreTests/IntegrationTests/Microservices/FireAndForgetDelivery/FireForgetUserDefinition.cs @@ -12,7 +12,6 @@ namespace JsonApiDotNetCoreTests.IntegrationTests.Microservices.FireAndForgetDel public sealed class FireForgetUserDefinition : MessagingUserDefinition { private readonly MessageBroker _messageBroker; - private readonly ResourceDefinitionHitCounter _hitCounter; private DomainUser? _userToDelete; public FireForgetUserDefinition(IResourceGraph resourceGraph, FireForgetDbContext dbContext, MessageBroker messageBroker, @@ -20,12 +19,11 @@ public FireForgetUserDefinition(IResourceGraph resourceGraph, FireForgetDbContex : base(resourceGraph, dbContext.Users, hitCounter) { _messageBroker = messageBroker; - _hitCounter = hitCounter; } public override async Task OnWritingAsync(DomainUser user, WriteOperationKind writeOperation, CancellationToken cancellationToken) { - _hitCounter.TrackInvocation(ResourceDefinitionHitCounter.ExtensibilityPoint.OnWritingAsync); + await base.OnWritingAsync(user, writeOperation, cancellationToken); if (writeOperation == WriteOperationKind.DeleteResource) { @@ -33,11 +31,11 @@ public override async Task OnWritingAsync(DomainUser user, WriteOperationKind wr } } - public override Task OnWriteSucceededAsync(DomainUser user, WriteOperationKind writeOperation, CancellationToken cancellationToken) + public override async Task OnWriteSucceededAsync(DomainUser user, WriteOperationKind writeOperation, CancellationToken cancellationToken) { - _hitCounter.TrackInvocation(ResourceDefinitionHitCounter.ExtensibilityPoint.OnWriteSucceededAsync); + await base.OnWriteSucceededAsync(user, writeOperation, cancellationToken); - return FinishWriteAsync(user, writeOperation, cancellationToken); + await FinishWriteAsync(user, writeOperation, cancellationToken); } protected override Task FlushMessageAsync(OutgoingMessage message, CancellationToken cancellationToken) diff --git a/test/JsonApiDotNetCoreTests/IntegrationTests/Microservices/MessagingGroupDefinition.cs b/test/JsonApiDotNetCoreTests/IntegrationTests/Microservices/MessagingGroupDefinition.cs index b79c21e376..c41b741801 100644 --- a/test/JsonApiDotNetCoreTests/IntegrationTests/Microservices/MessagingGroupDefinition.cs +++ b/test/JsonApiDotNetCoreTests/IntegrationTests/Microservices/MessagingGroupDefinition.cs @@ -12,27 +12,27 @@ namespace JsonApiDotNetCoreTests.IntegrationTests.Microservices { - public abstract class MessagingGroupDefinition : JsonApiResourceDefinition + public abstract class MessagingGroupDefinition : HitCountingResourceDefinition { private readonly DbSet _userSet; private readonly DbSet _groupSet; - private readonly ResourceDefinitionHitCounter _hitCounter; private readonly List _pendingMessages = new(); private string? _beforeGroupName; + protected override ResourceDefinitionExtensibilityPoint ExtensibilityPointsToTrack => ResourceDefinitionExtensibilityPoint.Writing; + protected MessagingGroupDefinition(IResourceGraph resourceGraph, DbSet userSet, DbSet groupSet, ResourceDefinitionHitCounter hitCounter) - : base(resourceGraph) + : base(resourceGraph, hitCounter) { _userSet = userSet; _groupSet = groupSet; - _hitCounter = hitCounter; } - public override Task OnPrepareWriteAsync(DomainGroup group, WriteOperationKind writeOperation, CancellationToken cancellationToken) + public override async Task OnPrepareWriteAsync(DomainGroup group, WriteOperationKind writeOperation, CancellationToken cancellationToken) { - _hitCounter.TrackInvocation(ResourceDefinitionHitCounter.ExtensibilityPoint.OnPrepareWriteAsync); + await base.OnPrepareWriteAsync(group, writeOperation, cancellationToken); if (writeOperation == WriteOperationKind.CreateResource) { @@ -42,14 +42,12 @@ public override Task OnPrepareWriteAsync(DomainGroup group, WriteOperationKind w { _beforeGroupName = group.Name; } - - return Task.CompletedTask; } public override async Task OnSetToManyRelationshipAsync(DomainGroup group, HasManyAttribute hasManyRelationship, ISet rightResourceIds, WriteOperationKind writeOperation, CancellationToken cancellationToken) { - _hitCounter.TrackInvocation(ResourceDefinitionHitCounter.ExtensibilityPoint.OnSetToManyRelationshipAsync); + await base.OnSetToManyRelationshipAsync(group, hasManyRelationship, rightResourceIds, writeOperation, cancellationToken); if (hasManyRelationship.Property.Name == nameof(DomainGroup.Users)) { @@ -90,7 +88,7 @@ public override async Task OnSetToManyRelationshipAsync(DomainGroup group, HasMa public override async Task OnAddToRelationshipAsync(Guid groupId, HasManyAttribute hasManyRelationship, ISet rightResourceIds, CancellationToken cancellationToken) { - _hitCounter.TrackInvocation(ResourceDefinitionHitCounter.ExtensibilityPoint.OnAddToRelationshipAsync); + await base.OnAddToRelationshipAsync(groupId, hasManyRelationship, rightResourceIds, cancellationToken); if (hasManyRelationship.Property.Name == nameof(DomainGroup.Users)) { @@ -121,10 +119,10 @@ public override async Task OnAddToRelationshipAsync(Guid groupId, HasManyAttribu } } - public override Task OnRemoveFromRelationshipAsync(DomainGroup group, HasManyAttribute hasManyRelationship, ISet rightResourceIds, + public override async Task OnRemoveFromRelationshipAsync(DomainGroup group, HasManyAttribute hasManyRelationship, ISet rightResourceIds, CancellationToken cancellationToken) { - _hitCounter.TrackInvocation(ResourceDefinitionHitCounter.ExtensibilityPoint.OnRemoveFromRelationshipAsync); + await base.OnRemoveFromRelationshipAsync(group, hasManyRelationship, rightResourceIds, cancellationToken); if (hasManyRelationship.Property.Name == nameof(DomainGroup.Users)) { @@ -137,8 +135,6 @@ public override Task OnRemoveFromRelationshipAsync(DomainGroup group, HasManyAtt _pendingMessages.Add(message); } } - - return Task.CompletedTask; } protected async Task FinishWriteAsync(DomainGroup group, WriteOperationKind writeOperation, CancellationToken cancellationToken) diff --git a/test/JsonApiDotNetCoreTests/IntegrationTests/Microservices/MessagingUserDefinition.cs b/test/JsonApiDotNetCoreTests/IntegrationTests/Microservices/MessagingUserDefinition.cs index 89d5acb903..d7c2a38116 100644 --- a/test/JsonApiDotNetCoreTests/IntegrationTests/Microservices/MessagingUserDefinition.cs +++ b/test/JsonApiDotNetCoreTests/IntegrationTests/Microservices/MessagingUserDefinition.cs @@ -11,25 +11,25 @@ namespace JsonApiDotNetCoreTests.IntegrationTests.Microservices { - public abstract class MessagingUserDefinition : JsonApiResourceDefinition + public abstract class MessagingUserDefinition : HitCountingResourceDefinition { private readonly DbSet _userSet; - private readonly ResourceDefinitionHitCounter _hitCounter; private readonly List _pendingMessages = new(); private string? _beforeLoginName; private string? _beforeDisplayName; + protected override ResourceDefinitionExtensibilityPoint ExtensibilityPointsToTrack => ResourceDefinitionExtensibilityPoint.Writing; + protected MessagingUserDefinition(IResourceGraph resourceGraph, DbSet userSet, ResourceDefinitionHitCounter hitCounter) - : base(resourceGraph) + : base(resourceGraph, hitCounter) { _userSet = userSet; - _hitCounter = hitCounter; } - public override Task OnPrepareWriteAsync(DomainUser user, WriteOperationKind writeOperation, CancellationToken cancellationToken) + public override async Task OnPrepareWriteAsync(DomainUser user, WriteOperationKind writeOperation, CancellationToken cancellationToken) { - _hitCounter.TrackInvocation(ResourceDefinitionHitCounter.ExtensibilityPoint.OnPrepareWriteAsync); + await base.OnPrepareWriteAsync(user, writeOperation, cancellationToken); if (writeOperation == WriteOperationKind.CreateResource) { @@ -40,14 +40,12 @@ public override Task OnPrepareWriteAsync(DomainUser user, WriteOperationKind wri _beforeLoginName = user.LoginName; _beforeDisplayName = user.DisplayName; } - - return Task.CompletedTask; } - public override Task OnSetToOneRelationshipAsync(DomainUser user, HasOneAttribute hasOneRelationship, IIdentifiable? rightResourceId, - WriteOperationKind writeOperation, CancellationToken cancellationToken) + public override async Task OnSetToOneRelationshipAsync(DomainUser user, HasOneAttribute hasOneRelationship, + IIdentifiable? rightResourceId, WriteOperationKind writeOperation, CancellationToken cancellationToken) { - _hitCounter.TrackInvocation(ResourceDefinitionHitCounter.ExtensibilityPoint.OnSetToOneRelationshipAsync); + await base.OnSetToOneRelationshipAsync(user, hasOneRelationship, rightResourceId, writeOperation, cancellationToken); if (hasOneRelationship.Property.Name == nameof(DomainUser.Group)) { @@ -74,7 +72,7 @@ public override Task OnPrepareWriteAsync(DomainUser user, WriteOperationKind wri } } - return Task.FromResult(rightResourceId); + return rightResourceId; } protected async Task FinishWriteAsync(DomainUser user, WriteOperationKind writeOperation, CancellationToken cancellationToken) diff --git a/test/JsonApiDotNetCoreTests/IntegrationTests/Microservices/TransactionalOutboxPattern/OutboxGroupDefinition.cs b/test/JsonApiDotNetCoreTests/IntegrationTests/Microservices/TransactionalOutboxPattern/OutboxGroupDefinition.cs index 19fa2e72f6..f79bce5e00 100644 --- a/test/JsonApiDotNetCoreTests/IntegrationTests/Microservices/TransactionalOutboxPattern/OutboxGroupDefinition.cs +++ b/test/JsonApiDotNetCoreTests/IntegrationTests/Microservices/TransactionalOutboxPattern/OutboxGroupDefinition.cs @@ -11,21 +11,19 @@ namespace JsonApiDotNetCoreTests.IntegrationTests.Microservices.TransactionalOut [UsedImplicitly(ImplicitUseKindFlags.InstantiatedNoFixedConstructorSignature)] public sealed class OutboxGroupDefinition : MessagingGroupDefinition { - private readonly ResourceDefinitionHitCounter _hitCounter; private readonly DbSet _outboxMessageSet; public OutboxGroupDefinition(IResourceGraph resourceGraph, OutboxDbContext dbContext, ResourceDefinitionHitCounter hitCounter) : base(resourceGraph, dbContext.Users, dbContext.Groups, hitCounter) { - _hitCounter = hitCounter; _outboxMessageSet = dbContext.OutboxMessages; } - public override Task OnWritingAsync(DomainGroup group, WriteOperationKind writeOperation, CancellationToken cancellationToken) + public override async Task OnWritingAsync(DomainGroup group, WriteOperationKind writeOperation, CancellationToken cancellationToken) { - _hitCounter.TrackInvocation(ResourceDefinitionHitCounter.ExtensibilityPoint.OnWritingAsync); + await base.OnWritingAsync(group, writeOperation, cancellationToken); - return FinishWriteAsync(group, writeOperation, cancellationToken); + await FinishWriteAsync(group, writeOperation, cancellationToken); } protected override async Task FlushMessageAsync(OutgoingMessage message, CancellationToken cancellationToken) diff --git a/test/JsonApiDotNetCoreTests/IntegrationTests/Microservices/TransactionalOutboxPattern/OutboxTests.Group.cs b/test/JsonApiDotNetCoreTests/IntegrationTests/Microservices/TransactionalOutboxPattern/OutboxTests.Group.cs index e83c88348f..b3c25f8e2f 100644 --- a/test/JsonApiDotNetCoreTests/IntegrationTests/Microservices/TransactionalOutboxPattern/OutboxTests.Group.cs +++ b/test/JsonApiDotNetCoreTests/IntegrationTests/Microservices/TransactionalOutboxPattern/OutboxTests.Group.cs @@ -54,8 +54,9 @@ await _testContext.RunOnDatabaseAsync(async dbContext => hitCounter.HitExtensibilityPoints.Should().BeEquivalentTo(new[] { - (typeof(DomainGroup), ResourceDefinitionHitCounter.ExtensibilityPoint.OnPrepareWriteAsync), - (typeof(DomainGroup), ResourceDefinitionHitCounter.ExtensibilityPoint.OnWritingAsync) + (typeof(DomainGroup), ResourceDefinitionExtensibilityPoint.OnPrepareWriteAsync), + (typeof(DomainGroup), ResourceDefinitionExtensibilityPoint.OnWritingAsync), + (typeof(DomainGroup), ResourceDefinitionExtensibilityPoint.OnWriteSucceededAsync) }, options => options.WithStrictOrdering()); Guid newGroupId = Guid.Parse(responseDocument.Data.SingleValue.Id.ShouldNotBeNull()); @@ -135,9 +136,10 @@ await _testContext.RunOnDatabaseAsync(async dbContext => hitCounter.HitExtensibilityPoints.Should().BeEquivalentTo(new[] { - (typeof(DomainGroup), ResourceDefinitionHitCounter.ExtensibilityPoint.OnPrepareWriteAsync), - (typeof(DomainGroup), ResourceDefinitionHitCounter.ExtensibilityPoint.OnSetToManyRelationshipAsync), - (typeof(DomainGroup), ResourceDefinitionHitCounter.ExtensibilityPoint.OnWritingAsync) + (typeof(DomainGroup), ResourceDefinitionExtensibilityPoint.OnPrepareWriteAsync), + (typeof(DomainGroup), ResourceDefinitionExtensibilityPoint.OnSetToManyRelationshipAsync), + (typeof(DomainGroup), ResourceDefinitionExtensibilityPoint.OnWritingAsync), + (typeof(DomainGroup), ResourceDefinitionExtensibilityPoint.OnWriteSucceededAsync) }, options => options.WithStrictOrdering()); Guid newGroupId = Guid.Parse(responseDocument.Data.SingleValue.Id.ShouldNotBeNull()); @@ -204,8 +206,9 @@ await _testContext.RunOnDatabaseAsync(async dbContext => hitCounter.HitExtensibilityPoints.Should().BeEquivalentTo(new[] { - (typeof(DomainGroup), ResourceDefinitionHitCounter.ExtensibilityPoint.OnPrepareWriteAsync), - (typeof(DomainGroup), ResourceDefinitionHitCounter.ExtensibilityPoint.OnWritingAsync) + (typeof(DomainGroup), ResourceDefinitionExtensibilityPoint.OnPrepareWriteAsync), + (typeof(DomainGroup), ResourceDefinitionExtensibilityPoint.OnWritingAsync), + (typeof(DomainGroup), ResourceDefinitionExtensibilityPoint.OnWriteSucceededAsync) }, options => options.WithStrictOrdering()); await _testContext.RunOnDatabaseAsync(async dbContext => @@ -291,9 +294,10 @@ await _testContext.RunOnDatabaseAsync(async dbContext => hitCounter.HitExtensibilityPoints.Should().BeEquivalentTo(new[] { - (typeof(DomainGroup), ResourceDefinitionHitCounter.ExtensibilityPoint.OnPrepareWriteAsync), - (typeof(DomainGroup), ResourceDefinitionHitCounter.ExtensibilityPoint.OnSetToManyRelationshipAsync), - (typeof(DomainGroup), ResourceDefinitionHitCounter.ExtensibilityPoint.OnWritingAsync) + (typeof(DomainGroup), ResourceDefinitionExtensibilityPoint.OnPrepareWriteAsync), + (typeof(DomainGroup), ResourceDefinitionExtensibilityPoint.OnSetToManyRelationshipAsync), + (typeof(DomainGroup), ResourceDefinitionExtensibilityPoint.OnWritingAsync), + (typeof(DomainGroup), ResourceDefinitionExtensibilityPoint.OnWriteSucceededAsync) }, options => options.WithStrictOrdering()); await _testContext.RunOnDatabaseAsync(async dbContext => @@ -343,7 +347,8 @@ await _testContext.RunOnDatabaseAsync(async dbContext => hitCounter.HitExtensibilityPoints.Should().BeEquivalentTo(new[] { - (typeof(DomainGroup), ResourceDefinitionHitCounter.ExtensibilityPoint.OnWritingAsync) + (typeof(DomainGroup), ResourceDefinitionExtensibilityPoint.OnWritingAsync), + (typeof(DomainGroup), ResourceDefinitionExtensibilityPoint.OnWriteSucceededAsync) }, options => options.WithStrictOrdering()); await _testContext.RunOnDatabaseAsync(async dbContext => @@ -384,7 +389,8 @@ await _testContext.RunOnDatabaseAsync(async dbContext => hitCounter.HitExtensibilityPoints.Should().BeEquivalentTo(new[] { - (typeof(DomainGroup), ResourceDefinitionHitCounter.ExtensibilityPoint.OnWritingAsync) + (typeof(DomainGroup), ResourceDefinitionExtensibilityPoint.OnWritingAsync), + (typeof(DomainGroup), ResourceDefinitionExtensibilityPoint.OnWriteSucceededAsync) }, options => options.WithStrictOrdering()); await _testContext.RunOnDatabaseAsync(async dbContext => @@ -461,9 +467,10 @@ await _testContext.RunOnDatabaseAsync(async dbContext => hitCounter.HitExtensibilityPoints.Should().BeEquivalentTo(new[] { - (typeof(DomainGroup), ResourceDefinitionHitCounter.ExtensibilityPoint.OnPrepareWriteAsync), - (typeof(DomainGroup), ResourceDefinitionHitCounter.ExtensibilityPoint.OnSetToManyRelationshipAsync), - (typeof(DomainGroup), ResourceDefinitionHitCounter.ExtensibilityPoint.OnWritingAsync) + (typeof(DomainGroup), ResourceDefinitionExtensibilityPoint.OnPrepareWriteAsync), + (typeof(DomainGroup), ResourceDefinitionExtensibilityPoint.OnSetToManyRelationshipAsync), + (typeof(DomainGroup), ResourceDefinitionExtensibilityPoint.OnWritingAsync), + (typeof(DomainGroup), ResourceDefinitionExtensibilityPoint.OnWriteSucceededAsync) }, options => options.WithStrictOrdering()); await _testContext.RunOnDatabaseAsync(async dbContext => @@ -538,8 +545,9 @@ await _testContext.RunOnDatabaseAsync(async dbContext => hitCounter.HitExtensibilityPoints.Should().BeEquivalentTo(new[] { - (typeof(DomainGroup), ResourceDefinitionHitCounter.ExtensibilityPoint.OnAddToRelationshipAsync), - (typeof(DomainGroup), ResourceDefinitionHitCounter.ExtensibilityPoint.OnWritingAsync) + (typeof(DomainGroup), ResourceDefinitionExtensibilityPoint.OnAddToRelationshipAsync), + (typeof(DomainGroup), ResourceDefinitionExtensibilityPoint.OnWritingAsync), + (typeof(DomainGroup), ResourceDefinitionExtensibilityPoint.OnWriteSucceededAsync) }, options => options.WithStrictOrdering()); await _testContext.RunOnDatabaseAsync(async dbContext => @@ -603,8 +611,9 @@ await _testContext.RunOnDatabaseAsync(async dbContext => hitCounter.HitExtensibilityPoints.Should().BeEquivalentTo(new[] { - (typeof(DomainGroup), ResourceDefinitionHitCounter.ExtensibilityPoint.OnRemoveFromRelationshipAsync), - (typeof(DomainGroup), ResourceDefinitionHitCounter.ExtensibilityPoint.OnWritingAsync) + (typeof(DomainGroup), ResourceDefinitionExtensibilityPoint.OnRemoveFromRelationshipAsync), + (typeof(DomainGroup), ResourceDefinitionExtensibilityPoint.OnWritingAsync), + (typeof(DomainGroup), ResourceDefinitionExtensibilityPoint.OnWriteSucceededAsync) }, options => options.WithStrictOrdering()); await _testContext.RunOnDatabaseAsync(async dbContext => diff --git a/test/JsonApiDotNetCoreTests/IntegrationTests/Microservices/TransactionalOutboxPattern/OutboxTests.User.cs b/test/JsonApiDotNetCoreTests/IntegrationTests/Microservices/TransactionalOutboxPattern/OutboxTests.User.cs index 7c08da151c..2b229d516e 100644 --- a/test/JsonApiDotNetCoreTests/IntegrationTests/Microservices/TransactionalOutboxPattern/OutboxTests.User.cs +++ b/test/JsonApiDotNetCoreTests/IntegrationTests/Microservices/TransactionalOutboxPattern/OutboxTests.User.cs @@ -57,8 +57,9 @@ await _testContext.RunOnDatabaseAsync(async dbContext => hitCounter.HitExtensibilityPoints.Should().BeEquivalentTo(new[] { - (typeof(DomainUser), ResourceDefinitionHitCounter.ExtensibilityPoint.OnPrepareWriteAsync), - (typeof(DomainUser), ResourceDefinitionHitCounter.ExtensibilityPoint.OnWritingAsync) + (typeof(DomainUser), ResourceDefinitionExtensibilityPoint.OnPrepareWriteAsync), + (typeof(DomainUser), ResourceDefinitionExtensibilityPoint.OnWritingAsync), + (typeof(DomainUser), ResourceDefinitionExtensibilityPoint.OnWriteSucceededAsync) }, options => options.WithStrictOrdering()); Guid newUserId = Guid.Parse(responseDocument.Data.SingleValue.Id.ShouldNotBeNull()); @@ -129,9 +130,10 @@ await _testContext.RunOnDatabaseAsync(async dbContext => hitCounter.HitExtensibilityPoints.Should().BeEquivalentTo(new[] { - (typeof(DomainUser), ResourceDefinitionHitCounter.ExtensibilityPoint.OnPrepareWriteAsync), - (typeof(DomainUser), ResourceDefinitionHitCounter.ExtensibilityPoint.OnSetToOneRelationshipAsync), - (typeof(DomainUser), ResourceDefinitionHitCounter.ExtensibilityPoint.OnWritingAsync) + (typeof(DomainUser), ResourceDefinitionExtensibilityPoint.OnPrepareWriteAsync), + (typeof(DomainUser), ResourceDefinitionExtensibilityPoint.OnSetToOneRelationshipAsync), + (typeof(DomainUser), ResourceDefinitionExtensibilityPoint.OnWritingAsync), + (typeof(DomainUser), ResourceDefinitionExtensibilityPoint.OnWriteSucceededAsync) }, options => options.WithStrictOrdering()); Guid newUserId = Guid.Parse(responseDocument.Data.SingleValue.Id.ShouldNotBeNull()); @@ -196,8 +198,9 @@ await _testContext.RunOnDatabaseAsync(async dbContext => hitCounter.HitExtensibilityPoints.Should().BeEquivalentTo(new[] { - (typeof(DomainUser), ResourceDefinitionHitCounter.ExtensibilityPoint.OnPrepareWriteAsync), - (typeof(DomainUser), ResourceDefinitionHitCounter.ExtensibilityPoint.OnWritingAsync) + (typeof(DomainUser), ResourceDefinitionExtensibilityPoint.OnPrepareWriteAsync), + (typeof(DomainUser), ResourceDefinitionExtensibilityPoint.OnWritingAsync), + (typeof(DomainUser), ResourceDefinitionExtensibilityPoint.OnWriteSucceededAsync) }, options => options.WithStrictOrdering()); await _testContext.RunOnDatabaseAsync(async dbContext => @@ -267,9 +270,10 @@ await _testContext.RunOnDatabaseAsync(async dbContext => hitCounter.HitExtensibilityPoints.Should().BeEquivalentTo(new[] { - (typeof(DomainUser), ResourceDefinitionHitCounter.ExtensibilityPoint.OnPrepareWriteAsync), - (typeof(DomainUser), ResourceDefinitionHitCounter.ExtensibilityPoint.OnSetToOneRelationshipAsync), - (typeof(DomainUser), ResourceDefinitionHitCounter.ExtensibilityPoint.OnWritingAsync) + (typeof(DomainUser), ResourceDefinitionExtensibilityPoint.OnPrepareWriteAsync), + (typeof(DomainUser), ResourceDefinitionExtensibilityPoint.OnSetToOneRelationshipAsync), + (typeof(DomainUser), ResourceDefinitionExtensibilityPoint.OnWritingAsync), + (typeof(DomainUser), ResourceDefinitionExtensibilityPoint.OnWriteSucceededAsync) }, options => options.WithStrictOrdering()); await _testContext.RunOnDatabaseAsync(async dbContext => @@ -342,9 +346,10 @@ await _testContext.RunOnDatabaseAsync(async dbContext => hitCounter.HitExtensibilityPoints.Should().BeEquivalentTo(new[] { - (typeof(DomainUser), ResourceDefinitionHitCounter.ExtensibilityPoint.OnPrepareWriteAsync), - (typeof(DomainUser), ResourceDefinitionHitCounter.ExtensibilityPoint.OnSetToOneRelationshipAsync), - (typeof(DomainUser), ResourceDefinitionHitCounter.ExtensibilityPoint.OnWritingAsync) + (typeof(DomainUser), ResourceDefinitionExtensibilityPoint.OnPrepareWriteAsync), + (typeof(DomainUser), ResourceDefinitionExtensibilityPoint.OnSetToOneRelationshipAsync), + (typeof(DomainUser), ResourceDefinitionExtensibilityPoint.OnWritingAsync), + (typeof(DomainUser), ResourceDefinitionExtensibilityPoint.OnWriteSucceededAsync) }, options => options.WithStrictOrdering()); await _testContext.RunOnDatabaseAsync(async dbContext => @@ -419,9 +424,10 @@ await _testContext.RunOnDatabaseAsync(async dbContext => hitCounter.HitExtensibilityPoints.Should().BeEquivalentTo(new[] { - (typeof(DomainUser), ResourceDefinitionHitCounter.ExtensibilityPoint.OnPrepareWriteAsync), - (typeof(DomainUser), ResourceDefinitionHitCounter.ExtensibilityPoint.OnSetToOneRelationshipAsync), - (typeof(DomainUser), ResourceDefinitionHitCounter.ExtensibilityPoint.OnWritingAsync) + (typeof(DomainUser), ResourceDefinitionExtensibilityPoint.OnPrepareWriteAsync), + (typeof(DomainUser), ResourceDefinitionExtensibilityPoint.OnSetToOneRelationshipAsync), + (typeof(DomainUser), ResourceDefinitionExtensibilityPoint.OnWritingAsync), + (typeof(DomainUser), ResourceDefinitionExtensibilityPoint.OnWriteSucceededAsync) }, options => options.WithStrictOrdering()); await _testContext.RunOnDatabaseAsync(async dbContext => @@ -468,7 +474,8 @@ await _testContext.RunOnDatabaseAsync(async dbContext => hitCounter.HitExtensibilityPoints.Should().BeEquivalentTo(new[] { - (typeof(DomainUser), ResourceDefinitionHitCounter.ExtensibilityPoint.OnWritingAsync) + (typeof(DomainUser), ResourceDefinitionExtensibilityPoint.OnWritingAsync), + (typeof(DomainUser), ResourceDefinitionExtensibilityPoint.OnWriteSucceededAsync) }, options => options.WithStrictOrdering()); await _testContext.RunOnDatabaseAsync(async dbContext => @@ -509,7 +516,8 @@ await _testContext.RunOnDatabaseAsync(async dbContext => hitCounter.HitExtensibilityPoints.Should().BeEquivalentTo(new[] { - (typeof(DomainUser), ResourceDefinitionHitCounter.ExtensibilityPoint.OnWritingAsync) + (typeof(DomainUser), ResourceDefinitionExtensibilityPoint.OnWritingAsync), + (typeof(DomainUser), ResourceDefinitionExtensibilityPoint.OnWriteSucceededAsync) }, options => options.WithStrictOrdering()); await _testContext.RunOnDatabaseAsync(async dbContext => @@ -559,9 +567,10 @@ await _testContext.RunOnDatabaseAsync(async dbContext => hitCounter.HitExtensibilityPoints.Should().BeEquivalentTo(new[] { - (typeof(DomainUser), ResourceDefinitionHitCounter.ExtensibilityPoint.OnPrepareWriteAsync), - (typeof(DomainUser), ResourceDefinitionHitCounter.ExtensibilityPoint.OnSetToOneRelationshipAsync), - (typeof(DomainUser), ResourceDefinitionHitCounter.ExtensibilityPoint.OnWritingAsync) + (typeof(DomainUser), ResourceDefinitionExtensibilityPoint.OnPrepareWriteAsync), + (typeof(DomainUser), ResourceDefinitionExtensibilityPoint.OnSetToOneRelationshipAsync), + (typeof(DomainUser), ResourceDefinitionExtensibilityPoint.OnWritingAsync), + (typeof(DomainUser), ResourceDefinitionExtensibilityPoint.OnWriteSucceededAsync) }, options => options.WithStrictOrdering()); await _testContext.RunOnDatabaseAsync(async dbContext => @@ -612,9 +621,10 @@ await _testContext.RunOnDatabaseAsync(async dbContext => hitCounter.HitExtensibilityPoints.Should().BeEquivalentTo(new[] { - (typeof(DomainUser), ResourceDefinitionHitCounter.ExtensibilityPoint.OnPrepareWriteAsync), - (typeof(DomainUser), ResourceDefinitionHitCounter.ExtensibilityPoint.OnSetToOneRelationshipAsync), - (typeof(DomainUser), ResourceDefinitionHitCounter.ExtensibilityPoint.OnWritingAsync) + (typeof(DomainUser), ResourceDefinitionExtensibilityPoint.OnPrepareWriteAsync), + (typeof(DomainUser), ResourceDefinitionExtensibilityPoint.OnSetToOneRelationshipAsync), + (typeof(DomainUser), ResourceDefinitionExtensibilityPoint.OnWritingAsync), + (typeof(DomainUser), ResourceDefinitionExtensibilityPoint.OnWriteSucceededAsync) }, options => options.WithStrictOrdering()); await _testContext.RunOnDatabaseAsync(async dbContext => @@ -667,9 +677,10 @@ await _testContext.RunOnDatabaseAsync(async dbContext => hitCounter.HitExtensibilityPoints.Should().BeEquivalentTo(new[] { - (typeof(DomainUser), ResourceDefinitionHitCounter.ExtensibilityPoint.OnPrepareWriteAsync), - (typeof(DomainUser), ResourceDefinitionHitCounter.ExtensibilityPoint.OnSetToOneRelationshipAsync), - (typeof(DomainUser), ResourceDefinitionHitCounter.ExtensibilityPoint.OnWritingAsync) + (typeof(DomainUser), ResourceDefinitionExtensibilityPoint.OnPrepareWriteAsync), + (typeof(DomainUser), ResourceDefinitionExtensibilityPoint.OnSetToOneRelationshipAsync), + (typeof(DomainUser), ResourceDefinitionExtensibilityPoint.OnWritingAsync), + (typeof(DomainUser), ResourceDefinitionExtensibilityPoint.OnWriteSucceededAsync) }, options => options.WithStrictOrdering()); await _testContext.RunOnDatabaseAsync(async dbContext => diff --git a/test/JsonApiDotNetCoreTests/IntegrationTests/Microservices/TransactionalOutboxPattern/OutboxTests.cs b/test/JsonApiDotNetCoreTests/IntegrationTests/Microservices/TransactionalOutboxPattern/OutboxTests.cs index e864f8f87a..961a66feac 100644 --- a/test/JsonApiDotNetCoreTests/IntegrationTests/Microservices/TransactionalOutboxPattern/OutboxTests.cs +++ b/test/JsonApiDotNetCoreTests/IntegrationTests/Microservices/TransactionalOutboxPattern/OutboxTests.cs @@ -94,8 +94,8 @@ await _testContext.RunOnDatabaseAsync(async dbContext => hitCounter.HitExtensibilityPoints.Should().BeEquivalentTo(new[] { - (typeof(DomainGroup), ResourceDefinitionHitCounter.ExtensibilityPoint.OnAddToRelationshipAsync), - (typeof(DomainGroup), ResourceDefinitionHitCounter.ExtensibilityPoint.OnWritingAsync) + (typeof(DomainGroup), ResourceDefinitionExtensibilityPoint.OnAddToRelationshipAsync), + (typeof(DomainGroup), ResourceDefinitionExtensibilityPoint.OnWritingAsync) }, options => options.WithStrictOrdering()); await _testContext.RunOnDatabaseAsync(async dbContext => diff --git a/test/JsonApiDotNetCoreTests/IntegrationTests/Microservices/TransactionalOutboxPattern/OutboxUserDefinition.cs b/test/JsonApiDotNetCoreTests/IntegrationTests/Microservices/TransactionalOutboxPattern/OutboxUserDefinition.cs index 82d02736b2..c071842d09 100644 --- a/test/JsonApiDotNetCoreTests/IntegrationTests/Microservices/TransactionalOutboxPattern/OutboxUserDefinition.cs +++ b/test/JsonApiDotNetCoreTests/IntegrationTests/Microservices/TransactionalOutboxPattern/OutboxUserDefinition.cs @@ -11,21 +11,19 @@ namespace JsonApiDotNetCoreTests.IntegrationTests.Microservices.TransactionalOut [UsedImplicitly(ImplicitUseKindFlags.InstantiatedNoFixedConstructorSignature)] public sealed class OutboxUserDefinition : MessagingUserDefinition { - private readonly ResourceDefinitionHitCounter _hitCounter; private readonly DbSet _outboxMessageSet; public OutboxUserDefinition(IResourceGraph resourceGraph, OutboxDbContext dbContext, ResourceDefinitionHitCounter hitCounter) : base(resourceGraph, dbContext.Users, hitCounter) { - _hitCounter = hitCounter; _outboxMessageSet = dbContext.OutboxMessages; } - public override Task OnWritingAsync(DomainUser user, WriteOperationKind writeOperation, CancellationToken cancellationToken) + public override async Task OnWritingAsync(DomainUser user, WriteOperationKind writeOperation, CancellationToken cancellationToken) { - _hitCounter.TrackInvocation(ResourceDefinitionHitCounter.ExtensibilityPoint.OnWritingAsync); + await base.OnWritingAsync(user, writeOperation, cancellationToken); - return FinishWriteAsync(user, writeOperation, cancellationToken); + await FinishWriteAsync(user, writeOperation, cancellationToken); } protected override async Task FlushMessageAsync(OutgoingMessage message, CancellationToken cancellationToken) diff --git a/test/JsonApiDotNetCoreTests/IntegrationTests/ResourceDefinitionExtensibilityPoint.cs b/test/JsonApiDotNetCoreTests/IntegrationTests/ResourceDefinitionExtensibilityPoint.cs new file mode 100644 index 0000000000..fc99a3d061 --- /dev/null +++ b/test/JsonApiDotNetCoreTests/IntegrationTests/ResourceDefinitionExtensibilityPoint.cs @@ -0,0 +1,39 @@ +using System; +using JsonApiDotNetCore.Resources; + +namespace JsonApiDotNetCoreTests.IntegrationTests +{ + /// + /// Lists the various extensibility points on . + /// + [Flags] + public enum ResourceDefinitionExtensibilityPoint + { + OnApplyIncludes = 1, + OnApplyFilter = 1 << 1, + OnApplySort = 1 << 2, + OnApplyPagination = 1 << 3, + OnApplySparseFieldSet = 1 << 4, + OnRegisterQueryableHandlersForQueryStringParameters = 1 << 5, + GetMeta = 1 << 6, + OnPrepareWriteAsync = 1 << 7, + OnSetToOneRelationshipAsync = 1 << 8, + OnSetToManyRelationshipAsync = 1 << 9, + OnAddToRelationshipAsync = 1 << 10, + OnRemoveFromRelationshipAsync = 1 << 11, + OnWritingAsync = 1 << 12, + OnWriteSucceededAsync = 1 << 13, + OnDeserialize = 1 << 14, + OnSerialize = 1 << 15, + + Reading = OnApplyIncludes | OnApplyFilter | OnApplySort | OnApplyPagination | OnApplySparseFieldSet | + OnRegisterQueryableHandlersForQueryStringParameters | GetMeta, + + Writing = OnPrepareWriteAsync | OnSetToOneRelationshipAsync | OnSetToManyRelationshipAsync | OnAddToRelationshipAsync | OnRemoveFromRelationshipAsync | + OnWritingAsync | OnWriteSucceededAsync, + + Serialization = OnDeserialize | OnSerialize, + + All = Reading | Writing | Serialization + } +} diff --git a/test/JsonApiDotNetCoreTests/IntegrationTests/ResourceDefinitionHitCounter.cs b/test/JsonApiDotNetCoreTests/IntegrationTests/ResourceDefinitionHitCounter.cs index 3bbe48baea..3d465119fd 100644 --- a/test/JsonApiDotNetCoreTests/IntegrationTests/ResourceDefinitionHitCounter.cs +++ b/test/JsonApiDotNetCoreTests/IntegrationTests/ResourceDefinitionHitCounter.cs @@ -5,13 +5,13 @@ namespace JsonApiDotNetCoreTests.IntegrationTests { /// - /// This is used solely in our tests, so we can assert which calls were made. + /// Used to keep track of invocations on callback methods. /// public sealed class ResourceDefinitionHitCounter { - internal IList<(Type, ExtensibilityPoint)> HitExtensibilityPoints { get; } = new List<(Type, ExtensibilityPoint)>(); + internal IList<(Type, ResourceDefinitionExtensibilityPoint)> HitExtensibilityPoints { get; } = new List<(Type, ResourceDefinitionExtensibilityPoint)>(); - internal void TrackInvocation(ExtensibilityPoint extensibilityPoint) + internal void TrackInvocation(ResourceDefinitionExtensibilityPoint extensibilityPoint) where TResource : IIdentifiable { HitExtensibilityPoints.Add((typeof(TResource), extensibilityPoint)); @@ -21,25 +21,5 @@ internal void Reset() { HitExtensibilityPoints.Clear(); } - - internal enum ExtensibilityPoint - { - OnApplyIncludes, - OnApplyFilter, - OnApplySort, - OnApplyPagination, - OnApplySparseFieldSet, - OnRegisterQueryableHandlersForQueryStringParameters, - GetMeta, - OnPrepareWriteAsync, - OnSetToOneRelationshipAsync, - OnSetToManyRelationshipAsync, - OnAddToRelationshipAsync, - OnRemoveFromRelationshipAsync, - OnWritingAsync, - OnWriteSucceededAsync, - OnDeserialize, - OnSerialize - } } } diff --git a/test/JsonApiDotNetCoreTests/IntegrationTests/ResourceDefinitions/Reading/MoonDefinition.cs b/test/JsonApiDotNetCoreTests/IntegrationTests/ResourceDefinitions/Reading/MoonDefinition.cs index 5cc3594e0c..ae496b96a8 100644 --- a/test/JsonApiDotNetCoreTests/IntegrationTests/ResourceDefinitions/Reading/MoonDefinition.cs +++ b/test/JsonApiDotNetCoreTests/IntegrationTests/ResourceDefinitions/Reading/MoonDefinition.cs @@ -10,24 +10,24 @@ namespace JsonApiDotNetCoreTests.IntegrationTests.ResourceDefinitions.Reading { [UsedImplicitly(ImplicitUseKindFlags.InstantiatedNoFixedConstructorSignature)] - public sealed class MoonDefinition : JsonApiResourceDefinition + public sealed class MoonDefinition : HitCountingResourceDefinition { private readonly IClientSettingsProvider _clientSettingsProvider; - private readonly ResourceDefinitionHitCounter _hitCounter; + + protected override ResourceDefinitionExtensibilityPoint ExtensibilityPointsToTrack => ResourceDefinitionExtensibilityPoint.Reading; public MoonDefinition(IResourceGraph resourceGraph, IClientSettingsProvider clientSettingsProvider, ResourceDefinitionHitCounter hitCounter) - : base(resourceGraph) + : base(resourceGraph, hitCounter) { // This constructor will be resolved from the container, which means // you can take on any dependency that is also defined in the container. _clientSettingsProvider = clientSettingsProvider; - _hitCounter = hitCounter; } public override IImmutableSet OnApplyIncludes(IImmutableSet existingIncludes) { - _hitCounter.TrackInvocation(ResourceDefinitionHitCounter.ExtensibilityPoint.OnApplyIncludes); + base.OnApplyIncludes(existingIncludes); if (!_clientSettingsProvider.IsMoonOrbitingPlanetAutoIncluded || existingIncludes.Any(include => include.Relationship.Property.Name == nameof(Moon.OrbitsAround))) @@ -42,7 +42,7 @@ public override IImmutableSet OnApplyIncludes(IImmutab public override QueryStringParameterHandlers OnRegisterQueryableHandlersForQueryStringParameters() { - _hitCounter.TrackInvocation(ResourceDefinitionHitCounter.ExtensibilityPoint.OnRegisterQueryableHandlersForQueryStringParameters); + base.OnRegisterQueryableHandlersForQueryStringParameters(); return new QueryStringParameterHandlers { diff --git a/test/JsonApiDotNetCoreTests/IntegrationTests/ResourceDefinitions/Reading/PlanetDefinition.cs b/test/JsonApiDotNetCoreTests/IntegrationTests/ResourceDefinitions/Reading/PlanetDefinition.cs index 73a7b9c7db..399eacd27a 100644 --- a/test/JsonApiDotNetCoreTests/IntegrationTests/ResourceDefinitions/Reading/PlanetDefinition.cs +++ b/test/JsonApiDotNetCoreTests/IntegrationTests/ResourceDefinitions/Reading/PlanetDefinition.cs @@ -5,31 +5,30 @@ using JsonApiDotNetCore.Configuration; using JsonApiDotNetCore.Errors; using JsonApiDotNetCore.Queries.Expressions; -using JsonApiDotNetCore.Resources; using JsonApiDotNetCore.Resources.Annotations; using JsonApiDotNetCore.Serialization.Objects; namespace JsonApiDotNetCoreTests.IntegrationTests.ResourceDefinitions.Reading { [UsedImplicitly(ImplicitUseKindFlags.InstantiatedNoFixedConstructorSignature)] - public sealed class PlanetDefinition : JsonApiResourceDefinition + public sealed class PlanetDefinition : HitCountingResourceDefinition { private readonly IClientSettingsProvider _clientSettingsProvider; - private readonly ResourceDefinitionHitCounter _hitCounter; + + protected override ResourceDefinitionExtensibilityPoint ExtensibilityPointsToTrack => ResourceDefinitionExtensibilityPoint.Reading; public PlanetDefinition(IResourceGraph resourceGraph, IClientSettingsProvider clientSettingsProvider, ResourceDefinitionHitCounter hitCounter) - : base(resourceGraph) + : base(resourceGraph, hitCounter) { // This constructor will be resolved from the container, which means // you can take on any dependency that is also defined in the container. _clientSettingsProvider = clientSettingsProvider; - _hitCounter = hitCounter; } public override IImmutableSet OnApplyIncludes(IImmutableSet existingIncludes) { - _hitCounter.TrackInvocation(ResourceDefinitionHitCounter.ExtensibilityPoint.OnApplyIncludes); + base.OnApplyIncludes(existingIncludes); if (_clientSettingsProvider.IsIncludePlanetMoonsBlocked && existingIncludes.Any(include => include.Relationship.Property.Name == nameof(Planet.Moons))) @@ -45,7 +44,7 @@ public override IImmutableSet OnApplyIncludes(IImmutab public override FilterExpression? OnApplyFilter(FilterExpression? existingFilter) { - _hitCounter.TrackInvocation(ResourceDefinitionHitCounter.ExtensibilityPoint.OnApplyFilter); + base.OnApplyFilter(existingFilter); if (_clientSettingsProvider.ArePlanetsWithPrivateNameHidden) { diff --git a/test/JsonApiDotNetCoreTests/IntegrationTests/ResourceDefinitions/Reading/ResourceDefinitionReadTests.cs b/test/JsonApiDotNetCoreTests/IntegrationTests/ResourceDefinitions/Reading/ResourceDefinitionReadTests.cs index eec7e8a4bf..5da638c2ef 100644 --- a/test/JsonApiDotNetCoreTests/IntegrationTests/ResourceDefinitions/Reading/ResourceDefinitionReadTests.cs +++ b/test/JsonApiDotNetCoreTests/IntegrationTests/ResourceDefinitions/Reading/ResourceDefinitionReadTests.cs @@ -81,9 +81,12 @@ await _testContext.RunOnDatabaseAsync(async dbContext => hitCounter.HitExtensibilityPoints.Should().BeEquivalentTo(new[] { - (typeof(Planet), ResourceDefinitionHitCounter.ExtensibilityPoint.OnApplyFilter), - (typeof(Planet), ResourceDefinitionHitCounter.ExtensibilityPoint.OnApplyFilter), - (typeof(Planet), ResourceDefinitionHitCounter.ExtensibilityPoint.OnApplyIncludes) + (typeof(Planet), ResourceDefinitionExtensibilityPoint.OnApplyFilter), + (typeof(Planet), ResourceDefinitionExtensibilityPoint.OnApplyPagination), + (typeof(Planet), ResourceDefinitionExtensibilityPoint.OnApplyFilter), + (typeof(Planet), ResourceDefinitionExtensibilityPoint.OnApplySort), + (typeof(Planet), ResourceDefinitionExtensibilityPoint.OnApplySparseFieldSet), + (typeof(Planet), ResourceDefinitionExtensibilityPoint.OnApplyIncludes) }, options => options.WithStrictOrdering()); } @@ -130,8 +133,17 @@ await _testContext.RunOnDatabaseAsync(async dbContext => hitCounter.HitExtensibilityPoints.Should().BeEquivalentTo(new[] { - (typeof(Moon), ResourceDefinitionHitCounter.ExtensibilityPoint.OnApplyIncludes), - (typeof(Planet), ResourceDefinitionHitCounter.ExtensibilityPoint.OnApplyIncludes) + (typeof(Moon), ResourceDefinitionExtensibilityPoint.OnApplyPagination), + (typeof(Moon), ResourceDefinitionExtensibilityPoint.OnApplyFilter), + (typeof(Moon), ResourceDefinitionExtensibilityPoint.OnApplySort), + (typeof(Moon), ResourceDefinitionExtensibilityPoint.OnApplySparseFieldSet), + (typeof(Moon), ResourceDefinitionExtensibilityPoint.OnApplyIncludes), + (typeof(Planet), ResourceDefinitionExtensibilityPoint.OnApplySparseFieldSet), + (typeof(Planet), ResourceDefinitionExtensibilityPoint.OnApplyIncludes), + (typeof(Moon), ResourceDefinitionExtensibilityPoint.OnApplySparseFieldSet), + (typeof(Moon), ResourceDefinitionExtensibilityPoint.GetMeta), + (typeof(Planet), ResourceDefinitionExtensibilityPoint.OnApplySparseFieldSet), + (typeof(Planet), ResourceDefinitionExtensibilityPoint.GetMeta) }, options => options.WithStrictOrdering()); } @@ -178,10 +190,21 @@ await _testContext.RunOnDatabaseAsync(async dbContext => hitCounter.HitExtensibilityPoints.Should().BeEquivalentTo(new[] { - (typeof(Planet), ResourceDefinitionHitCounter.ExtensibilityPoint.OnApplyFilter), - (typeof(Planet), ResourceDefinitionHitCounter.ExtensibilityPoint.OnApplyIncludes), - (typeof(Moon), ResourceDefinitionHitCounter.ExtensibilityPoint.OnApplyIncludes), - (typeof(Planet), ResourceDefinitionHitCounter.ExtensibilityPoint.OnApplyIncludes) + (typeof(Planet), ResourceDefinitionExtensibilityPoint.OnApplyPagination), + (typeof(Planet), ResourceDefinitionExtensibilityPoint.OnApplyFilter), + (typeof(Planet), ResourceDefinitionExtensibilityPoint.OnApplySort), + (typeof(Planet), ResourceDefinitionExtensibilityPoint.OnApplySparseFieldSet), + (typeof(Planet), ResourceDefinitionExtensibilityPoint.OnApplyIncludes), + (typeof(Moon), ResourceDefinitionExtensibilityPoint.OnApplyFilter), + (typeof(Moon), ResourceDefinitionExtensibilityPoint.OnApplySort), + (typeof(Moon), ResourceDefinitionExtensibilityPoint.OnApplyPagination), + (typeof(Moon), ResourceDefinitionExtensibilityPoint.OnApplySparseFieldSet), + (typeof(Moon), ResourceDefinitionExtensibilityPoint.OnApplyIncludes), + (typeof(Planet), ResourceDefinitionExtensibilityPoint.OnApplyIncludes), + (typeof(Planet), ResourceDefinitionExtensibilityPoint.OnApplySparseFieldSet), + (typeof(Planet), ResourceDefinitionExtensibilityPoint.GetMeta), + (typeof(Moon), ResourceDefinitionExtensibilityPoint.OnApplySparseFieldSet), + (typeof(Moon), ResourceDefinitionExtensibilityPoint.GetMeta) }, options => options.WithStrictOrdering()); } @@ -225,9 +248,15 @@ await _testContext.RunOnDatabaseAsync(async dbContext => hitCounter.HitExtensibilityPoints.Should().BeEquivalentTo(new[] { - (typeof(Planet), ResourceDefinitionHitCounter.ExtensibilityPoint.OnApplyFilter), - (typeof(Planet), ResourceDefinitionHitCounter.ExtensibilityPoint.OnApplyFilter), - (typeof(Planet), ResourceDefinitionHitCounter.ExtensibilityPoint.OnApplyIncludes) + (typeof(Planet), ResourceDefinitionExtensibilityPoint.OnApplyFilter), + (typeof(Planet), ResourceDefinitionExtensibilityPoint.OnApplyPagination), + (typeof(Planet), ResourceDefinitionExtensibilityPoint.OnApplyFilter), + (typeof(Planet), ResourceDefinitionExtensibilityPoint.OnApplySort), + (typeof(Planet), ResourceDefinitionExtensibilityPoint.OnApplySparseFieldSet), + (typeof(Planet), ResourceDefinitionExtensibilityPoint.OnApplyIncludes), + (typeof(Planet), ResourceDefinitionExtensibilityPoint.OnApplySparseFieldSet), + (typeof(Planet), ResourceDefinitionExtensibilityPoint.GetMeta), + (typeof(Planet), ResourceDefinitionExtensibilityPoint.GetMeta) }, options => options.WithStrictOrdering()); } @@ -278,9 +307,14 @@ await _testContext.RunOnDatabaseAsync(async dbContext => hitCounter.HitExtensibilityPoints.Should().BeEquivalentTo(new[] { - (typeof(Planet), ResourceDefinitionHitCounter.ExtensibilityPoint.OnApplyFilter), - (typeof(Planet), ResourceDefinitionHitCounter.ExtensibilityPoint.OnApplyFilter), - (typeof(Planet), ResourceDefinitionHitCounter.ExtensibilityPoint.OnApplyIncludes) + (typeof(Planet), ResourceDefinitionExtensibilityPoint.OnApplyFilter), + (typeof(Planet), ResourceDefinitionExtensibilityPoint.OnApplyPagination), + (typeof(Planet), ResourceDefinitionExtensibilityPoint.OnApplyFilter), + (typeof(Planet), ResourceDefinitionExtensibilityPoint.OnApplySort), + (typeof(Planet), ResourceDefinitionExtensibilityPoint.OnApplySparseFieldSet), + (typeof(Planet), ResourceDefinitionExtensibilityPoint.OnApplyIncludes), + (typeof(Planet), ResourceDefinitionExtensibilityPoint.OnApplySparseFieldSet), + (typeof(Planet), ResourceDefinitionExtensibilityPoint.GetMeta) }, options => options.WithStrictOrdering()); } @@ -323,10 +357,16 @@ await _testContext.RunOnDatabaseAsync(async dbContext => hitCounter.HitExtensibilityPoints.Should().BeEquivalentTo(new[] { - (typeof(Star), ResourceDefinitionHitCounter.ExtensibilityPoint.OnApplyPagination), - (typeof(Star), ResourceDefinitionHitCounter.ExtensibilityPoint.OnApplySort), - (typeof(Star), ResourceDefinitionHitCounter.ExtensibilityPoint.OnApplySparseFieldSet), - (typeof(Star), ResourceDefinitionHitCounter.ExtensibilityPoint.OnApplySparseFieldSet) + (typeof(Star), ResourceDefinitionExtensibilityPoint.OnApplyFilter), + (typeof(Star), ResourceDefinitionExtensibilityPoint.OnApplyPagination), + (typeof(Star), ResourceDefinitionExtensibilityPoint.OnApplyFilter), + (typeof(Star), ResourceDefinitionExtensibilityPoint.OnApplySort), + (typeof(Star), ResourceDefinitionExtensibilityPoint.OnApplySparseFieldSet), + (typeof(Star), ResourceDefinitionExtensibilityPoint.OnApplyIncludes), + (typeof(Star), ResourceDefinitionExtensibilityPoint.OnApplySparseFieldSet), + (typeof(Star), ResourceDefinitionExtensibilityPoint.GetMeta), + (typeof(Star), ResourceDefinitionExtensibilityPoint.GetMeta), + (typeof(Star), ResourceDefinitionExtensibilityPoint.GetMeta) }, options => options.WithStrictOrdering()); } @@ -369,10 +409,16 @@ await _testContext.RunOnDatabaseAsync(async dbContext => hitCounter.HitExtensibilityPoints.Should().BeEquivalentTo(new[] { - (typeof(Star), ResourceDefinitionHitCounter.ExtensibilityPoint.OnApplyPagination), - (typeof(Star), ResourceDefinitionHitCounter.ExtensibilityPoint.OnApplySort), - (typeof(Star), ResourceDefinitionHitCounter.ExtensibilityPoint.OnApplySparseFieldSet), - (typeof(Star), ResourceDefinitionHitCounter.ExtensibilityPoint.OnApplySparseFieldSet) + (typeof(Star), ResourceDefinitionExtensibilityPoint.OnApplyFilter), + (typeof(Star), ResourceDefinitionExtensibilityPoint.OnApplyPagination), + (typeof(Star), ResourceDefinitionExtensibilityPoint.OnApplyFilter), + (typeof(Star), ResourceDefinitionExtensibilityPoint.OnApplySort), + (typeof(Star), ResourceDefinitionExtensibilityPoint.OnApplySparseFieldSet), + (typeof(Star), ResourceDefinitionExtensibilityPoint.OnApplyIncludes), + (typeof(Star), ResourceDefinitionExtensibilityPoint.OnApplySparseFieldSet), + (typeof(Star), ResourceDefinitionExtensibilityPoint.GetMeta), + (typeof(Star), ResourceDefinitionExtensibilityPoint.GetMeta), + (typeof(Star), ResourceDefinitionExtensibilityPoint.GetMeta) }, options => options.WithStrictOrdering()); } @@ -403,10 +449,18 @@ await _testContext.RunOnDatabaseAsync(async dbContext => hitCounter.HitExtensibilityPoints.Should().BeEquivalentTo(new[] { - (typeof(Star), ResourceDefinitionHitCounter.ExtensibilityPoint.OnApplyPagination), - (typeof(Star), ResourceDefinitionHitCounter.ExtensibilityPoint.OnApplySort), - (typeof(Star), ResourceDefinitionHitCounter.ExtensibilityPoint.OnApplySparseFieldSet), - (typeof(Star), ResourceDefinitionHitCounter.ExtensibilityPoint.OnApplySparseFieldSet) + (typeof(Star), ResourceDefinitionExtensibilityPoint.OnApplyFilter), + (typeof(Star), ResourceDefinitionExtensibilityPoint.OnApplyPagination), + (typeof(Star), ResourceDefinitionExtensibilityPoint.OnApplyFilter), + (typeof(Star), ResourceDefinitionExtensibilityPoint.OnApplySort), + (typeof(Star), ResourceDefinitionExtensibilityPoint.OnApplySparseFieldSet), + (typeof(Star), ResourceDefinitionExtensibilityPoint.OnApplyIncludes), + (typeof(Star), ResourceDefinitionExtensibilityPoint.OnApplySparseFieldSet), + (typeof(Star), ResourceDefinitionExtensibilityPoint.GetMeta), + (typeof(Star), ResourceDefinitionExtensibilityPoint.GetMeta), + (typeof(Star), ResourceDefinitionExtensibilityPoint.GetMeta), + (typeof(Star), ResourceDefinitionExtensibilityPoint.GetMeta), + (typeof(Star), ResourceDefinitionExtensibilityPoint.GetMeta) }, options => options.WithStrictOrdering()); } @@ -440,10 +494,13 @@ await _testContext.RunOnDatabaseAsync(async dbContext => hitCounter.HitExtensibilityPoints.Should().BeEquivalentTo(new[] { - (typeof(Star), ResourceDefinitionHitCounter.ExtensibilityPoint.OnApplyPagination), - (typeof(Star), ResourceDefinitionHitCounter.ExtensibilityPoint.OnApplySort), - (typeof(Star), ResourceDefinitionHitCounter.ExtensibilityPoint.OnApplySparseFieldSet), - (typeof(Star), ResourceDefinitionHitCounter.ExtensibilityPoint.OnApplySparseFieldSet) + (typeof(Star), ResourceDefinitionExtensibilityPoint.OnApplyPagination), + (typeof(Star), ResourceDefinitionExtensibilityPoint.OnApplyFilter), + (typeof(Star), ResourceDefinitionExtensibilityPoint.OnApplySort), + (typeof(Star), ResourceDefinitionExtensibilityPoint.OnApplySparseFieldSet), + (typeof(Star), ResourceDefinitionExtensibilityPoint.OnApplyIncludes), + (typeof(Star), ResourceDefinitionExtensibilityPoint.OnApplySparseFieldSet), + (typeof(Star), ResourceDefinitionExtensibilityPoint.GetMeta) }, options => options.WithStrictOrdering()); } @@ -478,10 +535,13 @@ await _testContext.RunOnDatabaseAsync(async dbContext => hitCounter.HitExtensibilityPoints.Should().BeEquivalentTo(new[] { - (typeof(Star), ResourceDefinitionHitCounter.ExtensibilityPoint.OnApplyPagination), - (typeof(Star), ResourceDefinitionHitCounter.ExtensibilityPoint.OnApplySort), - (typeof(Star), ResourceDefinitionHitCounter.ExtensibilityPoint.OnApplySparseFieldSet), - (typeof(Star), ResourceDefinitionHitCounter.ExtensibilityPoint.OnApplySparseFieldSet) + (typeof(Star), ResourceDefinitionExtensibilityPoint.OnApplyPagination), + (typeof(Star), ResourceDefinitionExtensibilityPoint.OnApplyFilter), + (typeof(Star), ResourceDefinitionExtensibilityPoint.OnApplySort), + (typeof(Star), ResourceDefinitionExtensibilityPoint.OnApplySparseFieldSet), + (typeof(Star), ResourceDefinitionExtensibilityPoint.OnApplyIncludes), + (typeof(Star), ResourceDefinitionExtensibilityPoint.OnApplySparseFieldSet), + (typeof(Star), ResourceDefinitionExtensibilityPoint.GetMeta) }, options => options.WithStrictOrdering()); } @@ -515,10 +575,13 @@ await _testContext.RunOnDatabaseAsync(async dbContext => hitCounter.HitExtensibilityPoints.Should().BeEquivalentTo(new[] { - (typeof(Star), ResourceDefinitionHitCounter.ExtensibilityPoint.OnApplyPagination), - (typeof(Star), ResourceDefinitionHitCounter.ExtensibilityPoint.OnApplySort), - (typeof(Star), ResourceDefinitionHitCounter.ExtensibilityPoint.OnApplySparseFieldSet), - (typeof(Star), ResourceDefinitionHitCounter.ExtensibilityPoint.OnApplySparseFieldSet) + (typeof(Star), ResourceDefinitionExtensibilityPoint.OnApplyPagination), + (typeof(Star), ResourceDefinitionExtensibilityPoint.OnApplyFilter), + (typeof(Star), ResourceDefinitionExtensibilityPoint.OnApplySort), + (typeof(Star), ResourceDefinitionExtensibilityPoint.OnApplySparseFieldSet), + (typeof(Star), ResourceDefinitionExtensibilityPoint.OnApplyIncludes), + (typeof(Star), ResourceDefinitionExtensibilityPoint.OnApplySparseFieldSet), + (typeof(Star), ResourceDefinitionExtensibilityPoint.GetMeta) }, options => options.WithStrictOrdering()); } @@ -552,10 +615,13 @@ await _testContext.RunOnDatabaseAsync(async dbContext => hitCounter.HitExtensibilityPoints.Should().BeEquivalentTo(new[] { - (typeof(Star), ResourceDefinitionHitCounter.ExtensibilityPoint.OnApplyPagination), - (typeof(Star), ResourceDefinitionHitCounter.ExtensibilityPoint.OnApplySort), - (typeof(Star), ResourceDefinitionHitCounter.ExtensibilityPoint.OnApplySparseFieldSet), - (typeof(Star), ResourceDefinitionHitCounter.ExtensibilityPoint.OnApplySparseFieldSet) + (typeof(Star), ResourceDefinitionExtensibilityPoint.OnApplyPagination), + (typeof(Star), ResourceDefinitionExtensibilityPoint.OnApplyFilter), + (typeof(Star), ResourceDefinitionExtensibilityPoint.OnApplySort), + (typeof(Star), ResourceDefinitionExtensibilityPoint.OnApplySparseFieldSet), + (typeof(Star), ResourceDefinitionExtensibilityPoint.OnApplyIncludes), + (typeof(Star), ResourceDefinitionExtensibilityPoint.OnApplySparseFieldSet), + (typeof(Star), ResourceDefinitionExtensibilityPoint.GetMeta) }, options => options.WithStrictOrdering()); } @@ -593,9 +659,16 @@ await _testContext.RunOnDatabaseAsync(async dbContext => hitCounter.HitExtensibilityPoints.Should().BeEquivalentTo(new[] { - (typeof(Moon), ResourceDefinitionHitCounter.ExtensibilityPoint.OnRegisterQueryableHandlersForQueryStringParameters), - (typeof(Moon), ResourceDefinitionHitCounter.ExtensibilityPoint.OnRegisterQueryableHandlersForQueryStringParameters), - (typeof(Moon), ResourceDefinitionHitCounter.ExtensibilityPoint.OnApplyIncludes) + (typeof(Moon), ResourceDefinitionExtensibilityPoint.OnRegisterQueryableHandlersForQueryStringParameters), + (typeof(Moon), ResourceDefinitionExtensibilityPoint.OnRegisterQueryableHandlersForQueryStringParameters), + (typeof(Moon), ResourceDefinitionExtensibilityPoint.OnApplyFilter), + (typeof(Moon), ResourceDefinitionExtensibilityPoint.OnApplyPagination), + (typeof(Moon), ResourceDefinitionExtensibilityPoint.OnApplyFilter), + (typeof(Moon), ResourceDefinitionExtensibilityPoint.OnApplySort), + (typeof(Moon), ResourceDefinitionExtensibilityPoint.OnApplySparseFieldSet), + (typeof(Moon), ResourceDefinitionExtensibilityPoint.OnApplyIncludes), + (typeof(Moon), ResourceDefinitionExtensibilityPoint.OnApplySparseFieldSet), + (typeof(Moon), ResourceDefinitionExtensibilityPoint.GetMeta) }, options => options.WithStrictOrdering()); } @@ -643,9 +716,16 @@ await _testContext.RunOnDatabaseAsync(async dbContext => hitCounter.HitExtensibilityPoints.Should().BeEquivalentTo(new[] { - (typeof(Moon), ResourceDefinitionHitCounter.ExtensibilityPoint.OnRegisterQueryableHandlersForQueryStringParameters), - (typeof(Moon), ResourceDefinitionHitCounter.ExtensibilityPoint.OnRegisterQueryableHandlersForQueryStringParameters), - (typeof(Moon), ResourceDefinitionHitCounter.ExtensibilityPoint.OnApplyIncludes) + (typeof(Moon), ResourceDefinitionExtensibilityPoint.OnRegisterQueryableHandlersForQueryStringParameters), + (typeof(Moon), ResourceDefinitionExtensibilityPoint.OnRegisterQueryableHandlersForQueryStringParameters), + (typeof(Moon), ResourceDefinitionExtensibilityPoint.OnApplyFilter), + (typeof(Moon), ResourceDefinitionExtensibilityPoint.OnApplyPagination), + (typeof(Moon), ResourceDefinitionExtensibilityPoint.OnApplyFilter), + (typeof(Moon), ResourceDefinitionExtensibilityPoint.OnApplySort), + (typeof(Moon), ResourceDefinitionExtensibilityPoint.OnApplySparseFieldSet), + (typeof(Moon), ResourceDefinitionExtensibilityPoint.OnApplyIncludes), + (typeof(Moon), ResourceDefinitionExtensibilityPoint.OnApplySparseFieldSet), + (typeof(Moon), ResourceDefinitionExtensibilityPoint.GetMeta) }, options => options.WithStrictOrdering()); } @@ -683,7 +763,7 @@ await _testContext.RunOnDatabaseAsync(async dbContext => hitCounter.HitExtensibilityPoints.Should().BeEquivalentTo(new[] { - (typeof(Moon), ResourceDefinitionHitCounter.ExtensibilityPoint.OnRegisterQueryableHandlersForQueryStringParameters) + (typeof(Moon), ResourceDefinitionExtensibilityPoint.OnRegisterQueryableHandlersForQueryStringParameters) }, options => options.WithStrictOrdering()); } } diff --git a/test/JsonApiDotNetCoreTests/IntegrationTests/ResourceDefinitions/Reading/StarDefinition.cs b/test/JsonApiDotNetCoreTests/IntegrationTests/ResourceDefinitions/Reading/StarDefinition.cs index 89d7ccd661..a2b938dea1 100644 --- a/test/JsonApiDotNetCoreTests/IntegrationTests/ResourceDefinitions/Reading/StarDefinition.cs +++ b/test/JsonApiDotNetCoreTests/IntegrationTests/ResourceDefinitions/Reading/StarDefinition.cs @@ -2,27 +2,24 @@ using JetBrains.Annotations; using JsonApiDotNetCore.Configuration; using JsonApiDotNetCore.Queries.Expressions; -using JsonApiDotNetCore.Resources; namespace JsonApiDotNetCoreTests.IntegrationTests.ResourceDefinitions.Reading { [UsedImplicitly(ImplicitUseKindFlags.InstantiatedNoFixedConstructorSignature)] - public sealed class StarDefinition : JsonApiResourceDefinition + public sealed class StarDefinition : HitCountingResourceDefinition { - private readonly ResourceDefinitionHitCounter _hitCounter; + protected override ResourceDefinitionExtensibilityPoint ExtensibilityPointsToTrack => ResourceDefinitionExtensibilityPoint.Reading; public StarDefinition(IResourceGraph resourceGraph, ResourceDefinitionHitCounter hitCounter) - : base(resourceGraph) + : base(resourceGraph, hitCounter) { // This constructor will be resolved from the container, which means // you can take on any dependency that is also defined in the container. - - _hitCounter = hitCounter; } public override SortExpression OnApplySort(SortExpression? existingSort) { - _hitCounter.TrackInvocation(ResourceDefinitionHitCounter.ExtensibilityPoint.OnApplySort); + base.OnApplySort(existingSort); return existingSort ?? GetDefaultSortOrder(); } @@ -38,7 +35,7 @@ private SortExpression GetDefaultSortOrder() public override PaginationExpression OnApplyPagination(PaginationExpression? existingPagination) { - _hitCounter.TrackInvocation(ResourceDefinitionHitCounter.ExtensibilityPoint.OnApplyPagination); + base.OnApplyPagination(existingPagination); var maxPageSize = new PageSize(5); @@ -53,7 +50,7 @@ public override PaginationExpression OnApplyPagination(PaginationExpression? exi public override SparseFieldSetExpression? OnApplySparseFieldSet(SparseFieldSetExpression? existingSparseFieldSet) { - _hitCounter.TrackInvocation(ResourceDefinitionHitCounter.ExtensibilityPoint.OnApplySparseFieldSet); + base.OnApplySparseFieldSet(existingSparseFieldSet); // @formatter:keep_existing_linebreaks true diff --git a/test/JsonApiDotNetCoreTests/IntegrationTests/ResourceDefinitions/Serialization/ResourceDefinitionSerializationTests.cs b/test/JsonApiDotNetCoreTests/IntegrationTests/ResourceDefinitions/Serialization/ResourceDefinitionSerializationTests.cs index 946aa3fe9e..937bbb1957 100644 --- a/test/JsonApiDotNetCoreTests/IntegrationTests/ResourceDefinitions/Serialization/ResourceDefinitionSerializationTests.cs +++ b/test/JsonApiDotNetCoreTests/IntegrationTests/ResourceDefinitions/Serialization/ResourceDefinitionSerializationTests.cs @@ -83,8 +83,8 @@ await _testContext.RunOnDatabaseAsync(async dbContext => hitCounter.HitExtensibilityPoints.Should().BeEquivalentTo(new[] { - (typeof(Student), ResourceDefinitionHitCounter.ExtensibilityPoint.OnSerialize), - (typeof(Student), ResourceDefinitionHitCounter.ExtensibilityPoint.OnSerialize) + (typeof(Student), ResourceDefinitionExtensibilityPoint.OnSerialize), + (typeof(Student), ResourceDefinitionExtensibilityPoint.OnSerialize) }, options => options.WithStrictOrdering()); } @@ -152,10 +152,10 @@ await _testContext.RunOnDatabaseAsync(async dbContext => hitCounter.HitExtensibilityPoints.Should().BeEquivalentTo(new[] { - (typeof(Student), ResourceDefinitionHitCounter.ExtensibilityPoint.OnSerialize), - (typeof(Student), ResourceDefinitionHitCounter.ExtensibilityPoint.OnSerialize), - (typeof(Student), ResourceDefinitionHitCounter.ExtensibilityPoint.OnSerialize), - (typeof(Student), ResourceDefinitionHitCounter.ExtensibilityPoint.OnSerialize) + (typeof(Student), ResourceDefinitionExtensibilityPoint.OnSerialize), + (typeof(Student), ResourceDefinitionExtensibilityPoint.OnSerialize), + (typeof(Student), ResourceDefinitionExtensibilityPoint.OnSerialize), + (typeof(Student), ResourceDefinitionExtensibilityPoint.OnSerialize) }, options => options.WithStrictOrdering()); } @@ -194,7 +194,7 @@ await _testContext.RunOnDatabaseAsync(async dbContext => hitCounter.HitExtensibilityPoints.Should().BeEquivalentTo(new[] { - (typeof(Student), ResourceDefinitionHitCounter.ExtensibilityPoint.OnSerialize) + (typeof(Student), ResourceDefinitionExtensibilityPoint.OnSerialize) }, options => options.WithStrictOrdering()); } @@ -242,8 +242,8 @@ await _testContext.RunOnDatabaseAsync(async dbContext => hitCounter.HitExtensibilityPoints.Should().BeEquivalentTo(new[] { - (typeof(Student), ResourceDefinitionHitCounter.ExtensibilityPoint.OnSerialize), - (typeof(Student), ResourceDefinitionHitCounter.ExtensibilityPoint.OnSerialize) + (typeof(Student), ResourceDefinitionExtensibilityPoint.OnSerialize), + (typeof(Student), ResourceDefinitionExtensibilityPoint.OnSerialize) }, options => options.WithStrictOrdering()); } @@ -283,7 +283,7 @@ await _testContext.RunOnDatabaseAsync(async dbContext => hitCounter.HitExtensibilityPoints.Should().BeEquivalentTo(new[] { - (typeof(Student), ResourceDefinitionHitCounter.ExtensibilityPoint.OnSerialize) + (typeof(Student), ResourceDefinitionExtensibilityPoint.OnSerialize) }, options => options.WithStrictOrdering()); } @@ -325,7 +325,7 @@ await _testContext.RunOnDatabaseAsync(async dbContext => hitCounter.HitExtensibilityPoints.Should().BeEquivalentTo(new[] { - (typeof(Student), ResourceDefinitionHitCounter.ExtensibilityPoint.OnSerialize) + (typeof(Student), ResourceDefinitionExtensibilityPoint.OnSerialize) }, options => options.WithStrictOrdering()); } @@ -381,8 +381,8 @@ await _testContext.RunOnDatabaseAsync(async dbContext => hitCounter.HitExtensibilityPoints.Should().BeEquivalentTo(new[] { - (typeof(Student), ResourceDefinitionHitCounter.ExtensibilityPoint.OnDeserialize), - (typeof(Student), ResourceDefinitionHitCounter.ExtensibilityPoint.OnSerialize) + (typeof(Student), ResourceDefinitionExtensibilityPoint.OnDeserialize), + (typeof(Student), ResourceDefinitionExtensibilityPoint.OnSerialize) }, options => options.WithStrictOrdering()); } @@ -450,7 +450,7 @@ await _testContext.RunOnDatabaseAsync(async dbContext => hitCounter.HitExtensibilityPoints.Should().BeEquivalentTo(new[] { - (typeof(Student), ResourceDefinitionHitCounter.ExtensibilityPoint.OnSerialize) + (typeof(Student), ResourceDefinitionExtensibilityPoint.OnSerialize) }, options => options.WithStrictOrdering()); } @@ -511,8 +511,8 @@ await _testContext.RunOnDatabaseAsync(async dbContext => hitCounter.HitExtensibilityPoints.Should().BeEquivalentTo(new[] { - (typeof(Student), ResourceDefinitionHitCounter.ExtensibilityPoint.OnDeserialize), - (typeof(Student), ResourceDefinitionHitCounter.ExtensibilityPoint.OnSerialize) + (typeof(Student), ResourceDefinitionExtensibilityPoint.OnDeserialize), + (typeof(Student), ResourceDefinitionExtensibilityPoint.OnSerialize) }, options => options.WithStrictOrdering()); } @@ -596,8 +596,8 @@ await _testContext.RunOnDatabaseAsync(async dbContext => hitCounter.HitExtensibilityPoints.Should().BeEquivalentTo(new[] { - (typeof(Student), ResourceDefinitionHitCounter.ExtensibilityPoint.OnSerialize), - (typeof(Student), ResourceDefinitionHitCounter.ExtensibilityPoint.OnSerialize) + (typeof(Student), ResourceDefinitionExtensibilityPoint.OnSerialize), + (typeof(Student), ResourceDefinitionExtensibilityPoint.OnSerialize) }, options => options.WithStrictOrdering()); } diff --git a/test/JsonApiDotNetCoreTests/IntegrationTests/ResourceDefinitions/Serialization/StudentDefinition.cs b/test/JsonApiDotNetCoreTests/IntegrationTests/ResourceDefinitions/Serialization/StudentDefinition.cs index fa1a2d2bf9..4cf10a3594 100644 --- a/test/JsonApiDotNetCoreTests/IntegrationTests/ResourceDefinitions/Serialization/StudentDefinition.cs +++ b/test/JsonApiDotNetCoreTests/IntegrationTests/ResourceDefinitions/Serialization/StudentDefinition.cs @@ -1,28 +1,27 @@ using JetBrains.Annotations; using JsonApiDotNetCore.Configuration; -using JsonApiDotNetCore.Resources; namespace JsonApiDotNetCoreTests.IntegrationTests.ResourceDefinitions.Serialization { [UsedImplicitly(ImplicitUseKindFlags.InstantiatedNoFixedConstructorSignature)] - public sealed class StudentDefinition : JsonApiResourceDefinition + public sealed class StudentDefinition : HitCountingResourceDefinition { private readonly IEncryptionService _encryptionService; - private readonly ResourceDefinitionHitCounter _hitCounter; + + protected override ResourceDefinitionExtensibilityPoint ExtensibilityPointsToTrack => ResourceDefinitionExtensibilityPoint.Serialization; public StudentDefinition(IResourceGraph resourceGraph, IEncryptionService encryptionService, ResourceDefinitionHitCounter hitCounter) - : base(resourceGraph) + : base(resourceGraph, hitCounter) { // This constructor will be resolved from the container, which means // you can take on any dependency that is also defined in the container. _encryptionService = encryptionService; - _hitCounter = hitCounter; } public override void OnDeserialize(Student resource) { - _hitCounter.TrackInvocation(ResourceDefinitionHitCounter.ExtensibilityPoint.OnDeserialize); + base.OnDeserialize(resource); if (!string.IsNullOrEmpty(resource.SocialSecurityNumber)) { @@ -32,7 +31,7 @@ public override void OnDeserialize(Student resource) public override void OnSerialize(Student resource) { - _hitCounter.TrackInvocation(ResourceDefinitionHitCounter.ExtensibilityPoint.OnSerialize); + base.OnSerialize(resource); if (!string.IsNullOrEmpty(resource.SocialSecurityNumber)) { From ad5dc29aba2e79599007e55747f70084468597b0 Mon Sep 17 00:00:00 2001 From: Bart Koelman Date: Wed, 3 Nov 2021 13:09:49 +0100 Subject: [PATCH 3/6] Retrieve total resource count on secondary/relationship endpoints using inverse relationship Bugfix: links.next was not set on full page at relationship endpoint --- .../ResourceSerializationBenchmarks.cs | 2 +- src/JsonApiDotNetCore/CollectionExtensions.cs | 7 ++ .../Queries/Expressions/LogicalExpression.cs | 9 ++ .../Queries/IQueryLayerComposer.cs | 9 +- .../Queries/Internal/QueryLayerComposer.cs | 77 +++++++++++- .../EntityFrameworkCoreRepository.cs | 6 +- .../Repositories/IResourceReadRepository.cs | 4 +- .../IResourceRepositoryAccessor.cs | 3 +- .../ResourceRepositoryAccessor.cs | 7 +- .../Services/JsonApiResourceService.cs | 41 ++++++- .../TelevisionBroadcastDefinition.cs | 2 +- .../Transactions/PerformerRepository.cs | 2 +- .../HostingInIIS/HostingTests.cs | 8 +- .../Links/AbsoluteLinksWithNamespaceTests.cs | 12 +- .../AbsoluteLinksWithoutNamespaceTests.cs | 12 +- .../Links/RelativeLinksWithNamespaceTests.cs | 12 +- .../RelativeLinksWithoutNamespaceTests.cs | 12 +- .../MultiTenancy/MultiTenancyTests.cs | 5 +- .../PaginationWithTotalCountTests.cs | 93 +++++++++++++-- .../PaginationWithoutTotalCountTests.cs | 2 +- .../Reading/PlanetDefinition.cs | 2 +- .../Reading/ResourceDefinitionReadTests.cs | 110 ++++++++++++++++++ .../Serialization/SerializationTests.cs | 38 ++++-- .../ServiceCollectionExtensionsTests.cs | 4 +- 24 files changed, 400 insertions(+), 79 deletions(-) diff --git a/benchmarks/Serialization/ResourceSerializationBenchmarks.cs b/benchmarks/Serialization/ResourceSerializationBenchmarks.cs index 2877d96713..3435265262 100644 --- a/benchmarks/Serialization/ResourceSerializationBenchmarks.cs +++ b/benchmarks/Serialization/ResourceSerializationBenchmarks.cs @@ -129,7 +129,7 @@ protected override IEvaluatedIncludeCache CreateEvaluatedIncludeCache(IResourceG RelationshipAttribute multi4 = resourceAType.GetRelationshipByPropertyName(nameof(OutgoingResource.Multi4)); RelationshipAttribute multi5 = resourceAType.GetRelationshipByPropertyName(nameof(OutgoingResource.Multi5)); - ImmutableArray chain = ArrayFactory.Create(single2, single3, multi4, multi5).ToImmutableArray(); + ImmutableArray chain = ImmutableArray.Create(single2, single3, multi4, multi5); IEnumerable chains = new ResourceFieldChainExpression(chain).AsEnumerable(); var converter = new IncludeChainConverter(); diff --git a/src/JsonApiDotNetCore/CollectionExtensions.cs b/src/JsonApiDotNetCore/CollectionExtensions.cs index b258fa866d..ea3f0dd3a7 100644 --- a/src/JsonApiDotNetCore/CollectionExtensions.cs +++ b/src/JsonApiDotNetCore/CollectionExtensions.cs @@ -76,6 +76,13 @@ public static IEnumerable EmptyIfNull(this IEnumerable? source) return source ?? Enumerable.Empty(); } + public static IEnumerable WhereNotNull(this IEnumerable source) + { +#pragma warning disable AV1250 // Evaluate LINQ query before returning it + return source.Where(element => element is not null)!; +#pragma warning restore AV1250 // Evaluate LINQ query before returning it + } + public static void AddRange(this ICollection source, IEnumerable itemsToAdd) { ArgumentGuard.NotNull(source, nameof(source)); diff --git a/src/JsonApiDotNetCore/Queries/Expressions/LogicalExpression.cs b/src/JsonApiDotNetCore/Queries/Expressions/LogicalExpression.cs index 670fe15daa..6ab16b885f 100644 --- a/src/JsonApiDotNetCore/Queries/Expressions/LogicalExpression.cs +++ b/src/JsonApiDotNetCore/Queries/Expressions/LogicalExpression.cs @@ -34,6 +34,15 @@ public LogicalExpression(LogicalOperator @operator, IImmutableList terms = filters.WhereNotNull().ToImmutableArray(); + + return terms.Length > 1 ? new LogicalExpression(@operator, terms) : terms.FirstOrDefault(); + } + public override TResult Accept(QueryExpressionVisitor visitor, TArgument argument) { return visitor.VisitLogical(this, argument); diff --git a/src/JsonApiDotNetCore/Queries/IQueryLayerComposer.cs b/src/JsonApiDotNetCore/Queries/IQueryLayerComposer.cs index 3905bd1041..2fbee698ca 100644 --- a/src/JsonApiDotNetCore/Queries/IQueryLayerComposer.cs +++ b/src/JsonApiDotNetCore/Queries/IQueryLayerComposer.cs @@ -12,9 +12,14 @@ namespace JsonApiDotNetCore.Queries public interface IQueryLayerComposer { /// - /// Builds a top-level filter from constraints, used to determine total resource count. + /// Builds a filter from constraints, used to determine total resource count on a primary collection endpoint. /// - FilterExpression? GetTopFilterFromConstraints(ResourceType primaryResourceType); + FilterExpression? GetPrimaryFilterFromConstraints(ResourceType primaryResourceType); + + /// + /// Builds a filter from constraints, used to determine total resource count on a secondary collection endpoint. + /// + FilterExpression? GetSecondaryFilterFromConstraints(TId primaryId, HasManyAttribute hasManyRelationship); /// /// Collects constraints and builds a out of them, used to retrieve the actual resources. diff --git a/src/JsonApiDotNetCore/Queries/Internal/QueryLayerComposer.cs b/src/JsonApiDotNetCore/Queries/Internal/QueryLayerComposer.cs index 88f65f576c..2f8965070a 100644 --- a/src/JsonApiDotNetCore/Queries/Internal/QueryLayerComposer.cs +++ b/src/JsonApiDotNetCore/Queries/Internal/QueryLayerComposer.cs @@ -46,7 +46,7 @@ public QueryLayerComposer(IEnumerable constraintProvid } /// - public FilterExpression? GetTopFilterFromConstraints(ResourceType primaryResourceType) + public FilterExpression? GetPrimaryFilterFromConstraints(ResourceType primaryResourceType) { ExpressionInScope[] constraints = _constraintProviders.SelectMany(provider => provider.GetConstraints()).ToArray(); @@ -65,6 +65,75 @@ public QueryLayerComposer(IEnumerable constraintProvid return GetFilter(filtersInTopScope, primaryResourceType); } + /// + public FilterExpression? GetSecondaryFilterFromConstraints(TId primaryId, HasManyAttribute hasManyRelationship) + { + ArgumentGuard.NotNull(hasManyRelationship, nameof(hasManyRelationship)); + + if (hasManyRelationship.InverseNavigationProperty == null) + { + return null; + } + + RelationshipAttribute? inverseRelationship = + hasManyRelationship.RightType.FindRelationshipByPropertyName(hasManyRelationship.InverseNavigationProperty.Name); + + if (inverseRelationship == null) + { + return null; + } + + ExpressionInScope[] constraints = _constraintProviders.SelectMany(provider => provider.GetConstraints()).ToArray(); + + var secondaryScope = new ResourceFieldChainExpression(hasManyRelationship); + + // @formatter:wrap_chained_method_calls chop_always + // @formatter:keep_existing_linebreaks true + + FilterExpression[] filtersInSecondaryScope = constraints + .Where(constraint => secondaryScope.Equals(constraint.Scope)) + .Select(constraint => constraint.Expression) + .OfType() + .ToArray(); + + // @formatter:keep_existing_linebreaks restore + // @formatter:wrap_chained_method_calls restore + + FilterExpression? primaryFilter = GetFilter(Array.Empty(), hasManyRelationship.LeftType); + FilterExpression? secondaryFilter = GetFilter(filtersInSecondaryScope, hasManyRelationship.RightType); + + FilterExpression inverseFilter = GetInverseRelationshipFilter(primaryId, hasManyRelationship, inverseRelationship); + + return LogicalExpression.Compose(LogicalOperator.And, inverseFilter, primaryFilter, secondaryFilter); + } + + private static FilterExpression GetInverseRelationshipFilter(TId primaryId, HasManyAttribute relationship, + RelationshipAttribute inverseRelationship) + { + return inverseRelationship is HasManyAttribute hasManyInverseRelationship + ? GetInverseHasManyRelationshipFilter(primaryId, relationship, hasManyInverseRelationship) + : GetInverseHasOneRelationshipFilter(primaryId, relationship, (HasOneAttribute)inverseRelationship); + } + + private static FilterExpression GetInverseHasOneRelationshipFilter(TId primaryId, HasManyAttribute relationship, + HasOneAttribute inverseRelationship) + { + AttrAttribute idAttribute = GetIdAttribute(relationship.LeftType); + var idChain = new ResourceFieldChainExpression(ImmutableArray.Create(inverseRelationship, idAttribute)); + + return new ComparisonExpression(ComparisonOperator.Equals, idChain, new LiteralConstantExpression(primaryId!.ToString()!)); + } + + private static FilterExpression GetInverseHasManyRelationshipFilter(TId primaryId, HasManyAttribute relationship, + HasManyAttribute inverseRelationship) + { + AttrAttribute idAttribute = GetIdAttribute(relationship.LeftType); + var idChain = new ResourceFieldChainExpression(ImmutableArray.Create(idAttribute)); + var idComparison = new ComparisonExpression(ComparisonOperator.Equals, idChain, new LiteralConstantExpression(primaryId!.ToString()!)); + + return new HasExpression(new ResourceFieldChainExpression(inverseRelationship), idComparison); + } + /// public QueryLayer ComposeFromConstraints(ResourceType requestResourceType) { @@ -309,7 +378,7 @@ private IncludeExpression RewriteIncludeForSecondaryEndpoint(IncludeExpression? filter = new AnyExpression(idChain, constants); } - return filter == null ? existingFilter : existingFilter == null ? filter : new LogicalExpression(LogicalOperator.And, filter, existingFilter); + return LogicalExpression.Compose(LogicalOperator.And, filter, existingFilter); } /// @@ -419,8 +488,8 @@ protected virtual IImmutableSet GetIncludeElements(IIm ArgumentGuard.NotNull(expressionsInScope, nameof(expressionsInScope)); ArgumentGuard.NotNull(resourceType, nameof(resourceType)); - ImmutableArray filters = expressionsInScope.OfType().ToImmutableArray(); - FilterExpression? filter = filters.Length > 1 ? new LogicalExpression(LogicalOperator.And, filters) : filters.FirstOrDefault(); + FilterExpression[] filters = expressionsInScope.OfType().ToArray(); + FilterExpression? filter = LogicalExpression.Compose(LogicalOperator.And, filters); return _resourceDefinitionAccessor.OnApplyFilter(resourceType, filter); } diff --git a/src/JsonApiDotNetCore/Repositories/EntityFrameworkCoreRepository.cs b/src/JsonApiDotNetCore/Repositories/EntityFrameworkCoreRepository.cs index a445e6a5ae..3504b0b5ec 100644 --- a/src/JsonApiDotNetCore/Repositories/EntityFrameworkCoreRepository.cs +++ b/src/JsonApiDotNetCore/Repositories/EntityFrameworkCoreRepository.cs @@ -85,11 +85,11 @@ public virtual async Task> GetAsync(QueryLayer qu } /// - public virtual async Task CountAsync(FilterExpression? topFilter, CancellationToken cancellationToken) + public virtual async Task CountAsync(FilterExpression? filter, CancellationToken cancellationToken) { _traceWriter.LogMethodStart(new { - topFilter + filter }); using (CodeTimingSessionManager.Current.Measure("Repository - Count resources")) @@ -98,7 +98,7 @@ public virtual async Task CountAsync(FilterExpression? topFilter, Cancellat var layer = new QueryLayer(resourceType) { - Filter = topFilter + Filter = filter }; IQueryable query = ApplyQueryLayer(layer); diff --git a/src/JsonApiDotNetCore/Repositories/IResourceReadRepository.cs b/src/JsonApiDotNetCore/Repositories/IResourceReadRepository.cs index 3f6d4a872c..1b8a69d6bc 100644 --- a/src/JsonApiDotNetCore/Repositories/IResourceReadRepository.cs +++ b/src/JsonApiDotNetCore/Repositories/IResourceReadRepository.cs @@ -27,8 +27,8 @@ public interface IResourceReadRepository Task> GetAsync(QueryLayer queryLayer, CancellationToken cancellationToken); /// - /// Executes a read query using the specified top-level filter and returns the top-level count of matching resources. + /// Executes a read query using the specified filter and returns the count of matching resources. /// - Task CountAsync(FilterExpression? topFilter, CancellationToken cancellationToken); + Task CountAsync(FilterExpression? filter, CancellationToken cancellationToken); } } diff --git a/src/JsonApiDotNetCore/Repositories/IResourceRepositoryAccessor.cs b/src/JsonApiDotNetCore/Repositories/IResourceRepositoryAccessor.cs index 68360f02cb..a2897a237d 100644 --- a/src/JsonApiDotNetCore/Repositories/IResourceRepositoryAccessor.cs +++ b/src/JsonApiDotNetCore/Repositories/IResourceRepositoryAccessor.cs @@ -27,8 +27,7 @@ Task> GetAsync(QueryLayer queryLayer, /// /// Invokes for the specified resource type. /// - Task CountAsync(FilterExpression? topFilter, CancellationToken cancellationToken) - where TResource : class, IIdentifiable; + Task CountAsync(ResourceType resourceType, FilterExpression? filter, CancellationToken cancellationToken); /// /// Invokes . diff --git a/src/JsonApiDotNetCore/Repositories/ResourceRepositoryAccessor.cs b/src/JsonApiDotNetCore/Repositories/ResourceRepositoryAccessor.cs index b6ec29fb95..806e4dc700 100644 --- a/src/JsonApiDotNetCore/Repositories/ResourceRepositoryAccessor.cs +++ b/src/JsonApiDotNetCore/Repositories/ResourceRepositoryAccessor.cs @@ -50,11 +50,10 @@ public async Task> GetAsync(ResourceType reso } /// - public async Task CountAsync(FilterExpression? topFilter, CancellationToken cancellationToken) - where TResource : class, IIdentifiable + public async Task CountAsync(ResourceType resourceType, FilterExpression? filter, CancellationToken cancellationToken) { - dynamic repository = ResolveReadRepository(typeof(TResource)); - return (int)await repository.CountAsync(topFilter, cancellationToken); + dynamic repository = ResolveReadRepository(resourceType); + return (int)await repository.CountAsync(filter, cancellationToken); } /// diff --git a/src/JsonApiDotNetCore/Services/JsonApiResourceService.cs b/src/JsonApiDotNetCore/Services/JsonApiResourceService.cs index b7509deafc..8ddfaf8bce 100644 --- a/src/JsonApiDotNetCore/Services/JsonApiResourceService.cs +++ b/src/JsonApiDotNetCore/Services/JsonApiResourceService.cs @@ -69,8 +69,8 @@ public virtual async Task> GetAsync(CancellationT if (_options.IncludeTotalResourceCount) { - FilterExpression? topFilter = _queryLayerComposer.GetTopFilterFromConstraints(_request.PrimaryResourceType); - _paginationContext.TotalResourceCount = await _repositoryAccessor.CountAsync(topFilter, cancellationToken); + FilterExpression? topFilter = _queryLayerComposer.GetPrimaryFilterFromConstraints(_request.PrimaryResourceType); + _paginationContext.TotalResourceCount = await _repositoryAccessor.CountAsync(_request.PrimaryResourceType, topFilter, cancellationToken); if (_paginationContext.TotalResourceCount == 0) { @@ -81,7 +81,7 @@ public virtual async Task> GetAsync(CancellationT QueryLayer queryLayer = _queryLayerComposer.ComposeFromConstraints(_request.PrimaryResourceType); IReadOnlyCollection resources = await _repositoryAccessor.GetAsync(queryLayer, cancellationToken); - if (queryLayer.Pagination?.PageSize != null && queryLayer.Pagination.PageSize.Value == resources.Count) + if (queryLayer.Pagination?.PageSize?.Value == resources.Count) { _paginationContext.IsPageFull = true; } @@ -116,6 +116,14 @@ public virtual async Task GetAsync(TId id, CancellationToken cancella AssertPrimaryResourceTypeInJsonApiRequestIsNotNull(_request.PrimaryResourceType); AssertHasRelationship(_request.Relationship, relationshipName); + if (_options.IncludeTotalResourceCount && _request.IsCollection) + { + await RetrieveResourceCountForNonPrimaryEndpointAsync(id, (HasManyAttribute)_request.Relationship, cancellationToken); + + // We cannot return early when _paginationContext.TotalResourceCount == 0, because we don't know whether + // the parent resource exists. In case the parent does not exist, an error is produced below. + } + QueryLayer secondaryLayer = _queryLayerComposer.ComposeFromConstraints(_request.SecondaryResourceType!); QueryLayer primaryLayer = @@ -152,6 +160,14 @@ public virtual async Task GetAsync(TId id, CancellationToken cancella AssertPrimaryResourceTypeInJsonApiRequestIsNotNull(_request.PrimaryResourceType); AssertHasRelationship(_request.Relationship, relationshipName); + if (_options.IncludeTotalResourceCount && _request.IsCollection) + { + await RetrieveResourceCountForNonPrimaryEndpointAsync(id, (HasManyAttribute)_request.Relationship, cancellationToken); + + // We cannot return early when _paginationContext.TotalResourceCount == 0, because we don't know whether + // the parent resource exists. In case the parent does not exist, an error is produced below. + } + QueryLayer secondaryLayer = _queryLayerComposer.ComposeSecondaryLayerForRelationship(_request.SecondaryResourceType!); QueryLayer primaryLayer = @@ -162,7 +178,24 @@ public virtual async Task GetAsync(TId id, CancellationToken cancella TResource? primaryResource = primaryResources.SingleOrDefault(); AssertPrimaryResourceExists(primaryResource); - return _request.Relationship.GetValue(primaryResource); + object? rightValue = _request.Relationship.GetValue(primaryResource); + + if (rightValue is ICollection rightResources && secondaryLayer.Pagination?.PageSize?.Value == rightResources.Count) + { + _paginationContext.IsPageFull = true; + } + + return rightValue; + } + + private async Task RetrieveResourceCountForNonPrimaryEndpointAsync(TId id, HasManyAttribute relationship, CancellationToken cancellationToken) + { + FilterExpression? secondaryFilter = _queryLayerComposer.GetSecondaryFilterFromConstraints(id, relationship); + + if (secondaryFilter != null) + { + _paginationContext.TotalResourceCount = await _repositoryAccessor.CountAsync(relationship.RightType, secondaryFilter, cancellationToken); + } } /// diff --git a/test/JsonApiDotNetCoreTests/IntegrationTests/Archiving/TelevisionBroadcastDefinition.cs b/test/JsonApiDotNetCoreTests/IntegrationTests/Archiving/TelevisionBroadcastDefinition.cs index fdf13c8f86..73f5e10f5c 100644 --- a/test/JsonApiDotNetCoreTests/IntegrationTests/Archiving/TelevisionBroadcastDefinition.cs +++ b/test/JsonApiDotNetCoreTests/IntegrationTests/Archiving/TelevisionBroadcastDefinition.cs @@ -48,7 +48,7 @@ public TelevisionBroadcastDefinition(IResourceGraph resourceGraph, TelevisionDbC FilterExpression isUnarchived = new ComparisonExpression(ComparisonOperator.Equals, archivedAtChain, NullConstantExpression.Instance); - return existingFilter == null ? isUnarchived : new LogicalExpression(LogicalOperator.And, existingFilter, isUnarchived); + return LogicalExpression.Compose(LogicalOperator.And, existingFilter, isUnarchived); } } diff --git a/test/JsonApiDotNetCoreTests/IntegrationTests/AtomicOperations/Transactions/PerformerRepository.cs b/test/JsonApiDotNetCoreTests/IntegrationTests/AtomicOperations/Transactions/PerformerRepository.cs index 316e9c7db2..ead5d9234a 100644 --- a/test/JsonApiDotNetCoreTests/IntegrationTests/AtomicOperations/Transactions/PerformerRepository.cs +++ b/test/JsonApiDotNetCoreTests/IntegrationTests/AtomicOperations/Transactions/PerformerRepository.cs @@ -18,7 +18,7 @@ public Task> GetAsync(QueryLayer queryLayer, Canc throw new NotImplementedException(); } - public Task CountAsync(FilterExpression? topFilter, CancellationToken cancellationToken) + public Task CountAsync(FilterExpression? filter, CancellationToken cancellationToken) { throw new NotImplementedException(); } diff --git a/test/JsonApiDotNetCoreTests/IntegrationTests/HostingInIIS/HostingTests.cs b/test/JsonApiDotNetCoreTests/IntegrationTests/HostingInIIS/HostingTests.cs index 7fc0374f96..009cb406ee 100644 --- a/test/JsonApiDotNetCoreTests/IntegrationTests/HostingInIIS/HostingTests.cs +++ b/test/JsonApiDotNetCoreTests/IntegrationTests/HostingInIIS/HostingTests.cs @@ -49,8 +49,8 @@ await _testContext.RunOnDatabaseAsync(async dbContext => responseDocument.Links.ShouldNotBeNull(); responseDocument.Links.Self.Should().Be($"{HostPrefix}{route}"); responseDocument.Links.Related.Should().BeNull(); - responseDocument.Links.First.Should().Be($"{HostPrefix}{route}"); - responseDocument.Links.Last.Should().Be($"{HostPrefix}{route}"); + responseDocument.Links.First.Should().Be(responseDocument.Links.Self); + responseDocument.Links.Last.Should().Be(responseDocument.Links.Self); responseDocument.Links.Prev.Should().BeNull(); responseDocument.Links.Next.Should().BeNull(); @@ -117,8 +117,8 @@ await _testContext.RunOnDatabaseAsync(async dbContext => responseDocument.Links.ShouldNotBeNull(); responseDocument.Links.Self.Should().Be($"{HostPrefix}{route}"); responseDocument.Links.Related.Should().BeNull(); - responseDocument.Links.First.Should().Be($"{HostPrefix}{route}"); - responseDocument.Links.Last.Should().Be($"{HostPrefix}{route}"); + responseDocument.Links.First.Should().Be(responseDocument.Links.Self); + responseDocument.Links.Last.Should().Be(responseDocument.Links.Self); responseDocument.Links.Prev.Should().BeNull(); responseDocument.Links.Next.Should().BeNull(); diff --git a/test/JsonApiDotNetCoreTests/IntegrationTests/Links/AbsoluteLinksWithNamespaceTests.cs b/test/JsonApiDotNetCoreTests/IntegrationTests/Links/AbsoluteLinksWithNamespaceTests.cs index cd10a76501..d9a628af06 100644 --- a/test/JsonApiDotNetCoreTests/IntegrationTests/Links/AbsoluteLinksWithNamespaceTests.cs +++ b/test/JsonApiDotNetCoreTests/IntegrationTests/Links/AbsoluteLinksWithNamespaceTests.cs @@ -104,8 +104,8 @@ await _testContext.RunOnDatabaseAsync(async dbContext => responseDocument.Links.ShouldNotBeNull(); responseDocument.Links.Self.Should().Be($"{HostPrefix}{route}"); responseDocument.Links.Related.Should().BeNull(); - responseDocument.Links.First.Should().Be($"{HostPrefix}{route}"); - responseDocument.Links.Last.Should().Be($"{HostPrefix}{route}"); + responseDocument.Links.First.Should().Be(responseDocument.Links.Self); + responseDocument.Links.Last.Should().Be(responseDocument.Links.Self); responseDocument.Links.Prev.Should().BeNull(); responseDocument.Links.Next.Should().BeNull(); @@ -214,8 +214,8 @@ await _testContext.RunOnDatabaseAsync(async dbContext => responseDocument.Links.ShouldNotBeNull(); responseDocument.Links.Self.Should().Be($"{HostPrefix}{route}"); responseDocument.Links.Related.Should().BeNull(); - responseDocument.Links.First.Should().Be($"{HostPrefix}{route}"); - responseDocument.Links.Last.Should().BeNull(); + responseDocument.Links.First.Should().Be(responseDocument.Links.Self); + responseDocument.Links.Last.Should().Be(responseDocument.Links.Self); responseDocument.Links.Prev.Should().BeNull(); responseDocument.Links.Next.Should().BeNull(); @@ -296,8 +296,8 @@ await _testContext.RunOnDatabaseAsync(async dbContext => responseDocument.Links.ShouldNotBeNull(); responseDocument.Links.Self.Should().Be($"{HostPrefix}{route}"); responseDocument.Links.Related.Should().Be($"{HostPrefix}{PathPrefix}/photoAlbums/{album.StringId}/photos"); - responseDocument.Links.First.Should().Be($"{HostPrefix}{route}"); - responseDocument.Links.Last.Should().BeNull(); + responseDocument.Links.First.Should().Be(responseDocument.Links.Self); + responseDocument.Links.Last.Should().Be(responseDocument.Links.Self); responseDocument.Links.Prev.Should().BeNull(); responseDocument.Links.Next.Should().BeNull(); diff --git a/test/JsonApiDotNetCoreTests/IntegrationTests/Links/AbsoluteLinksWithoutNamespaceTests.cs b/test/JsonApiDotNetCoreTests/IntegrationTests/Links/AbsoluteLinksWithoutNamespaceTests.cs index dc87ac7fa9..2bf54c153c 100644 --- a/test/JsonApiDotNetCoreTests/IntegrationTests/Links/AbsoluteLinksWithoutNamespaceTests.cs +++ b/test/JsonApiDotNetCoreTests/IntegrationTests/Links/AbsoluteLinksWithoutNamespaceTests.cs @@ -104,8 +104,8 @@ await _testContext.RunOnDatabaseAsync(async dbContext => responseDocument.Links.ShouldNotBeNull(); responseDocument.Links.Self.Should().Be($"{HostPrefix}{route}"); responseDocument.Links.Related.Should().BeNull(); - responseDocument.Links.First.Should().Be($"{HostPrefix}{route}"); - responseDocument.Links.Last.Should().Be($"{HostPrefix}{route}"); + responseDocument.Links.First.Should().Be(responseDocument.Links.Self); + responseDocument.Links.Last.Should().Be(responseDocument.Links.Self); responseDocument.Links.Prev.Should().BeNull(); responseDocument.Links.Next.Should().BeNull(); @@ -214,8 +214,8 @@ await _testContext.RunOnDatabaseAsync(async dbContext => responseDocument.Links.ShouldNotBeNull(); responseDocument.Links.Self.Should().Be($"{HostPrefix}{route}"); responseDocument.Links.Related.Should().BeNull(); - responseDocument.Links.First.Should().Be($"{HostPrefix}{route}"); - responseDocument.Links.Last.Should().BeNull(); + responseDocument.Links.First.Should().Be(responseDocument.Links.Self); + responseDocument.Links.Last.Should().Be(responseDocument.Links.Self); responseDocument.Links.Prev.Should().BeNull(); responseDocument.Links.Next.Should().BeNull(); @@ -296,8 +296,8 @@ await _testContext.RunOnDatabaseAsync(async dbContext => responseDocument.Links.ShouldNotBeNull(); responseDocument.Links.Self.Should().Be($"{HostPrefix}{route}"); responseDocument.Links.Related.Should().Be($"{HostPrefix}{PathPrefix}/photoAlbums/{album.StringId}/photos"); - responseDocument.Links.First.Should().Be($"{HostPrefix}{route}"); - responseDocument.Links.Last.Should().BeNull(); + responseDocument.Links.First.Should().Be(responseDocument.Links.Self); + responseDocument.Links.Last.Should().Be(responseDocument.Links.Self); responseDocument.Links.Prev.Should().BeNull(); responseDocument.Links.Next.Should().BeNull(); diff --git a/test/JsonApiDotNetCoreTests/IntegrationTests/Links/RelativeLinksWithNamespaceTests.cs b/test/JsonApiDotNetCoreTests/IntegrationTests/Links/RelativeLinksWithNamespaceTests.cs index 16efd09971..5213db54dd 100644 --- a/test/JsonApiDotNetCoreTests/IntegrationTests/Links/RelativeLinksWithNamespaceTests.cs +++ b/test/JsonApiDotNetCoreTests/IntegrationTests/Links/RelativeLinksWithNamespaceTests.cs @@ -104,8 +104,8 @@ await _testContext.RunOnDatabaseAsync(async dbContext => responseDocument.Links.ShouldNotBeNull(); responseDocument.Links.Self.Should().Be($"{HostPrefix}{route}"); responseDocument.Links.Related.Should().BeNull(); - responseDocument.Links.First.Should().Be($"{HostPrefix}{route}"); - responseDocument.Links.Last.Should().Be($"{HostPrefix}{route}"); + responseDocument.Links.First.Should().Be(responseDocument.Links.Self); + responseDocument.Links.Last.Should().Be(responseDocument.Links.Self); responseDocument.Links.Prev.Should().BeNull(); responseDocument.Links.Next.Should().BeNull(); @@ -214,8 +214,8 @@ await _testContext.RunOnDatabaseAsync(async dbContext => responseDocument.Links.ShouldNotBeNull(); responseDocument.Links.Self.Should().Be($"{HostPrefix}{route}"); responseDocument.Links.Related.Should().BeNull(); - responseDocument.Links.First.Should().Be($"{HostPrefix}{route}"); - responseDocument.Links.Last.Should().BeNull(); + responseDocument.Links.First.Should().Be(responseDocument.Links.Self); + responseDocument.Links.Last.Should().Be(responseDocument.Links.Self); responseDocument.Links.Prev.Should().BeNull(); responseDocument.Links.Next.Should().BeNull(); @@ -296,8 +296,8 @@ await _testContext.RunOnDatabaseAsync(async dbContext => responseDocument.Links.ShouldNotBeNull(); responseDocument.Links.Self.Should().Be($"{HostPrefix}{route}"); responseDocument.Links.Related.Should().Be($"{HostPrefix}{PathPrefix}/photoAlbums/{album.StringId}/photos"); - responseDocument.Links.First.Should().Be($"{HostPrefix}{route}"); - responseDocument.Links.Last.Should().BeNull(); + responseDocument.Links.First.Should().Be(responseDocument.Links.Self); + responseDocument.Links.Last.Should().Be(responseDocument.Links.Self); responseDocument.Links.Prev.Should().BeNull(); responseDocument.Links.Next.Should().BeNull(); diff --git a/test/JsonApiDotNetCoreTests/IntegrationTests/Links/RelativeLinksWithoutNamespaceTests.cs b/test/JsonApiDotNetCoreTests/IntegrationTests/Links/RelativeLinksWithoutNamespaceTests.cs index 26ce39d7ba..7fb86278c8 100644 --- a/test/JsonApiDotNetCoreTests/IntegrationTests/Links/RelativeLinksWithoutNamespaceTests.cs +++ b/test/JsonApiDotNetCoreTests/IntegrationTests/Links/RelativeLinksWithoutNamespaceTests.cs @@ -104,8 +104,8 @@ await _testContext.RunOnDatabaseAsync(async dbContext => responseDocument.Links.ShouldNotBeNull(); responseDocument.Links.Self.Should().Be($"{HostPrefix}{route}"); responseDocument.Links.Related.Should().BeNull(); - responseDocument.Links.First.Should().Be($"{HostPrefix}{route}"); - responseDocument.Links.Last.Should().Be($"{HostPrefix}{route}"); + responseDocument.Links.First.Should().Be(responseDocument.Links.Self); + responseDocument.Links.Last.Should().Be(responseDocument.Links.Self); responseDocument.Links.Prev.Should().BeNull(); responseDocument.Links.Next.Should().BeNull(); @@ -214,8 +214,8 @@ await _testContext.RunOnDatabaseAsync(async dbContext => responseDocument.Links.ShouldNotBeNull(); responseDocument.Links.Self.Should().Be($"{HostPrefix}{route}"); responseDocument.Links.Related.Should().BeNull(); - responseDocument.Links.First.Should().Be($"{HostPrefix}{route}"); - responseDocument.Links.Last.Should().BeNull(); + responseDocument.Links.First.Should().Be(responseDocument.Links.Self); + responseDocument.Links.Last.Should().Be(responseDocument.Links.Self); responseDocument.Links.Prev.Should().BeNull(); responseDocument.Links.Next.Should().BeNull(); @@ -296,8 +296,8 @@ await _testContext.RunOnDatabaseAsync(async dbContext => responseDocument.Links.ShouldNotBeNull(); responseDocument.Links.Self.Should().Be($"{HostPrefix}{route}"); responseDocument.Links.Related.Should().Be($"{HostPrefix}{PathPrefix}/photoAlbums/{album.StringId}/photos"); - responseDocument.Links.First.Should().Be($"{HostPrefix}{route}"); - responseDocument.Links.Last.Should().BeNull(); + responseDocument.Links.First.Should().Be(responseDocument.Links.Self); + responseDocument.Links.Last.Should().Be(responseDocument.Links.Self); responseDocument.Links.Prev.Should().BeNull(); responseDocument.Links.Next.Should().BeNull(); diff --git a/test/JsonApiDotNetCoreTests/IntegrationTests/MultiTenancy/MultiTenancyTests.cs b/test/JsonApiDotNetCoreTests/IntegrationTests/MultiTenancy/MultiTenancyTests.cs index 6cc4b83b89..992b19c40e 100644 --- a/test/JsonApiDotNetCoreTests/IntegrationTests/MultiTenancy/MultiTenancyTests.cs +++ b/test/JsonApiDotNetCoreTests/IntegrationTests/MultiTenancy/MultiTenancyTests.cs @@ -43,6 +43,7 @@ public MultiTenancyTests(IntegrationTestContext(); options.UseRelativeLinks = true; + options.IncludeTotalResourceCount = true; } [Fact] @@ -1017,8 +1018,8 @@ await _testContext.RunOnDatabaseAsync(async dbContext => responseDocument.Links.ShouldNotBeNull(); responseDocument.Links.Self.Should().Be(route); responseDocument.Links.Related.Should().BeNull(); - responseDocument.Links.First.Should().Be(route); - responseDocument.Links.Last.Should().BeNull(); + responseDocument.Links.First.Should().Be(responseDocument.Links.Self); + responseDocument.Links.Last.Should().Be(responseDocument.Links.Self); responseDocument.Links.Prev.Should().BeNull(); responseDocument.Links.Next.Should().BeNull(); diff --git a/test/JsonApiDotNetCoreTests/IntegrationTests/QueryStrings/Pagination/PaginationWithTotalCountTests.cs b/test/JsonApiDotNetCoreTests/IntegrationTests/QueryStrings/Pagination/PaginationWithTotalCountTests.cs index eda3a85963..e9f74f955a 100644 --- a/test/JsonApiDotNetCoreTests/IntegrationTests/QueryStrings/Pagination/PaginationWithTotalCountTests.cs +++ b/test/JsonApiDotNetCoreTests/IntegrationTests/QueryStrings/Pagination/PaginationWithTotalCountTests.cs @@ -106,15 +106,18 @@ public async Task Can_paginate_in_secondary_resources() { // Arrange Blog blog = _fakers.Blog.Generate(); - blog.Posts = _fakers.BlogPost.Generate(2); + blog.Posts = _fakers.BlogPost.Generate(5); + + Blog otherBlog = _fakers.Blog.Generate(); + otherBlog.Posts = _fakers.BlogPost.Generate(1); await _testContext.RunOnDatabaseAsync(async dbContext => { - dbContext.Blogs.Add(blog); + dbContext.Blogs.AddRange(blog, otherBlog); await dbContext.SaveChangesAsync(); }); - string route = $"/blogs/{blog.StringId}/posts?page[number]=2&page[size]=1"; + string route = $"/blogs/{blog.StringId}/posts?page[number]=3&page[size]=1"; // Act (HttpResponseMessage httpResponse, Document responseDocument) = await _testContext.ExecuteGetAsync(route); @@ -123,14 +126,46 @@ await _testContext.RunOnDatabaseAsync(async dbContext => httpResponse.Should().HaveStatusCode(HttpStatusCode.OK); responseDocument.Data.ManyValue.ShouldHaveCount(1); - responseDocument.Data.ManyValue[0].Id.Should().Be(blog.Posts[1].StringId); + responseDocument.Data.ManyValue[0].Id.Should().Be(blog.Posts[2].StringId); responseDocument.Links.ShouldNotBeNull(); responseDocument.Links.Self.Should().Be($"{HostPrefix}{route}"); responseDocument.Links.First.Should().Be($"{HostPrefix}/blogs/{blog.StringId}/posts?page%5Bsize%5D=1"); + responseDocument.Links.Last.Should().Be($"{HostPrefix}/blogs/{blog.StringId}/posts?page%5Bnumber%5D=5&page%5Bsize%5D=1"); + responseDocument.Links.Prev.Should().Be($"{HostPrefix}/blogs/{blog.StringId}/posts?page%5Bnumber%5D=2&page%5Bsize%5D=1"); + responseDocument.Links.Next.Should().Be($"{HostPrefix}/blogs/{blog.StringId}/posts?page%5Bnumber%5D=4&page%5Bsize%5D=1"); + } + + [Fact] + public async Task Can_paginate_in_secondary_resources_without_inverse_relationship() + { + // Arrange + WebAccount? account = _fakers.WebAccount.Generate(); + account.LoginAttempts = _fakers.LoginAttempt.Generate(2); + + await _testContext.RunOnDatabaseAsync(async dbContext => + { + dbContext.Accounts.Add(account); + await dbContext.SaveChangesAsync(); + }); + + string route = $"/webAccounts/{account.StringId}/loginAttempts?page[number]=2&page[size]=1"; + + // Act + (HttpResponseMessage httpResponse, Document responseDocument) = await _testContext.ExecuteGetAsync(route); + + // Assert + httpResponse.Should().HaveStatusCode(HttpStatusCode.OK); + + responseDocument.Data.ManyValue.ShouldHaveCount(1); + responseDocument.Data.ManyValue[0].Id.Should().Be(account.LoginAttempts[1].StringId); + + responseDocument.Links.ShouldNotBeNull(); + responseDocument.Links.Self.Should().Be($"{HostPrefix}{route}"); + responseDocument.Links.First.Should().Be($"{HostPrefix}/webAccounts/{account.StringId}/loginAttempts?page%5Bsize%5D=1"); responseDocument.Links.Last.Should().BeNull(); responseDocument.Links.Prev.Should().Be(responseDocument.Links.First); - responseDocument.Links.Next.Should().Be($"{HostPrefix}/blogs/{blog.StringId}/posts?page%5Bnumber%5D=3&page%5Bsize%5D=1"); + responseDocument.Links.Next.Should().Be($"{HostPrefix}/webAccounts/{account.StringId}/loginAttempts?page%5Bnumber%5D=3&page%5Bsize%5D=1"); } [Fact] @@ -239,7 +274,7 @@ public async Task Can_paginate_OneToMany_relationship_on_relationship_endpoint() { // Arrange Blog blog = _fakers.Blog.Generate(); - blog.Posts = _fakers.BlogPost.Generate(2); + blog.Posts = _fakers.BlogPost.Generate(4); await _testContext.RunOnDatabaseAsync(async dbContext => { @@ -261,9 +296,43 @@ await _testContext.RunOnDatabaseAsync(async dbContext => responseDocument.Links.ShouldNotBeNull(); responseDocument.Links.Self.Should().Be($"{HostPrefix}{route}"); responseDocument.Links.First.Should().Be($"{HostPrefix}/blogs/{blog.StringId}/relationships/posts?page%5Bsize%5D=1"); + responseDocument.Links.Last.Should().Be($"{HostPrefix}/blogs/{blog.StringId}/relationships/posts?page%5Bnumber%5D=4&page%5Bsize%5D=1"); + responseDocument.Links.Prev.Should().Be(responseDocument.Links.First); + responseDocument.Links.Next.Should().Be($"{HostPrefix}/blogs/{blog.StringId}/relationships/posts?page%5Bnumber%5D=3&page%5Bsize%5D=1"); + } + + [Fact] + public async Task Can_paginate_OneToMany_relationship_on_relationship_endpoint_without_inverse_relationship() + { + // Arrange + WebAccount? account = _fakers.WebAccount.Generate(); + account.LoginAttempts = _fakers.LoginAttempt.Generate(2); + + await _testContext.RunOnDatabaseAsync(async dbContext => + { + dbContext.Accounts.Add(account); + await dbContext.SaveChangesAsync(); + }); + + string route = $"/webAccounts/{account.StringId}/relationships/loginAttempts?page[number]=2&page[size]=1"; + + // Act + (HttpResponseMessage httpResponse, Document responseDocument) = await _testContext.ExecuteGetAsync(route); + + // Assert + httpResponse.Should().HaveStatusCode(HttpStatusCode.OK); + + responseDocument.Data.ManyValue.ShouldHaveCount(1); + responseDocument.Data.ManyValue[0].Id.Should().Be(account.LoginAttempts[1].StringId); + + string basePath = $"{HostPrefix}/webAccounts/{account.StringId}/relationships/loginAttempts"; + + responseDocument.Links.ShouldNotBeNull(); + responseDocument.Links.Self.Should().Be($"{HostPrefix}{route}"); + responseDocument.Links.First.Should().Be(basePath + "?page%5Bsize%5D=1"); responseDocument.Links.Last.Should().BeNull(); responseDocument.Links.Prev.Should().Be(responseDocument.Links.First); - responseDocument.Links.Next.Should().BeNull(); + responseDocument.Links.Next.Should().Be(basePath + "?page%5Bnumber%5D=3&page%5Bsize%5D=1"); } [Fact] @@ -313,7 +382,7 @@ public async Task Can_paginate_ManyToMany_relationship_on_relationship_endpoint( { // Arrange BlogPost post = _fakers.BlogPost.Generate(); - post.Labels = _fakers.Label.Generate(2).ToHashSet(); + post.Labels = _fakers.Label.Generate(4).ToHashSet(); await _testContext.RunOnDatabaseAsync(async dbContext => { @@ -336,9 +405,9 @@ await _testContext.RunOnDatabaseAsync(async dbContext => responseDocument.Links.ShouldNotBeNull(); responseDocument.Links.Self.Should().Be($"{HostPrefix}{route}"); responseDocument.Links.First.Should().Be($"{HostPrefix}/blogPosts/{post.StringId}/relationships/labels?page%5Bsize%5D=1"); - responseDocument.Links.Last.Should().BeNull(); + responseDocument.Links.Last.Should().Be($"{HostPrefix}/blogPosts/{post.StringId}/relationships/labels?page%5Bnumber%5D=4&page%5Bsize%5D=1"); responseDocument.Links.Prev.Should().Be(responseDocument.Links.First); - responseDocument.Links.Next.Should().BeNull(); + responseDocument.Links.Next.Should().Be($"{HostPrefix}/blogPosts/{post.StringId}/relationships/labels?page%5Bnumber%5D=3&page%5Bsize%5D=1"); } [Fact] @@ -465,9 +534,9 @@ await _testContext.RunOnDatabaseAsync(async dbContext => responseDocument.Links.ShouldNotBeNull(); responseDocument.Links.Self.Should().Be($"{HostPrefix}{route}"); responseDocument.Links.First.Should().Be(responseDocument.Links.Self); - responseDocument.Links.Last.Should().BeNull(); + responseDocument.Links.Last.Should().Be($"{HostPrefix}{route}?page%5Bnumber%5D=2"); responseDocument.Links.Prev.Should().BeNull(); - responseDocument.Links.Next.Should().Be($"{HostPrefix}/blogs/{blog.StringId}/posts?page%5Bnumber%5D=2"); + responseDocument.Links.Next.Should().Be(responseDocument.Links.Last); } [Fact] diff --git a/test/JsonApiDotNetCoreTests/IntegrationTests/QueryStrings/Pagination/PaginationWithoutTotalCountTests.cs b/test/JsonApiDotNetCoreTests/IntegrationTests/QueryStrings/Pagination/PaginationWithoutTotalCountTests.cs index e62caf04eb..0e6b39328a 100644 --- a/test/JsonApiDotNetCoreTests/IntegrationTests/QueryStrings/Pagination/PaginationWithoutTotalCountTests.cs +++ b/test/JsonApiDotNetCoreTests/IntegrationTests/QueryStrings/Pagination/PaginationWithoutTotalCountTests.cs @@ -106,7 +106,7 @@ await _testContext.RunOnDatabaseAsync(async dbContext => responseDocument.Links.Self.Should().Be($"{HostPrefix}{route}"); responseDocument.Links.First.Should().Be($"{HostPrefix}/blogPosts?foo=bar"); responseDocument.Links.Last.Should().BeNull(); - responseDocument.Links.Prev.Should().Be($"{HostPrefix}/blogPosts?foo=bar"); + responseDocument.Links.Prev.Should().Be(responseDocument.Links.First); responseDocument.Links.Next.Should().BeNull(); } diff --git a/test/JsonApiDotNetCoreTests/IntegrationTests/ResourceDefinitions/Reading/PlanetDefinition.cs b/test/JsonApiDotNetCoreTests/IntegrationTests/ResourceDefinitions/Reading/PlanetDefinition.cs index 399eacd27a..032f335320 100644 --- a/test/JsonApiDotNetCoreTests/IntegrationTests/ResourceDefinitions/Reading/PlanetDefinition.cs +++ b/test/JsonApiDotNetCoreTests/IntegrationTests/ResourceDefinitions/Reading/PlanetDefinition.cs @@ -53,7 +53,7 @@ public override IImmutableSet OnApplyIncludes(IImmutab FilterExpression hasNoPrivateName = new ComparisonExpression(ComparisonOperator.Equals, new ResourceFieldChainExpression(privateNameAttribute), NullConstantExpression.Instance); - return existingFilter == null ? hasNoPrivateName : new LogicalExpression(LogicalOperator.And, hasNoPrivateName, existingFilter); + return LogicalExpression.Compose(LogicalOperator.And, hasNoPrivateName, existingFilter); } return existingFilter; diff --git a/test/JsonApiDotNetCoreTests/IntegrationTests/ResourceDefinitions/Reading/ResourceDefinitionReadTests.cs b/test/JsonApiDotNetCoreTests/IntegrationTests/ResourceDefinitions/Reading/ResourceDefinitionReadTests.cs index 5da638c2ef..53db3dd474 100644 --- a/test/JsonApiDotNetCoreTests/IntegrationTests/ResourceDefinitions/Reading/ResourceDefinitionReadTests.cs +++ b/test/JsonApiDotNetCoreTests/IntegrationTests/ResourceDefinitions/Reading/ResourceDefinitionReadTests.cs @@ -318,6 +318,116 @@ await _testContext.RunOnDatabaseAsync(async dbContext => }, options => options.WithStrictOrdering()); } + [Fact] + public async Task Filter_from_resource_definition_is_applied_on_secondary_endpoint() + { + // Arrange + var hitCounter = _testContext.Factory.Services.GetRequiredService(); + + var settingsProvider = (TestClientSettingsProvider)_testContext.Factory.Services.GetRequiredService(); + settingsProvider.HidePlanetsWithPrivateName(); + + Star star = _fakers.Star.Generate(); + star.Planets = _fakers.Planet.Generate(4).ToHashSet(); + star.Planets.ElementAt(0).PrivateName = "A"; + star.Planets.ElementAt(2).PrivateName = "B"; + + await _testContext.RunOnDatabaseAsync(async dbContext => + { + await dbContext.ClearTableAsync(); + dbContext.Stars.AddRange(star); + await dbContext.SaveChangesAsync(); + }); + + string route = $"/stars/{star.StringId}/planets"; + + // Act + (HttpResponseMessage httpResponse, Document responseDocument) = await _testContext.ExecuteGetAsync(route); + + // Assert + httpResponse.Should().HaveStatusCode(HttpStatusCode.OK); + + responseDocument.Data.ManyValue.ShouldHaveCount(2); + responseDocument.Data.ManyValue[0].Id.Should().Be(star.Planets.ElementAt(1).StringId); + responseDocument.Data.ManyValue[1].Id.Should().Be(star.Planets.ElementAt(3).StringId); + + responseDocument.Meta.ShouldContainKey("total").With(value => + { + JsonElement element = value.Should().BeOfType().Subject; + element.GetInt32().Should().Be(2); + }); + + hitCounter.HitExtensibilityPoints.Should().BeEquivalentTo(new[] + { + (typeof(Star), ResourceDefinitionExtensibilityPoint.OnApplyFilter), + (typeof(Planet), ResourceDefinitionExtensibilityPoint.OnApplyFilter), + (typeof(Planet), ResourceDefinitionExtensibilityPoint.OnApplyPagination), + (typeof(Planet), ResourceDefinitionExtensibilityPoint.OnApplyFilter), + (typeof(Planet), ResourceDefinitionExtensibilityPoint.OnApplySort), + (typeof(Planet), ResourceDefinitionExtensibilityPoint.OnApplySparseFieldSet), + (typeof(Planet), ResourceDefinitionExtensibilityPoint.OnApplyIncludes), + (typeof(Star), ResourceDefinitionExtensibilityPoint.OnApplySparseFieldSet), + (typeof(Star), ResourceDefinitionExtensibilityPoint.OnApplyFilter), + (typeof(Planet), ResourceDefinitionExtensibilityPoint.OnApplySparseFieldSet), + (typeof(Planet), ResourceDefinitionExtensibilityPoint.GetMeta), + (typeof(Planet), ResourceDefinitionExtensibilityPoint.GetMeta) + }, options => options.WithStrictOrdering()); + } + + [Fact] + public async Task Filter_from_resource_definition_is_applied_on_relationship_endpoint() + { + // Arrange + var hitCounter = _testContext.Factory.Services.GetRequiredService(); + + var settingsProvider = (TestClientSettingsProvider)_testContext.Factory.Services.GetRequiredService(); + settingsProvider.HidePlanetsWithPrivateName(); + + Star star = _fakers.Star.Generate(); + star.Planets = _fakers.Planet.Generate(4).ToHashSet(); + star.Planets.ElementAt(0).PrivateName = "A"; + star.Planets.ElementAt(2).PrivateName = "B"; + + await _testContext.RunOnDatabaseAsync(async dbContext => + { + await dbContext.ClearTableAsync(); + dbContext.Stars.AddRange(star); + await dbContext.SaveChangesAsync(); + }); + + string route = $"/stars/{star.StringId}/relationships/planets"; + + // Act + (HttpResponseMessage httpResponse, Document responseDocument) = await _testContext.ExecuteGetAsync(route); + + // Assert + httpResponse.Should().HaveStatusCode(HttpStatusCode.OK); + + responseDocument.Data.ManyValue.ShouldHaveCount(2); + responseDocument.Data.ManyValue[0].Id.Should().Be(star.Planets.ElementAt(1).StringId); + responseDocument.Data.ManyValue[1].Id.Should().Be(star.Planets.ElementAt(3).StringId); + + responseDocument.Meta.ShouldContainKey("total").With(value => + { + JsonElement element = value.Should().BeOfType().Subject; + element.GetInt32().Should().Be(2); + }); + + hitCounter.HitExtensibilityPoints.Should().BeEquivalentTo(new[] + { + (typeof(Star), ResourceDefinitionExtensibilityPoint.OnApplyFilter), + (typeof(Planet), ResourceDefinitionExtensibilityPoint.OnApplyFilter), + (typeof(Planet), ResourceDefinitionExtensibilityPoint.OnApplyPagination), + (typeof(Planet), ResourceDefinitionExtensibilityPoint.OnApplyFilter), + (typeof(Planet), ResourceDefinitionExtensibilityPoint.OnApplySort), + (typeof(Planet), ResourceDefinitionExtensibilityPoint.OnApplySparseFieldSet), + (typeof(Planet), ResourceDefinitionExtensibilityPoint.OnApplyIncludes), + (typeof(Planet), ResourceDefinitionExtensibilityPoint.OnApplySparseFieldSet), + (typeof(Star), ResourceDefinitionExtensibilityPoint.OnApplySparseFieldSet), + (typeof(Star), ResourceDefinitionExtensibilityPoint.OnApplyFilter) + }, options => options.WithStrictOrdering()); + } + [Fact] public async Task Sort_from_resource_definition_is_applied() { diff --git a/test/JsonApiDotNetCoreTests/IntegrationTests/Serialization/SerializationTests.cs b/test/JsonApiDotNetCoreTests/IntegrationTests/Serialization/SerializationTests.cs index 4fa607b1e8..eaedd8324b 100644 --- a/test/JsonApiDotNetCoreTests/IntegrationTests/Serialization/SerializationTests.cs +++ b/test/JsonApiDotNetCoreTests/IntegrationTests/Serialization/SerializationTests.cs @@ -37,6 +37,7 @@ public SerializationTests(IntegrationTestContext converter is JsonTimeSpanConverter)) { @@ -111,7 +112,8 @@ await _testContext.RunOnDatabaseAsync(async dbContext => responseDocument.Should().BeJson(@"{ ""links"": { ""self"": ""http://localhost/meetings?include=attendees"", - ""first"": ""http://localhost/meetings?include=attendees"" + ""first"": ""http://localhost/meetings?include=attendees"", + ""last"": ""http://localhost/meetings?include=attendees"" }, ""data"": [ { @@ -164,7 +166,10 @@ await _testContext.RunOnDatabaseAsync(async dbContext => ""self"": ""http://localhost/meetingAttendees/" + meeting.Attendees[0].StringId + @""" } } - ] + ], + ""meta"": { + ""total"": 1 + } }"); } @@ -239,7 +244,8 @@ await _testContext.RunOnDatabaseAsync(async dbContext => responseDocument.Should().BeJson(@"{ ""links"": { ""self"": ""http://localhost/meetings/?include=attendees"", - ""first"": ""http://localhost/meetings/?include=attendees"" + ""first"": ""http://localhost/meetings/?include=attendees"", + ""last"": ""http://localhost/meetings/?include=attendees"" }, ""data"": [ { @@ -268,7 +274,10 @@ await _testContext.RunOnDatabaseAsync(async dbContext => } } ], - ""included"": [] + ""included"": [], + ""meta"": { + ""total"": 1 + } }"); } @@ -458,7 +467,8 @@ await _testContext.RunOnDatabaseAsync(async dbContext => responseDocument.Should().BeJson(@"{ ""links"": { ""self"": ""http://localhost/meetings/" + meeting.StringId + @"/attendees"", - ""first"": ""http://localhost/meetings/" + meeting.StringId + @"/attendees"" + ""first"": ""http://localhost/meetings/" + meeting.StringId + @"/attendees"", + ""last"": ""http://localhost/meetings/" + meeting.StringId + @"/attendees"" }, ""data"": [ { @@ -479,7 +489,10 @@ await _testContext.RunOnDatabaseAsync(async dbContext => ""self"": ""http://localhost/meetingAttendees/" + meeting.Attendees[0].StringId + @""" } } - ] + ], + ""meta"": { + ""total"": 1 + } }"); } @@ -508,7 +521,10 @@ await _testContext.RunOnDatabaseAsync(async dbContext => ""self"": ""http://localhost/meetings/" + meeting.StringId + @"/attendees"", ""first"": ""http://localhost/meetings/" + meeting.StringId + @"/attendees"" }, - ""data"": [] + ""data"": [], + ""meta"": { + ""total"": 0 + } }"); } @@ -572,7 +588,8 @@ await _testContext.RunOnDatabaseAsync(async dbContext => ""links"": { ""self"": ""http://localhost/meetings/" + meeting.StringId + @"/relationships/attendees"", ""related"": ""http://localhost/meetings/" + meeting.StringId + @"/attendees"", - ""first"": ""http://localhost/meetings/" + meeting.StringId + @"/relationships/attendees"" + ""first"": ""http://localhost/meetings/" + meeting.StringId + @"/relationships/attendees"", + ""last"": ""http://localhost/meetings/" + meeting.StringId + @"/relationships/attendees"" }, ""data"": [ { @@ -583,7 +600,10 @@ await _testContext.RunOnDatabaseAsync(async dbContext => ""type"": ""meetingAttendees"", ""id"": """ + meetingIds[1] + @""" } - ] + ], + ""meta"": { + ""total"": 2 + } }"); } diff --git a/test/UnitTests/Extensions/ServiceCollectionExtensionsTests.cs b/test/UnitTests/Extensions/ServiceCollectionExtensionsTests.cs index 0e55150727..0f5e5edfb1 100644 --- a/test/UnitTests/Extensions/ServiceCollectionExtensionsTests.cs +++ b/test/UnitTests/Extensions/ServiceCollectionExtensionsTests.cs @@ -314,7 +314,7 @@ public Task> GetAsync(QueryLayer queryLayer throw new NotImplementedException(); } - public Task CountAsync(FilterExpression? topFilter, CancellationToken cancellationToken) + public Task CountAsync(FilterExpression? filter, CancellationToken cancellationToken) { throw new NotImplementedException(); } @@ -369,7 +369,7 @@ public Task> GetAsync(QueryLayer queryLayer, throw new NotImplementedException(); } - public Task CountAsync(FilterExpression? topFilter, CancellationToken cancellationToken) + public Task CountAsync(FilterExpression? filter, CancellationToken cancellationToken) { throw new NotImplementedException(); } From 78e09beab1d141d334f89434b0c4f7864aea9a1a Mon Sep 17 00:00:00 2001 From: Bart Koelman Date: Thu, 4 Nov 2021 03:39:26 +0100 Subject: [PATCH 4/6] Rename flags enum to plural --- .../Meta/AtomicResourceMetaTests.cs | 6 +- .../Meta/MusicTrackMetaDefinition.cs | 2 +- .../Meta/TextLanguageMetaDefinition.cs | 2 +- ...micSerializationResourceDefinitionTests.cs | 16 +- .../Serialization/RecordCompanyDefinition.cs | 2 +- ...icSparseFieldSetResourceDefinitionTests.cs | 16 +- .../SparseFieldSets/LyricTextDefinition.cs | 2 +- .../HitCountingResourceDefinition.cs | 66 ++-- .../Meta/ResourceMetaTests.cs | 8 +- .../Meta/SupportTicketDefinition.cs | 2 +- .../FireForgetTests.Group.cs | 56 ++-- .../FireForgetTests.User.cs | 76 ++--- .../FireAndForgetDelivery/FireForgetTests.cs | 6 +- .../Microservices/MessagingGroupDefinition.cs | 2 +- .../Microservices/MessagingUserDefinition.cs | 2 +- .../OutboxTests.Group.cs | 56 ++-- .../OutboxTests.User.cs | 76 ++--- .../TransactionalOutboxPattern/OutboxTests.cs | 4 +- ... ResourceDefinitionExtensibilityPoints.cs} | 2 +- .../ResourceDefinitionHitCounter.cs | 5 +- .../Reading/MoonDefinition.cs | 2 +- .../Reading/PlanetDefinition.cs | 2 +- .../Reading/ResourceDefinitionReadTests.cs | 304 +++++++++--------- .../Reading/StarDefinition.cs | 2 +- .../ResourceDefinitionSerializationTests.cs | 36 +-- .../Serialization/StudentDefinition.cs | 2 +- 26 files changed, 378 insertions(+), 377 deletions(-) rename test/JsonApiDotNetCoreTests/IntegrationTests/{ResourceDefinitionExtensibilityPoint.cs => ResourceDefinitionExtensibilityPoints.cs} (96%) diff --git a/test/JsonApiDotNetCoreTests/IntegrationTests/AtomicOperations/Meta/AtomicResourceMetaTests.cs b/test/JsonApiDotNetCoreTests/IntegrationTests/AtomicOperations/Meta/AtomicResourceMetaTests.cs index 25f1d442c9..6f26bd8b9b 100644 --- a/test/JsonApiDotNetCoreTests/IntegrationTests/AtomicOperations/Meta/AtomicResourceMetaTests.cs +++ b/test/JsonApiDotNetCoreTests/IntegrationTests/AtomicOperations/Meta/AtomicResourceMetaTests.cs @@ -111,8 +111,8 @@ public async Task Returns_resource_meta_in_create_resource_with_side_effects() hitCounter.HitExtensibilityPoints.Should().BeEquivalentTo(new[] { - (typeof(MusicTrack), ResourceDefinitionExtensibilityPoint.GetMeta), - (typeof(MusicTrack), ResourceDefinitionExtensibilityPoint.GetMeta) + (typeof(MusicTrack), ResourceDefinitionExtensibilityPoints.GetMeta), + (typeof(MusicTrack), ResourceDefinitionExtensibilityPoints.GetMeta) }, options => options.WithStrictOrdering()); } @@ -172,7 +172,7 @@ await _testContext.RunOnDatabaseAsync(async dbContext => hitCounter.HitExtensibilityPoints.Should().BeEquivalentTo(new[] { - (typeof(TextLanguage), ResourceDefinitionExtensibilityPoint.GetMeta) + (typeof(TextLanguage), ResourceDefinitionExtensibilityPoints.GetMeta) }, options => options.WithStrictOrdering()); } } diff --git a/test/JsonApiDotNetCoreTests/IntegrationTests/AtomicOperations/Meta/MusicTrackMetaDefinition.cs b/test/JsonApiDotNetCoreTests/IntegrationTests/AtomicOperations/Meta/MusicTrackMetaDefinition.cs index 827e37cb51..69557713bd 100644 --- a/test/JsonApiDotNetCoreTests/IntegrationTests/AtomicOperations/Meta/MusicTrackMetaDefinition.cs +++ b/test/JsonApiDotNetCoreTests/IntegrationTests/AtomicOperations/Meta/MusicTrackMetaDefinition.cs @@ -8,7 +8,7 @@ namespace JsonApiDotNetCoreTests.IntegrationTests.AtomicOperations.Meta [UsedImplicitly(ImplicitUseKindFlags.InstantiatedNoFixedConstructorSignature)] public sealed class MusicTrackMetaDefinition : HitCountingResourceDefinition { - protected override ResourceDefinitionExtensibilityPoint ExtensibilityPointsToTrack => ResourceDefinitionExtensibilityPoint.GetMeta; + protected override ResourceDefinitionExtensibilityPoints ExtensibilityPointsToTrack => ResourceDefinitionExtensibilityPoints.GetMeta; public MusicTrackMetaDefinition(IResourceGraph resourceGraph, ResourceDefinitionHitCounter hitCounter) : base(resourceGraph, hitCounter) diff --git a/test/JsonApiDotNetCoreTests/IntegrationTests/AtomicOperations/Meta/TextLanguageMetaDefinition.cs b/test/JsonApiDotNetCoreTests/IntegrationTests/AtomicOperations/Meta/TextLanguageMetaDefinition.cs index cc89eaf576..2badcd6f88 100644 --- a/test/JsonApiDotNetCoreTests/IntegrationTests/AtomicOperations/Meta/TextLanguageMetaDefinition.cs +++ b/test/JsonApiDotNetCoreTests/IntegrationTests/AtomicOperations/Meta/TextLanguageMetaDefinition.cs @@ -9,7 +9,7 @@ public sealed class TextLanguageMetaDefinition : ImplicitlyChangingTextLanguageD { internal const string NoticeText = "See https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes for ISO 639-1 language codes."; - protected override ResourceDefinitionExtensibilityPoint ExtensibilityPointsToTrack => ResourceDefinitionExtensibilityPoint.GetMeta; + protected override ResourceDefinitionExtensibilityPoints ExtensibilityPointsToTrack => ResourceDefinitionExtensibilityPoints.GetMeta; public TextLanguageMetaDefinition(IResourceGraph resourceGraph, ResourceDefinitionHitCounter hitCounter, OperationsDbContext dbContext) : base(resourceGraph, hitCounter, dbContext) diff --git a/test/JsonApiDotNetCoreTests/IntegrationTests/AtomicOperations/ResourceDefinitions/Serialization/AtomicSerializationResourceDefinitionTests.cs b/test/JsonApiDotNetCoreTests/IntegrationTests/AtomicOperations/ResourceDefinitions/Serialization/AtomicSerializationResourceDefinitionTests.cs index 1a1a3da22d..277b3f6122 100644 --- a/test/JsonApiDotNetCoreTests/IntegrationTests/AtomicOperations/ResourceDefinitions/Serialization/AtomicSerializationResourceDefinitionTests.cs +++ b/test/JsonApiDotNetCoreTests/IntegrationTests/AtomicOperations/ResourceDefinitions/Serialization/AtomicSerializationResourceDefinitionTests.cs @@ -123,10 +123,10 @@ await _testContext.RunOnDatabaseAsync(async dbContext => hitCounter.HitExtensibilityPoints.Should().BeEquivalentTo(new[] { - (typeof(RecordCompany), ResourceDefinitionExtensibilityPoint.OnDeserialize), - (typeof(RecordCompany), ResourceDefinitionExtensibilityPoint.OnDeserialize), - (typeof(RecordCompany), ResourceDefinitionExtensibilityPoint.OnSerialize), - (typeof(RecordCompany), ResourceDefinitionExtensibilityPoint.OnSerialize) + (typeof(RecordCompany), ResourceDefinitionExtensibilityPoints.OnDeserialize), + (typeof(RecordCompany), ResourceDefinitionExtensibilityPoints.OnDeserialize), + (typeof(RecordCompany), ResourceDefinitionExtensibilityPoints.OnSerialize), + (typeof(RecordCompany), ResourceDefinitionExtensibilityPoints.OnSerialize) }, options => options.WithStrictOrdering()); } @@ -275,10 +275,10 @@ await _testContext.RunOnDatabaseAsync(async dbContext => hitCounter.HitExtensibilityPoints.Should().BeEquivalentTo(new[] { - (typeof(RecordCompany), ResourceDefinitionExtensibilityPoint.OnDeserialize), - (typeof(RecordCompany), ResourceDefinitionExtensibilityPoint.OnDeserialize), - (typeof(RecordCompany), ResourceDefinitionExtensibilityPoint.OnSerialize), - (typeof(RecordCompany), ResourceDefinitionExtensibilityPoint.OnSerialize) + (typeof(RecordCompany), ResourceDefinitionExtensibilityPoints.OnDeserialize), + (typeof(RecordCompany), ResourceDefinitionExtensibilityPoints.OnDeserialize), + (typeof(RecordCompany), ResourceDefinitionExtensibilityPoints.OnSerialize), + (typeof(RecordCompany), ResourceDefinitionExtensibilityPoints.OnSerialize) }, options => options.WithStrictOrdering()); } diff --git a/test/JsonApiDotNetCoreTests/IntegrationTests/AtomicOperations/ResourceDefinitions/Serialization/RecordCompanyDefinition.cs b/test/JsonApiDotNetCoreTests/IntegrationTests/AtomicOperations/ResourceDefinitions/Serialization/RecordCompanyDefinition.cs index 8f40683f22..8f46b69336 100644 --- a/test/JsonApiDotNetCoreTests/IntegrationTests/AtomicOperations/ResourceDefinitions/Serialization/RecordCompanyDefinition.cs +++ b/test/JsonApiDotNetCoreTests/IntegrationTests/AtomicOperations/ResourceDefinitions/Serialization/RecordCompanyDefinition.cs @@ -6,7 +6,7 @@ namespace JsonApiDotNetCoreTests.IntegrationTests.AtomicOperations.ResourceDefin [UsedImplicitly(ImplicitUseKindFlags.InstantiatedNoFixedConstructorSignature)] public sealed class RecordCompanyDefinition : HitCountingResourceDefinition { - protected override ResourceDefinitionExtensibilityPoint ExtensibilityPointsToTrack => ResourceDefinitionExtensibilityPoint.Serialization; + protected override ResourceDefinitionExtensibilityPoints ExtensibilityPointsToTrack => ResourceDefinitionExtensibilityPoints.Serialization; public RecordCompanyDefinition(IResourceGraph resourceGraph, ResourceDefinitionHitCounter hitCounter) : base(resourceGraph, hitCounter) diff --git a/test/JsonApiDotNetCoreTests/IntegrationTests/AtomicOperations/ResourceDefinitions/SparseFieldSets/AtomicSparseFieldSetResourceDefinitionTests.cs b/test/JsonApiDotNetCoreTests/IntegrationTests/AtomicOperations/ResourceDefinitions/SparseFieldSets/AtomicSparseFieldSetResourceDefinitionTests.cs index 447081061d..1d6f4127ce 100644 --- a/test/JsonApiDotNetCoreTests/IntegrationTests/AtomicOperations/ResourceDefinitions/SparseFieldSets/AtomicSparseFieldSetResourceDefinitionTests.cs +++ b/test/JsonApiDotNetCoreTests/IntegrationTests/AtomicOperations/ResourceDefinitions/SparseFieldSets/AtomicSparseFieldSetResourceDefinitionTests.cs @@ -105,10 +105,10 @@ public async Task Hides_text_in_create_resource_with_side_effects() hitCounter.HitExtensibilityPoints.Should().BeEquivalentTo(new[] { - (typeof(Lyric), ResourceDefinitionExtensibilityPoint.OnApplySparseFieldSet), - (typeof(Lyric), ResourceDefinitionExtensibilityPoint.OnApplySparseFieldSet), - (typeof(Lyric), ResourceDefinitionExtensibilityPoint.OnApplySparseFieldSet), - (typeof(Lyric), ResourceDefinitionExtensibilityPoint.OnApplySparseFieldSet) + (typeof(Lyric), ResourceDefinitionExtensibilityPoints.OnApplySparseFieldSet), + (typeof(Lyric), ResourceDefinitionExtensibilityPoints.OnApplySparseFieldSet), + (typeof(Lyric), ResourceDefinitionExtensibilityPoints.OnApplySparseFieldSet), + (typeof(Lyric), ResourceDefinitionExtensibilityPoints.OnApplySparseFieldSet) }, options => options.WithStrictOrdering()); } @@ -184,10 +184,10 @@ await _testContext.RunOnDatabaseAsync(async dbContext => hitCounter.HitExtensibilityPoints.Should().BeEquivalentTo(new[] { - (typeof(Lyric), ResourceDefinitionExtensibilityPoint.OnApplySparseFieldSet), - (typeof(Lyric), ResourceDefinitionExtensibilityPoint.OnApplySparseFieldSet), - (typeof(Lyric), ResourceDefinitionExtensibilityPoint.OnApplySparseFieldSet), - (typeof(Lyric), ResourceDefinitionExtensibilityPoint.OnApplySparseFieldSet) + (typeof(Lyric), ResourceDefinitionExtensibilityPoints.OnApplySparseFieldSet), + (typeof(Lyric), ResourceDefinitionExtensibilityPoints.OnApplySparseFieldSet), + (typeof(Lyric), ResourceDefinitionExtensibilityPoints.OnApplySparseFieldSet), + (typeof(Lyric), ResourceDefinitionExtensibilityPoints.OnApplySparseFieldSet) }, options => options.WithStrictOrdering()); } } diff --git a/test/JsonApiDotNetCoreTests/IntegrationTests/AtomicOperations/ResourceDefinitions/SparseFieldSets/LyricTextDefinition.cs b/test/JsonApiDotNetCoreTests/IntegrationTests/AtomicOperations/ResourceDefinitions/SparseFieldSets/LyricTextDefinition.cs index 8b8949f6ec..8bab070619 100644 --- a/test/JsonApiDotNetCoreTests/IntegrationTests/AtomicOperations/ResourceDefinitions/SparseFieldSets/LyricTextDefinition.cs +++ b/test/JsonApiDotNetCoreTests/IntegrationTests/AtomicOperations/ResourceDefinitions/SparseFieldSets/LyricTextDefinition.cs @@ -9,7 +9,7 @@ public sealed class LyricTextDefinition : HitCountingResourceDefinition ResourceDefinitionExtensibilityPoint.OnApplySparseFieldSet; + protected override ResourceDefinitionExtensibilityPoints ExtensibilityPointsToTrack => ResourceDefinitionExtensibilityPoints.OnApplySparseFieldSet; public LyricTextDefinition(IResourceGraph resourceGraph, LyricPermissionProvider lyricPermissionProvider, ResourceDefinitionHitCounter hitCounter) : base(resourceGraph, hitCounter) diff --git a/test/JsonApiDotNetCoreTests/IntegrationTests/HitCountingResourceDefinition.cs b/test/JsonApiDotNetCoreTests/IntegrationTests/HitCountingResourceDefinition.cs index 5e3fb239f5..58cb641e49 100644 --- a/test/JsonApiDotNetCoreTests/IntegrationTests/HitCountingResourceDefinition.cs +++ b/test/JsonApiDotNetCoreTests/IntegrationTests/HitCountingResourceDefinition.cs @@ -20,7 +20,7 @@ public abstract class HitCountingResourceDefinition : JsonApiRes { private readonly ResourceDefinitionHitCounter _hitCounter; - protected virtual ResourceDefinitionExtensibilityPoint ExtensibilityPointsToTrack => ResourceDefinitionExtensibilityPoint.All; + protected virtual ResourceDefinitionExtensibilityPoints ExtensibilityPointsToTrack => ResourceDefinitionExtensibilityPoints.All; protected HitCountingResourceDefinition(IResourceGraph resourceGraph, ResourceDefinitionHitCounter hitCounter) : base(resourceGraph) @@ -32,9 +32,9 @@ protected HitCountingResourceDefinition(IResourceGraph resourceGraph, ResourceDe public override IImmutableSet OnApplyIncludes(IImmutableSet existingIncludes) { - if (ExtensibilityPointsToTrack.HasFlag(ResourceDefinitionExtensibilityPoint.OnApplyIncludes)) + if (ExtensibilityPointsToTrack.HasFlag(ResourceDefinitionExtensibilityPoints.OnApplyIncludes)) { - _hitCounter.TrackInvocation(ResourceDefinitionExtensibilityPoint.OnApplyIncludes); + _hitCounter.TrackInvocation(ResourceDefinitionExtensibilityPoints.OnApplyIncludes); } return base.OnApplyIncludes(existingIncludes); @@ -42,9 +42,9 @@ public override IImmutableSet OnApplyIncludes(IImmutab public override FilterExpression? OnApplyFilter(FilterExpression? existingFilter) { - if (ExtensibilityPointsToTrack.HasFlag(ResourceDefinitionExtensibilityPoint.OnApplyFilter)) + if (ExtensibilityPointsToTrack.HasFlag(ResourceDefinitionExtensibilityPoints.OnApplyFilter)) { - _hitCounter.TrackInvocation(ResourceDefinitionExtensibilityPoint.OnApplyFilter); + _hitCounter.TrackInvocation(ResourceDefinitionExtensibilityPoints.OnApplyFilter); } return base.OnApplyFilter(existingFilter); @@ -52,9 +52,9 @@ public override IImmutableSet OnApplyIncludes(IImmutab public override SortExpression? OnApplySort(SortExpression? existingSort) { - if (ExtensibilityPointsToTrack.HasFlag(ResourceDefinitionExtensibilityPoint.OnApplySort)) + if (ExtensibilityPointsToTrack.HasFlag(ResourceDefinitionExtensibilityPoints.OnApplySort)) { - _hitCounter.TrackInvocation(ResourceDefinitionExtensibilityPoint.OnApplySort); + _hitCounter.TrackInvocation(ResourceDefinitionExtensibilityPoints.OnApplySort); } return base.OnApplySort(existingSort); @@ -62,9 +62,9 @@ public override IImmutableSet OnApplyIncludes(IImmutab public override PaginationExpression? OnApplyPagination(PaginationExpression? existingPagination) { - if (ExtensibilityPointsToTrack.HasFlag(ResourceDefinitionExtensibilityPoint.OnApplyPagination)) + if (ExtensibilityPointsToTrack.HasFlag(ResourceDefinitionExtensibilityPoints.OnApplyPagination)) { - _hitCounter.TrackInvocation(ResourceDefinitionExtensibilityPoint.OnApplyPagination); + _hitCounter.TrackInvocation(ResourceDefinitionExtensibilityPoints.OnApplyPagination); } return base.OnApplyPagination(existingPagination); @@ -72,9 +72,9 @@ public override IImmutableSet OnApplyIncludes(IImmutab public override SparseFieldSetExpression? OnApplySparseFieldSet(SparseFieldSetExpression? existingSparseFieldSet) { - if (ExtensibilityPointsToTrack.HasFlag(ResourceDefinitionExtensibilityPoint.OnApplySparseFieldSet)) + if (ExtensibilityPointsToTrack.HasFlag(ResourceDefinitionExtensibilityPoints.OnApplySparseFieldSet)) { - _hitCounter.TrackInvocation(ResourceDefinitionExtensibilityPoint.OnApplySparseFieldSet); + _hitCounter.TrackInvocation(ResourceDefinitionExtensibilityPoints.OnApplySparseFieldSet); } return base.OnApplySparseFieldSet(existingSparseFieldSet); @@ -82,9 +82,9 @@ public override IImmutableSet OnApplyIncludes(IImmutab public override QueryStringParameterHandlers? OnRegisterQueryableHandlersForQueryStringParameters() { - if (ExtensibilityPointsToTrack.HasFlag(ResourceDefinitionExtensibilityPoint.OnRegisterQueryableHandlersForQueryStringParameters)) + if (ExtensibilityPointsToTrack.HasFlag(ResourceDefinitionExtensibilityPoints.OnRegisterQueryableHandlersForQueryStringParameters)) { - _hitCounter.TrackInvocation(ResourceDefinitionExtensibilityPoint.OnRegisterQueryableHandlersForQueryStringParameters); + _hitCounter.TrackInvocation(ResourceDefinitionExtensibilityPoints.OnRegisterQueryableHandlersForQueryStringParameters); } return base.OnRegisterQueryableHandlersForQueryStringParameters(); @@ -92,9 +92,9 @@ public override IImmutableSet OnApplyIncludes(IImmutab public override IDictionary? GetMeta(TResource resource) { - if (ExtensibilityPointsToTrack.HasFlag(ResourceDefinitionExtensibilityPoint.GetMeta)) + if (ExtensibilityPointsToTrack.HasFlag(ResourceDefinitionExtensibilityPoints.GetMeta)) { - _hitCounter.TrackInvocation(ResourceDefinitionExtensibilityPoint.GetMeta); + _hitCounter.TrackInvocation(ResourceDefinitionExtensibilityPoints.GetMeta); } return base.GetMeta(resource); @@ -102,9 +102,9 @@ public override IImmutableSet OnApplyIncludes(IImmutab public override Task OnPrepareWriteAsync(TResource resource, WriteOperationKind writeOperation, CancellationToken cancellationToken) { - if (ExtensibilityPointsToTrack.HasFlag(ResourceDefinitionExtensibilityPoint.OnPrepareWriteAsync)) + if (ExtensibilityPointsToTrack.HasFlag(ResourceDefinitionExtensibilityPoints.OnPrepareWriteAsync)) { - _hitCounter.TrackInvocation(ResourceDefinitionExtensibilityPoint.OnPrepareWriteAsync); + _hitCounter.TrackInvocation(ResourceDefinitionExtensibilityPoints.OnPrepareWriteAsync); } return base.OnPrepareWriteAsync(resource, writeOperation, cancellationToken); @@ -113,9 +113,9 @@ public override Task OnPrepareWriteAsync(TResource resource, WriteOperationKind public override Task OnSetToOneRelationshipAsync(TResource leftResource, HasOneAttribute hasOneRelationship, IIdentifiable? rightResourceId, WriteOperationKind writeOperation, CancellationToken cancellationToken) { - if (ExtensibilityPointsToTrack.HasFlag(ResourceDefinitionExtensibilityPoint.OnSetToOneRelationshipAsync)) + if (ExtensibilityPointsToTrack.HasFlag(ResourceDefinitionExtensibilityPoints.OnSetToOneRelationshipAsync)) { - _hitCounter.TrackInvocation(ResourceDefinitionExtensibilityPoint.OnSetToOneRelationshipAsync); + _hitCounter.TrackInvocation(ResourceDefinitionExtensibilityPoints.OnSetToOneRelationshipAsync); } return base.OnSetToOneRelationshipAsync(leftResource, hasOneRelationship, rightResourceId, writeOperation, cancellationToken); @@ -124,9 +124,9 @@ public override Task OnPrepareWriteAsync(TResource resource, WriteOperationKind public override Task OnSetToManyRelationshipAsync(TResource leftResource, HasManyAttribute hasManyRelationship, ISet rightResourceIds, WriteOperationKind writeOperation, CancellationToken cancellationToken) { - if (ExtensibilityPointsToTrack.HasFlag(ResourceDefinitionExtensibilityPoint.OnSetToManyRelationshipAsync)) + if (ExtensibilityPointsToTrack.HasFlag(ResourceDefinitionExtensibilityPoints.OnSetToManyRelationshipAsync)) { - _hitCounter.TrackInvocation(ResourceDefinitionExtensibilityPoint.OnSetToManyRelationshipAsync); + _hitCounter.TrackInvocation(ResourceDefinitionExtensibilityPoints.OnSetToManyRelationshipAsync); } return base.OnSetToManyRelationshipAsync(leftResource, hasManyRelationship, rightResourceIds, writeOperation, cancellationToken); @@ -135,9 +135,9 @@ public override Task OnSetToManyRelationshipAsync(TResource leftResource, HasMan public override Task OnAddToRelationshipAsync(TId leftResourceId, HasManyAttribute hasManyRelationship, ISet rightResourceIds, CancellationToken cancellationToken) { - if (ExtensibilityPointsToTrack.HasFlag(ResourceDefinitionExtensibilityPoint.OnAddToRelationshipAsync)) + if (ExtensibilityPointsToTrack.HasFlag(ResourceDefinitionExtensibilityPoints.OnAddToRelationshipAsync)) { - _hitCounter.TrackInvocation(ResourceDefinitionExtensibilityPoint.OnAddToRelationshipAsync); + _hitCounter.TrackInvocation(ResourceDefinitionExtensibilityPoints.OnAddToRelationshipAsync); } return base.OnAddToRelationshipAsync(leftResourceId, hasManyRelationship, rightResourceIds, cancellationToken); @@ -146,9 +146,9 @@ public override Task OnAddToRelationshipAsync(TId leftResourceId, HasManyAttribu public override Task OnRemoveFromRelationshipAsync(TResource leftResource, HasManyAttribute hasManyRelationship, ISet rightResourceIds, CancellationToken cancellationToken) { - if (ExtensibilityPointsToTrack.HasFlag(ResourceDefinitionExtensibilityPoint.OnRemoveFromRelationshipAsync)) + if (ExtensibilityPointsToTrack.HasFlag(ResourceDefinitionExtensibilityPoints.OnRemoveFromRelationshipAsync)) { - _hitCounter.TrackInvocation(ResourceDefinitionExtensibilityPoint.OnRemoveFromRelationshipAsync); + _hitCounter.TrackInvocation(ResourceDefinitionExtensibilityPoints.OnRemoveFromRelationshipAsync); } return base.OnRemoveFromRelationshipAsync(leftResource, hasManyRelationship, rightResourceIds, cancellationToken); @@ -156,9 +156,9 @@ public override Task OnRemoveFromRelationshipAsync(TResource leftResource, HasMa public override Task OnWritingAsync(TResource resource, WriteOperationKind writeOperation, CancellationToken cancellationToken) { - if (ExtensibilityPointsToTrack.HasFlag(ResourceDefinitionExtensibilityPoint.OnWritingAsync)) + if (ExtensibilityPointsToTrack.HasFlag(ResourceDefinitionExtensibilityPoints.OnWritingAsync)) { - _hitCounter.TrackInvocation(ResourceDefinitionExtensibilityPoint.OnWritingAsync); + _hitCounter.TrackInvocation(ResourceDefinitionExtensibilityPoints.OnWritingAsync); } return base.OnWritingAsync(resource, writeOperation, cancellationToken); @@ -166,9 +166,9 @@ public override Task OnWritingAsync(TResource resource, WriteOperationKind write public override Task OnWriteSucceededAsync(TResource resource, WriteOperationKind writeOperation, CancellationToken cancellationToken) { - if (ExtensibilityPointsToTrack.HasFlag(ResourceDefinitionExtensibilityPoint.OnWriteSucceededAsync)) + if (ExtensibilityPointsToTrack.HasFlag(ResourceDefinitionExtensibilityPoints.OnWriteSucceededAsync)) { - _hitCounter.TrackInvocation(ResourceDefinitionExtensibilityPoint.OnWriteSucceededAsync); + _hitCounter.TrackInvocation(ResourceDefinitionExtensibilityPoints.OnWriteSucceededAsync); } return base.OnWriteSucceededAsync(resource, writeOperation, cancellationToken); @@ -176,9 +176,9 @@ public override Task OnWriteSucceededAsync(TResource resource, WriteOperationKin public override void OnDeserialize(TResource resource) { - if (ExtensibilityPointsToTrack.HasFlag(ResourceDefinitionExtensibilityPoint.OnDeserialize)) + if (ExtensibilityPointsToTrack.HasFlag(ResourceDefinitionExtensibilityPoints.OnDeserialize)) { - _hitCounter.TrackInvocation(ResourceDefinitionExtensibilityPoint.OnDeserialize); + _hitCounter.TrackInvocation(ResourceDefinitionExtensibilityPoints.OnDeserialize); } base.OnDeserialize(resource); @@ -186,9 +186,9 @@ public override void OnDeserialize(TResource resource) public override void OnSerialize(TResource resource) { - if (ExtensibilityPointsToTrack.HasFlag(ResourceDefinitionExtensibilityPoint.OnSerialize)) + if (ExtensibilityPointsToTrack.HasFlag(ResourceDefinitionExtensibilityPoints.OnSerialize)) { - _hitCounter.TrackInvocation(ResourceDefinitionExtensibilityPoint.OnSerialize); + _hitCounter.TrackInvocation(ResourceDefinitionExtensibilityPoints.OnSerialize); } base.OnSerialize(resource); diff --git a/test/JsonApiDotNetCoreTests/IntegrationTests/Meta/ResourceMetaTests.cs b/test/JsonApiDotNetCoreTests/IntegrationTests/Meta/ResourceMetaTests.cs index 3aea1c5d18..dacfe150df 100644 --- a/test/JsonApiDotNetCoreTests/IntegrationTests/Meta/ResourceMetaTests.cs +++ b/test/JsonApiDotNetCoreTests/IntegrationTests/Meta/ResourceMetaTests.cs @@ -65,9 +65,9 @@ await _testContext.RunOnDatabaseAsync(async dbContext => hitCounter.HitExtensibilityPoints.Should().BeEquivalentTo(new[] { - (typeof(SupportTicket), ResourceDefinitionExtensibilityPoint.GetMeta), - (typeof(SupportTicket), ResourceDefinitionExtensibilityPoint.GetMeta), - (typeof(SupportTicket), ResourceDefinitionExtensibilityPoint.GetMeta) + (typeof(SupportTicket), ResourceDefinitionExtensibilityPoints.GetMeta), + (typeof(SupportTicket), ResourceDefinitionExtensibilityPoints.GetMeta), + (typeof(SupportTicket), ResourceDefinitionExtensibilityPoints.GetMeta) }, options => options.WithStrictOrdering()); } @@ -102,7 +102,7 @@ await _testContext.RunOnDatabaseAsync(async dbContext => hitCounter.HitExtensibilityPoints.Should().BeEquivalentTo(new[] { - (typeof(SupportTicket), ResourceDefinitionExtensibilityPoint.GetMeta) + (typeof(SupportTicket), ResourceDefinitionExtensibilityPoints.GetMeta) }, options => options.WithStrictOrdering()); } } diff --git a/test/JsonApiDotNetCoreTests/IntegrationTests/Meta/SupportTicketDefinition.cs b/test/JsonApiDotNetCoreTests/IntegrationTests/Meta/SupportTicketDefinition.cs index 00b7e7ecdc..0c355abce6 100644 --- a/test/JsonApiDotNetCoreTests/IntegrationTests/Meta/SupportTicketDefinition.cs +++ b/test/JsonApiDotNetCoreTests/IntegrationTests/Meta/SupportTicketDefinition.cs @@ -8,7 +8,7 @@ namespace JsonApiDotNetCoreTests.IntegrationTests.Meta [UsedImplicitly(ImplicitUseKindFlags.InstantiatedNoFixedConstructorSignature)] public sealed class SupportTicketDefinition : HitCountingResourceDefinition { - protected override ResourceDefinitionExtensibilityPoint ExtensibilityPointsToTrack => ResourceDefinitionExtensibilityPoint.GetMeta; + protected override ResourceDefinitionExtensibilityPoints ExtensibilityPointsToTrack => ResourceDefinitionExtensibilityPoints.GetMeta; public SupportTicketDefinition(IResourceGraph resourceGraph, ResourceDefinitionHitCounter hitCounter) : base(resourceGraph, hitCounter) diff --git a/test/JsonApiDotNetCoreTests/IntegrationTests/Microservices/FireAndForgetDelivery/FireForgetTests.Group.cs b/test/JsonApiDotNetCoreTests/IntegrationTests/Microservices/FireAndForgetDelivery/FireForgetTests.Group.cs index ec9cfa3c7e..31a01feb99 100644 --- a/test/JsonApiDotNetCoreTests/IntegrationTests/Microservices/FireAndForgetDelivery/FireForgetTests.Group.cs +++ b/test/JsonApiDotNetCoreTests/IntegrationTests/Microservices/FireAndForgetDelivery/FireForgetTests.Group.cs @@ -48,9 +48,9 @@ public async Task Create_group_sends_messages() hitCounter.HitExtensibilityPoints.Should().BeEquivalentTo(new[] { - (typeof(DomainGroup), ResourceDefinitionExtensibilityPoint.OnPrepareWriteAsync), - (typeof(DomainGroup), ResourceDefinitionExtensibilityPoint.OnWritingAsync), - (typeof(DomainGroup), ResourceDefinitionExtensibilityPoint.OnWriteSucceededAsync) + (typeof(DomainGroup), ResourceDefinitionExtensibilityPoints.OnPrepareWriteAsync), + (typeof(DomainGroup), ResourceDefinitionExtensibilityPoints.OnWritingAsync), + (typeof(DomainGroup), ResourceDefinitionExtensibilityPoints.OnWriteSucceededAsync) }, options => options.WithStrictOrdering()); messageBroker.SentMessages.ShouldHaveCount(1); @@ -126,10 +126,10 @@ await _testContext.RunOnDatabaseAsync(async dbContext => hitCounter.HitExtensibilityPoints.Should().BeEquivalentTo(new[] { - (typeof(DomainGroup), ResourceDefinitionExtensibilityPoint.OnPrepareWriteAsync), - (typeof(DomainGroup), ResourceDefinitionExtensibilityPoint.OnSetToManyRelationshipAsync), - (typeof(DomainGroup), ResourceDefinitionExtensibilityPoint.OnWritingAsync), - (typeof(DomainGroup), ResourceDefinitionExtensibilityPoint.OnWriteSucceededAsync) + (typeof(DomainGroup), ResourceDefinitionExtensibilityPoints.OnPrepareWriteAsync), + (typeof(DomainGroup), ResourceDefinitionExtensibilityPoints.OnSetToManyRelationshipAsync), + (typeof(DomainGroup), ResourceDefinitionExtensibilityPoints.OnWritingAsync), + (typeof(DomainGroup), ResourceDefinitionExtensibilityPoints.OnWriteSucceededAsync) }, options => options.WithStrictOrdering()); messageBroker.SentMessages.ShouldHaveCount(3); @@ -192,9 +192,9 @@ await _testContext.RunOnDatabaseAsync(async dbContext => hitCounter.HitExtensibilityPoints.Should().BeEquivalentTo(new[] { - (typeof(DomainGroup), ResourceDefinitionExtensibilityPoint.OnPrepareWriteAsync), - (typeof(DomainGroup), ResourceDefinitionExtensibilityPoint.OnWritingAsync), - (typeof(DomainGroup), ResourceDefinitionExtensibilityPoint.OnWriteSucceededAsync) + (typeof(DomainGroup), ResourceDefinitionExtensibilityPoints.OnPrepareWriteAsync), + (typeof(DomainGroup), ResourceDefinitionExtensibilityPoints.OnWritingAsync), + (typeof(DomainGroup), ResourceDefinitionExtensibilityPoints.OnWriteSucceededAsync) }, options => options.WithStrictOrdering()); messageBroker.SentMessages.ShouldHaveCount(1); @@ -276,10 +276,10 @@ await _testContext.RunOnDatabaseAsync(async dbContext => hitCounter.HitExtensibilityPoints.Should().BeEquivalentTo(new[] { - (typeof(DomainGroup), ResourceDefinitionExtensibilityPoint.OnPrepareWriteAsync), - (typeof(DomainGroup), ResourceDefinitionExtensibilityPoint.OnSetToManyRelationshipAsync), - (typeof(DomainGroup), ResourceDefinitionExtensibilityPoint.OnWritingAsync), - (typeof(DomainGroup), ResourceDefinitionExtensibilityPoint.OnWriteSucceededAsync) + (typeof(DomainGroup), ResourceDefinitionExtensibilityPoints.OnPrepareWriteAsync), + (typeof(DomainGroup), ResourceDefinitionExtensibilityPoints.OnSetToManyRelationshipAsync), + (typeof(DomainGroup), ResourceDefinitionExtensibilityPoints.OnWritingAsync), + (typeof(DomainGroup), ResourceDefinitionExtensibilityPoints.OnWriteSucceededAsync) }, options => options.WithStrictOrdering()); messageBroker.SentMessages.ShouldHaveCount(3); @@ -325,8 +325,8 @@ await _testContext.RunOnDatabaseAsync(async dbContext => hitCounter.HitExtensibilityPoints.Should().BeEquivalentTo(new[] { - (typeof(DomainGroup), ResourceDefinitionExtensibilityPoint.OnWritingAsync), - (typeof(DomainGroup), ResourceDefinitionExtensibilityPoint.OnWriteSucceededAsync) + (typeof(DomainGroup), ResourceDefinitionExtensibilityPoints.OnWritingAsync), + (typeof(DomainGroup), ResourceDefinitionExtensibilityPoints.OnWriteSucceededAsync) }, options => options.WithStrictOrdering()); messageBroker.SentMessages.ShouldHaveCount(1); @@ -363,8 +363,8 @@ await _testContext.RunOnDatabaseAsync(async dbContext => hitCounter.HitExtensibilityPoints.Should().BeEquivalentTo(new[] { - (typeof(DomainGroup), ResourceDefinitionExtensibilityPoint.OnWritingAsync), - (typeof(DomainGroup), ResourceDefinitionExtensibilityPoint.OnWriteSucceededAsync) + (typeof(DomainGroup), ResourceDefinitionExtensibilityPoints.OnWritingAsync), + (typeof(DomainGroup), ResourceDefinitionExtensibilityPoints.OnWriteSucceededAsync) }, options => options.WithStrictOrdering()); messageBroker.SentMessages.ShouldHaveCount(2); @@ -437,10 +437,10 @@ await _testContext.RunOnDatabaseAsync(async dbContext => hitCounter.HitExtensibilityPoints.Should().BeEquivalentTo(new[] { - (typeof(DomainGroup), ResourceDefinitionExtensibilityPoint.OnPrepareWriteAsync), - (typeof(DomainGroup), ResourceDefinitionExtensibilityPoint.OnSetToManyRelationshipAsync), - (typeof(DomainGroup), ResourceDefinitionExtensibilityPoint.OnWritingAsync), - (typeof(DomainGroup), ResourceDefinitionExtensibilityPoint.OnWriteSucceededAsync) + (typeof(DomainGroup), ResourceDefinitionExtensibilityPoints.OnPrepareWriteAsync), + (typeof(DomainGroup), ResourceDefinitionExtensibilityPoints.OnSetToManyRelationshipAsync), + (typeof(DomainGroup), ResourceDefinitionExtensibilityPoints.OnWritingAsync), + (typeof(DomainGroup), ResourceDefinitionExtensibilityPoints.OnWriteSucceededAsync) }, options => options.WithStrictOrdering()); messageBroker.SentMessages.ShouldHaveCount(3); @@ -511,9 +511,9 @@ await _testContext.RunOnDatabaseAsync(async dbContext => hitCounter.HitExtensibilityPoints.Should().BeEquivalentTo(new[] { - (typeof(DomainGroup), ResourceDefinitionExtensibilityPoint.OnAddToRelationshipAsync), - (typeof(DomainGroup), ResourceDefinitionExtensibilityPoint.OnWritingAsync), - (typeof(DomainGroup), ResourceDefinitionExtensibilityPoint.OnWriteSucceededAsync) + (typeof(DomainGroup), ResourceDefinitionExtensibilityPoints.OnAddToRelationshipAsync), + (typeof(DomainGroup), ResourceDefinitionExtensibilityPoints.OnWritingAsync), + (typeof(DomainGroup), ResourceDefinitionExtensibilityPoints.OnWriteSucceededAsync) }, options => options.WithStrictOrdering()); messageBroker.SentMessages.ShouldHaveCount(2); @@ -573,9 +573,9 @@ await _testContext.RunOnDatabaseAsync(async dbContext => hitCounter.HitExtensibilityPoints.Should().BeEquivalentTo(new[] { - (typeof(DomainGroup), ResourceDefinitionExtensibilityPoint.OnRemoveFromRelationshipAsync), - (typeof(DomainGroup), ResourceDefinitionExtensibilityPoint.OnWritingAsync), - (typeof(DomainGroup), ResourceDefinitionExtensibilityPoint.OnWriteSucceededAsync) + (typeof(DomainGroup), ResourceDefinitionExtensibilityPoints.OnRemoveFromRelationshipAsync), + (typeof(DomainGroup), ResourceDefinitionExtensibilityPoints.OnWritingAsync), + (typeof(DomainGroup), ResourceDefinitionExtensibilityPoints.OnWriteSucceededAsync) }, options => options.WithStrictOrdering()); messageBroker.SentMessages.ShouldHaveCount(1); diff --git a/test/JsonApiDotNetCoreTests/IntegrationTests/Microservices/FireAndForgetDelivery/FireForgetTests.User.cs b/test/JsonApiDotNetCoreTests/IntegrationTests/Microservices/FireAndForgetDelivery/FireForgetTests.User.cs index 703db5bd54..b6014d9fb0 100644 --- a/test/JsonApiDotNetCoreTests/IntegrationTests/Microservices/FireAndForgetDelivery/FireForgetTests.User.cs +++ b/test/JsonApiDotNetCoreTests/IntegrationTests/Microservices/FireAndForgetDelivery/FireForgetTests.User.cs @@ -50,9 +50,9 @@ public async Task Create_user_sends_messages() hitCounter.HitExtensibilityPoints.Should().BeEquivalentTo(new[] { - (typeof(DomainUser), ResourceDefinitionExtensibilityPoint.OnPrepareWriteAsync), - (typeof(DomainUser), ResourceDefinitionExtensibilityPoint.OnWritingAsync), - (typeof(DomainUser), ResourceDefinitionExtensibilityPoint.OnWriteSucceededAsync) + (typeof(DomainUser), ResourceDefinitionExtensibilityPoints.OnPrepareWriteAsync), + (typeof(DomainUser), ResourceDefinitionExtensibilityPoints.OnWritingAsync), + (typeof(DomainUser), ResourceDefinitionExtensibilityPoints.OnWriteSucceededAsync) }, options => options.WithStrictOrdering()); messageBroker.SentMessages.ShouldHaveCount(1); @@ -119,10 +119,10 @@ await _testContext.RunOnDatabaseAsync(async dbContext => hitCounter.HitExtensibilityPoints.Should().BeEquivalentTo(new[] { - (typeof(DomainUser), ResourceDefinitionExtensibilityPoint.OnPrepareWriteAsync), - (typeof(DomainUser), ResourceDefinitionExtensibilityPoint.OnSetToOneRelationshipAsync), - (typeof(DomainUser), ResourceDefinitionExtensibilityPoint.OnWritingAsync), - (typeof(DomainUser), ResourceDefinitionExtensibilityPoint.OnWriteSucceededAsync) + (typeof(DomainUser), ResourceDefinitionExtensibilityPoints.OnPrepareWriteAsync), + (typeof(DomainUser), ResourceDefinitionExtensibilityPoints.OnSetToOneRelationshipAsync), + (typeof(DomainUser), ResourceDefinitionExtensibilityPoints.OnWritingAsync), + (typeof(DomainUser), ResourceDefinitionExtensibilityPoints.OnWriteSucceededAsync) }, options => options.WithStrictOrdering()); messageBroker.SentMessages.ShouldHaveCount(2); @@ -183,9 +183,9 @@ await _testContext.RunOnDatabaseAsync(async dbContext => hitCounter.HitExtensibilityPoints.Should().BeEquivalentTo(new[] { - (typeof(DomainUser), ResourceDefinitionExtensibilityPoint.OnPrepareWriteAsync), - (typeof(DomainUser), ResourceDefinitionExtensibilityPoint.OnWritingAsync), - (typeof(DomainUser), ResourceDefinitionExtensibilityPoint.OnWriteSucceededAsync) + (typeof(DomainUser), ResourceDefinitionExtensibilityPoints.OnPrepareWriteAsync), + (typeof(DomainUser), ResourceDefinitionExtensibilityPoints.OnWritingAsync), + (typeof(DomainUser), ResourceDefinitionExtensibilityPoints.OnWriteSucceededAsync) }, options => options.WithStrictOrdering()); messageBroker.SentMessages.ShouldHaveCount(2); @@ -251,10 +251,10 @@ await _testContext.RunOnDatabaseAsync(async dbContext => hitCounter.HitExtensibilityPoints.Should().BeEquivalentTo(new[] { - (typeof(DomainUser), ResourceDefinitionExtensibilityPoint.OnPrepareWriteAsync), - (typeof(DomainUser), ResourceDefinitionExtensibilityPoint.OnSetToOneRelationshipAsync), - (typeof(DomainUser), ResourceDefinitionExtensibilityPoint.OnWritingAsync), - (typeof(DomainUser), ResourceDefinitionExtensibilityPoint.OnWriteSucceededAsync) + (typeof(DomainUser), ResourceDefinitionExtensibilityPoints.OnPrepareWriteAsync), + (typeof(DomainUser), ResourceDefinitionExtensibilityPoints.OnSetToOneRelationshipAsync), + (typeof(DomainUser), ResourceDefinitionExtensibilityPoints.OnWritingAsync), + (typeof(DomainUser), ResourceDefinitionExtensibilityPoints.OnWriteSucceededAsync) }, options => options.WithStrictOrdering()); messageBroker.SentMessages.ShouldHaveCount(2); @@ -323,10 +323,10 @@ await _testContext.RunOnDatabaseAsync(async dbContext => hitCounter.HitExtensibilityPoints.Should().BeEquivalentTo(new[] { - (typeof(DomainUser), ResourceDefinitionExtensibilityPoint.OnPrepareWriteAsync), - (typeof(DomainUser), ResourceDefinitionExtensibilityPoint.OnSetToOneRelationshipAsync), - (typeof(DomainUser), ResourceDefinitionExtensibilityPoint.OnWritingAsync), - (typeof(DomainUser), ResourceDefinitionExtensibilityPoint.OnWriteSucceededAsync) + (typeof(DomainUser), ResourceDefinitionExtensibilityPoints.OnPrepareWriteAsync), + (typeof(DomainUser), ResourceDefinitionExtensibilityPoints.OnSetToOneRelationshipAsync), + (typeof(DomainUser), ResourceDefinitionExtensibilityPoints.OnWritingAsync), + (typeof(DomainUser), ResourceDefinitionExtensibilityPoints.OnWriteSucceededAsync) }, options => options.WithStrictOrdering()); messageBroker.SentMessages.ShouldHaveCount(2); @@ -397,10 +397,10 @@ await _testContext.RunOnDatabaseAsync(async dbContext => hitCounter.HitExtensibilityPoints.Should().BeEquivalentTo(new[] { - (typeof(DomainUser), ResourceDefinitionExtensibilityPoint.OnPrepareWriteAsync), - (typeof(DomainUser), ResourceDefinitionExtensibilityPoint.OnSetToOneRelationshipAsync), - (typeof(DomainUser), ResourceDefinitionExtensibilityPoint.OnWritingAsync), - (typeof(DomainUser), ResourceDefinitionExtensibilityPoint.OnWriteSucceededAsync) + (typeof(DomainUser), ResourceDefinitionExtensibilityPoints.OnPrepareWriteAsync), + (typeof(DomainUser), ResourceDefinitionExtensibilityPoints.OnSetToOneRelationshipAsync), + (typeof(DomainUser), ResourceDefinitionExtensibilityPoints.OnWritingAsync), + (typeof(DomainUser), ResourceDefinitionExtensibilityPoints.OnWriteSucceededAsync) }, options => options.WithStrictOrdering()); messageBroker.SentMessages.ShouldHaveCount(2); @@ -443,8 +443,8 @@ await _testContext.RunOnDatabaseAsync(async dbContext => hitCounter.HitExtensibilityPoints.Should().BeEquivalentTo(new[] { - (typeof(DomainUser), ResourceDefinitionExtensibilityPoint.OnWritingAsync), - (typeof(DomainUser), ResourceDefinitionExtensibilityPoint.OnWriteSucceededAsync) + (typeof(DomainUser), ResourceDefinitionExtensibilityPoints.OnWritingAsync), + (typeof(DomainUser), ResourceDefinitionExtensibilityPoints.OnWriteSucceededAsync) }, options => options.WithStrictOrdering()); messageBroker.SentMessages.ShouldHaveCount(1); @@ -481,8 +481,8 @@ await _testContext.RunOnDatabaseAsync(async dbContext => hitCounter.HitExtensibilityPoints.Should().BeEquivalentTo(new[] { - (typeof(DomainUser), ResourceDefinitionExtensibilityPoint.OnWritingAsync), - (typeof(DomainUser), ResourceDefinitionExtensibilityPoint.OnWriteSucceededAsync) + (typeof(DomainUser), ResourceDefinitionExtensibilityPoints.OnWritingAsync), + (typeof(DomainUser), ResourceDefinitionExtensibilityPoints.OnWriteSucceededAsync) }, options => options.WithStrictOrdering()); messageBroker.SentMessages.ShouldHaveCount(2); @@ -528,10 +528,10 @@ await _testContext.RunOnDatabaseAsync(async dbContext => hitCounter.HitExtensibilityPoints.Should().BeEquivalentTo(new[] { - (typeof(DomainUser), ResourceDefinitionExtensibilityPoint.OnPrepareWriteAsync), - (typeof(DomainUser), ResourceDefinitionExtensibilityPoint.OnSetToOneRelationshipAsync), - (typeof(DomainUser), ResourceDefinitionExtensibilityPoint.OnWritingAsync), - (typeof(DomainUser), ResourceDefinitionExtensibilityPoint.OnWriteSucceededAsync) + (typeof(DomainUser), ResourceDefinitionExtensibilityPoints.OnPrepareWriteAsync), + (typeof(DomainUser), ResourceDefinitionExtensibilityPoints.OnSetToOneRelationshipAsync), + (typeof(DomainUser), ResourceDefinitionExtensibilityPoints.OnWritingAsync), + (typeof(DomainUser), ResourceDefinitionExtensibilityPoints.OnWriteSucceededAsync) }, options => options.WithStrictOrdering()); messageBroker.SentMessages.ShouldHaveCount(1); @@ -578,10 +578,10 @@ await _testContext.RunOnDatabaseAsync(async dbContext => hitCounter.HitExtensibilityPoints.Should().BeEquivalentTo(new[] { - (typeof(DomainUser), ResourceDefinitionExtensibilityPoint.OnPrepareWriteAsync), - (typeof(DomainUser), ResourceDefinitionExtensibilityPoint.OnSetToOneRelationshipAsync), - (typeof(DomainUser), ResourceDefinitionExtensibilityPoint.OnWritingAsync), - (typeof(DomainUser), ResourceDefinitionExtensibilityPoint.OnWriteSucceededAsync) + (typeof(DomainUser), ResourceDefinitionExtensibilityPoints.OnPrepareWriteAsync), + (typeof(DomainUser), ResourceDefinitionExtensibilityPoints.OnSetToOneRelationshipAsync), + (typeof(DomainUser), ResourceDefinitionExtensibilityPoints.OnWritingAsync), + (typeof(DomainUser), ResourceDefinitionExtensibilityPoints.OnWriteSucceededAsync) }, options => options.WithStrictOrdering()); messageBroker.SentMessages.ShouldHaveCount(1); @@ -630,10 +630,10 @@ await _testContext.RunOnDatabaseAsync(async dbContext => hitCounter.HitExtensibilityPoints.Should().BeEquivalentTo(new[] { - (typeof(DomainUser), ResourceDefinitionExtensibilityPoint.OnPrepareWriteAsync), - (typeof(DomainUser), ResourceDefinitionExtensibilityPoint.OnSetToOneRelationshipAsync), - (typeof(DomainUser), ResourceDefinitionExtensibilityPoint.OnWritingAsync), - (typeof(DomainUser), ResourceDefinitionExtensibilityPoint.OnWriteSucceededAsync) + (typeof(DomainUser), ResourceDefinitionExtensibilityPoints.OnPrepareWriteAsync), + (typeof(DomainUser), ResourceDefinitionExtensibilityPoints.OnSetToOneRelationshipAsync), + (typeof(DomainUser), ResourceDefinitionExtensibilityPoints.OnWritingAsync), + (typeof(DomainUser), ResourceDefinitionExtensibilityPoints.OnWriteSucceededAsync) }, options => options.WithStrictOrdering()); messageBroker.SentMessages.ShouldHaveCount(1); diff --git a/test/JsonApiDotNetCoreTests/IntegrationTests/Microservices/FireAndForgetDelivery/FireForgetTests.cs b/test/JsonApiDotNetCoreTests/IntegrationTests/Microservices/FireAndForgetDelivery/FireForgetTests.cs index fef67a81be..93932d1acb 100644 --- a/test/JsonApiDotNetCoreTests/IntegrationTests/Microservices/FireAndForgetDelivery/FireForgetTests.cs +++ b/test/JsonApiDotNetCoreTests/IntegrationTests/Microservices/FireAndForgetDelivery/FireForgetTests.cs @@ -65,7 +65,7 @@ public async Task Does_not_send_message_on_write_error() hitCounter.HitExtensibilityPoints.Should().BeEquivalentTo(new[] { - (typeof(DomainUser), ResourceDefinitionExtensibilityPoint.OnWritingAsync) + (typeof(DomainUser), ResourceDefinitionExtensibilityPoints.OnWritingAsync) }, options => options.WithStrictOrdering()); messageBroker.SentMessages.Should().BeEmpty(); @@ -106,8 +106,8 @@ await _testContext.RunOnDatabaseAsync(async dbContext => hitCounter.HitExtensibilityPoints.Should().BeEquivalentTo(new[] { - (typeof(DomainUser), ResourceDefinitionExtensibilityPoint.OnWritingAsync), - (typeof(DomainUser), ResourceDefinitionExtensibilityPoint.OnWriteSucceededAsync) + (typeof(DomainUser), ResourceDefinitionExtensibilityPoints.OnWritingAsync), + (typeof(DomainUser), ResourceDefinitionExtensibilityPoints.OnWriteSucceededAsync) }, options => options.WithStrictOrdering()); messageBroker.SentMessages.ShouldHaveCount(1); diff --git a/test/JsonApiDotNetCoreTests/IntegrationTests/Microservices/MessagingGroupDefinition.cs b/test/JsonApiDotNetCoreTests/IntegrationTests/Microservices/MessagingGroupDefinition.cs index c41b741801..e08f8398e8 100644 --- a/test/JsonApiDotNetCoreTests/IntegrationTests/Microservices/MessagingGroupDefinition.cs +++ b/test/JsonApiDotNetCoreTests/IntegrationTests/Microservices/MessagingGroupDefinition.cs @@ -20,7 +20,7 @@ public abstract class MessagingGroupDefinition : HitCountingResourceDefinition ResourceDefinitionExtensibilityPoint.Writing; + protected override ResourceDefinitionExtensibilityPoints ExtensibilityPointsToTrack => ResourceDefinitionExtensibilityPoints.Writing; protected MessagingGroupDefinition(IResourceGraph resourceGraph, DbSet userSet, DbSet groupSet, ResourceDefinitionHitCounter hitCounter) diff --git a/test/JsonApiDotNetCoreTests/IntegrationTests/Microservices/MessagingUserDefinition.cs b/test/JsonApiDotNetCoreTests/IntegrationTests/Microservices/MessagingUserDefinition.cs index d7c2a38116..4af5076cca 100644 --- a/test/JsonApiDotNetCoreTests/IntegrationTests/Microservices/MessagingUserDefinition.cs +++ b/test/JsonApiDotNetCoreTests/IntegrationTests/Microservices/MessagingUserDefinition.cs @@ -19,7 +19,7 @@ public abstract class MessagingUserDefinition : HitCountingResourceDefinition ResourceDefinitionExtensibilityPoint.Writing; + protected override ResourceDefinitionExtensibilityPoints ExtensibilityPointsToTrack => ResourceDefinitionExtensibilityPoints.Writing; protected MessagingUserDefinition(IResourceGraph resourceGraph, DbSet userSet, ResourceDefinitionHitCounter hitCounter) : base(resourceGraph, hitCounter) diff --git a/test/JsonApiDotNetCoreTests/IntegrationTests/Microservices/TransactionalOutboxPattern/OutboxTests.Group.cs b/test/JsonApiDotNetCoreTests/IntegrationTests/Microservices/TransactionalOutboxPattern/OutboxTests.Group.cs index b3c25f8e2f..4bbe4e4aa7 100644 --- a/test/JsonApiDotNetCoreTests/IntegrationTests/Microservices/TransactionalOutboxPattern/OutboxTests.Group.cs +++ b/test/JsonApiDotNetCoreTests/IntegrationTests/Microservices/TransactionalOutboxPattern/OutboxTests.Group.cs @@ -54,9 +54,9 @@ await _testContext.RunOnDatabaseAsync(async dbContext => hitCounter.HitExtensibilityPoints.Should().BeEquivalentTo(new[] { - (typeof(DomainGroup), ResourceDefinitionExtensibilityPoint.OnPrepareWriteAsync), - (typeof(DomainGroup), ResourceDefinitionExtensibilityPoint.OnWritingAsync), - (typeof(DomainGroup), ResourceDefinitionExtensibilityPoint.OnWriteSucceededAsync) + (typeof(DomainGroup), ResourceDefinitionExtensibilityPoints.OnPrepareWriteAsync), + (typeof(DomainGroup), ResourceDefinitionExtensibilityPoints.OnWritingAsync), + (typeof(DomainGroup), ResourceDefinitionExtensibilityPoints.OnWriteSucceededAsync) }, options => options.WithStrictOrdering()); Guid newGroupId = Guid.Parse(responseDocument.Data.SingleValue.Id.ShouldNotBeNull()); @@ -136,10 +136,10 @@ await _testContext.RunOnDatabaseAsync(async dbContext => hitCounter.HitExtensibilityPoints.Should().BeEquivalentTo(new[] { - (typeof(DomainGroup), ResourceDefinitionExtensibilityPoint.OnPrepareWriteAsync), - (typeof(DomainGroup), ResourceDefinitionExtensibilityPoint.OnSetToManyRelationshipAsync), - (typeof(DomainGroup), ResourceDefinitionExtensibilityPoint.OnWritingAsync), - (typeof(DomainGroup), ResourceDefinitionExtensibilityPoint.OnWriteSucceededAsync) + (typeof(DomainGroup), ResourceDefinitionExtensibilityPoints.OnPrepareWriteAsync), + (typeof(DomainGroup), ResourceDefinitionExtensibilityPoints.OnSetToManyRelationshipAsync), + (typeof(DomainGroup), ResourceDefinitionExtensibilityPoints.OnWritingAsync), + (typeof(DomainGroup), ResourceDefinitionExtensibilityPoints.OnWriteSucceededAsync) }, options => options.WithStrictOrdering()); Guid newGroupId = Guid.Parse(responseDocument.Data.SingleValue.Id.ShouldNotBeNull()); @@ -206,9 +206,9 @@ await _testContext.RunOnDatabaseAsync(async dbContext => hitCounter.HitExtensibilityPoints.Should().BeEquivalentTo(new[] { - (typeof(DomainGroup), ResourceDefinitionExtensibilityPoint.OnPrepareWriteAsync), - (typeof(DomainGroup), ResourceDefinitionExtensibilityPoint.OnWritingAsync), - (typeof(DomainGroup), ResourceDefinitionExtensibilityPoint.OnWriteSucceededAsync) + (typeof(DomainGroup), ResourceDefinitionExtensibilityPoints.OnPrepareWriteAsync), + (typeof(DomainGroup), ResourceDefinitionExtensibilityPoints.OnWritingAsync), + (typeof(DomainGroup), ResourceDefinitionExtensibilityPoints.OnWriteSucceededAsync) }, options => options.WithStrictOrdering()); await _testContext.RunOnDatabaseAsync(async dbContext => @@ -294,10 +294,10 @@ await _testContext.RunOnDatabaseAsync(async dbContext => hitCounter.HitExtensibilityPoints.Should().BeEquivalentTo(new[] { - (typeof(DomainGroup), ResourceDefinitionExtensibilityPoint.OnPrepareWriteAsync), - (typeof(DomainGroup), ResourceDefinitionExtensibilityPoint.OnSetToManyRelationshipAsync), - (typeof(DomainGroup), ResourceDefinitionExtensibilityPoint.OnWritingAsync), - (typeof(DomainGroup), ResourceDefinitionExtensibilityPoint.OnWriteSucceededAsync) + (typeof(DomainGroup), ResourceDefinitionExtensibilityPoints.OnPrepareWriteAsync), + (typeof(DomainGroup), ResourceDefinitionExtensibilityPoints.OnSetToManyRelationshipAsync), + (typeof(DomainGroup), ResourceDefinitionExtensibilityPoints.OnWritingAsync), + (typeof(DomainGroup), ResourceDefinitionExtensibilityPoints.OnWriteSucceededAsync) }, options => options.WithStrictOrdering()); await _testContext.RunOnDatabaseAsync(async dbContext => @@ -347,8 +347,8 @@ await _testContext.RunOnDatabaseAsync(async dbContext => hitCounter.HitExtensibilityPoints.Should().BeEquivalentTo(new[] { - (typeof(DomainGroup), ResourceDefinitionExtensibilityPoint.OnWritingAsync), - (typeof(DomainGroup), ResourceDefinitionExtensibilityPoint.OnWriteSucceededAsync) + (typeof(DomainGroup), ResourceDefinitionExtensibilityPoints.OnWritingAsync), + (typeof(DomainGroup), ResourceDefinitionExtensibilityPoints.OnWriteSucceededAsync) }, options => options.WithStrictOrdering()); await _testContext.RunOnDatabaseAsync(async dbContext => @@ -389,8 +389,8 @@ await _testContext.RunOnDatabaseAsync(async dbContext => hitCounter.HitExtensibilityPoints.Should().BeEquivalentTo(new[] { - (typeof(DomainGroup), ResourceDefinitionExtensibilityPoint.OnWritingAsync), - (typeof(DomainGroup), ResourceDefinitionExtensibilityPoint.OnWriteSucceededAsync) + (typeof(DomainGroup), ResourceDefinitionExtensibilityPoints.OnWritingAsync), + (typeof(DomainGroup), ResourceDefinitionExtensibilityPoints.OnWriteSucceededAsync) }, options => options.WithStrictOrdering()); await _testContext.RunOnDatabaseAsync(async dbContext => @@ -467,10 +467,10 @@ await _testContext.RunOnDatabaseAsync(async dbContext => hitCounter.HitExtensibilityPoints.Should().BeEquivalentTo(new[] { - (typeof(DomainGroup), ResourceDefinitionExtensibilityPoint.OnPrepareWriteAsync), - (typeof(DomainGroup), ResourceDefinitionExtensibilityPoint.OnSetToManyRelationshipAsync), - (typeof(DomainGroup), ResourceDefinitionExtensibilityPoint.OnWritingAsync), - (typeof(DomainGroup), ResourceDefinitionExtensibilityPoint.OnWriteSucceededAsync) + (typeof(DomainGroup), ResourceDefinitionExtensibilityPoints.OnPrepareWriteAsync), + (typeof(DomainGroup), ResourceDefinitionExtensibilityPoints.OnSetToManyRelationshipAsync), + (typeof(DomainGroup), ResourceDefinitionExtensibilityPoints.OnWritingAsync), + (typeof(DomainGroup), ResourceDefinitionExtensibilityPoints.OnWriteSucceededAsync) }, options => options.WithStrictOrdering()); await _testContext.RunOnDatabaseAsync(async dbContext => @@ -545,9 +545,9 @@ await _testContext.RunOnDatabaseAsync(async dbContext => hitCounter.HitExtensibilityPoints.Should().BeEquivalentTo(new[] { - (typeof(DomainGroup), ResourceDefinitionExtensibilityPoint.OnAddToRelationshipAsync), - (typeof(DomainGroup), ResourceDefinitionExtensibilityPoint.OnWritingAsync), - (typeof(DomainGroup), ResourceDefinitionExtensibilityPoint.OnWriteSucceededAsync) + (typeof(DomainGroup), ResourceDefinitionExtensibilityPoints.OnAddToRelationshipAsync), + (typeof(DomainGroup), ResourceDefinitionExtensibilityPoints.OnWritingAsync), + (typeof(DomainGroup), ResourceDefinitionExtensibilityPoints.OnWriteSucceededAsync) }, options => options.WithStrictOrdering()); await _testContext.RunOnDatabaseAsync(async dbContext => @@ -611,9 +611,9 @@ await _testContext.RunOnDatabaseAsync(async dbContext => hitCounter.HitExtensibilityPoints.Should().BeEquivalentTo(new[] { - (typeof(DomainGroup), ResourceDefinitionExtensibilityPoint.OnRemoveFromRelationshipAsync), - (typeof(DomainGroup), ResourceDefinitionExtensibilityPoint.OnWritingAsync), - (typeof(DomainGroup), ResourceDefinitionExtensibilityPoint.OnWriteSucceededAsync) + (typeof(DomainGroup), ResourceDefinitionExtensibilityPoints.OnRemoveFromRelationshipAsync), + (typeof(DomainGroup), ResourceDefinitionExtensibilityPoints.OnWritingAsync), + (typeof(DomainGroup), ResourceDefinitionExtensibilityPoints.OnWriteSucceededAsync) }, options => options.WithStrictOrdering()); await _testContext.RunOnDatabaseAsync(async dbContext => diff --git a/test/JsonApiDotNetCoreTests/IntegrationTests/Microservices/TransactionalOutboxPattern/OutboxTests.User.cs b/test/JsonApiDotNetCoreTests/IntegrationTests/Microservices/TransactionalOutboxPattern/OutboxTests.User.cs index 2b229d516e..8b233b272c 100644 --- a/test/JsonApiDotNetCoreTests/IntegrationTests/Microservices/TransactionalOutboxPattern/OutboxTests.User.cs +++ b/test/JsonApiDotNetCoreTests/IntegrationTests/Microservices/TransactionalOutboxPattern/OutboxTests.User.cs @@ -57,9 +57,9 @@ await _testContext.RunOnDatabaseAsync(async dbContext => hitCounter.HitExtensibilityPoints.Should().BeEquivalentTo(new[] { - (typeof(DomainUser), ResourceDefinitionExtensibilityPoint.OnPrepareWriteAsync), - (typeof(DomainUser), ResourceDefinitionExtensibilityPoint.OnWritingAsync), - (typeof(DomainUser), ResourceDefinitionExtensibilityPoint.OnWriteSucceededAsync) + (typeof(DomainUser), ResourceDefinitionExtensibilityPoints.OnPrepareWriteAsync), + (typeof(DomainUser), ResourceDefinitionExtensibilityPoints.OnWritingAsync), + (typeof(DomainUser), ResourceDefinitionExtensibilityPoints.OnWriteSucceededAsync) }, options => options.WithStrictOrdering()); Guid newUserId = Guid.Parse(responseDocument.Data.SingleValue.Id.ShouldNotBeNull()); @@ -130,10 +130,10 @@ await _testContext.RunOnDatabaseAsync(async dbContext => hitCounter.HitExtensibilityPoints.Should().BeEquivalentTo(new[] { - (typeof(DomainUser), ResourceDefinitionExtensibilityPoint.OnPrepareWriteAsync), - (typeof(DomainUser), ResourceDefinitionExtensibilityPoint.OnSetToOneRelationshipAsync), - (typeof(DomainUser), ResourceDefinitionExtensibilityPoint.OnWritingAsync), - (typeof(DomainUser), ResourceDefinitionExtensibilityPoint.OnWriteSucceededAsync) + (typeof(DomainUser), ResourceDefinitionExtensibilityPoints.OnPrepareWriteAsync), + (typeof(DomainUser), ResourceDefinitionExtensibilityPoints.OnSetToOneRelationshipAsync), + (typeof(DomainUser), ResourceDefinitionExtensibilityPoints.OnWritingAsync), + (typeof(DomainUser), ResourceDefinitionExtensibilityPoints.OnWriteSucceededAsync) }, options => options.WithStrictOrdering()); Guid newUserId = Guid.Parse(responseDocument.Data.SingleValue.Id.ShouldNotBeNull()); @@ -198,9 +198,9 @@ await _testContext.RunOnDatabaseAsync(async dbContext => hitCounter.HitExtensibilityPoints.Should().BeEquivalentTo(new[] { - (typeof(DomainUser), ResourceDefinitionExtensibilityPoint.OnPrepareWriteAsync), - (typeof(DomainUser), ResourceDefinitionExtensibilityPoint.OnWritingAsync), - (typeof(DomainUser), ResourceDefinitionExtensibilityPoint.OnWriteSucceededAsync) + (typeof(DomainUser), ResourceDefinitionExtensibilityPoints.OnPrepareWriteAsync), + (typeof(DomainUser), ResourceDefinitionExtensibilityPoints.OnWritingAsync), + (typeof(DomainUser), ResourceDefinitionExtensibilityPoints.OnWriteSucceededAsync) }, options => options.WithStrictOrdering()); await _testContext.RunOnDatabaseAsync(async dbContext => @@ -270,10 +270,10 @@ await _testContext.RunOnDatabaseAsync(async dbContext => hitCounter.HitExtensibilityPoints.Should().BeEquivalentTo(new[] { - (typeof(DomainUser), ResourceDefinitionExtensibilityPoint.OnPrepareWriteAsync), - (typeof(DomainUser), ResourceDefinitionExtensibilityPoint.OnSetToOneRelationshipAsync), - (typeof(DomainUser), ResourceDefinitionExtensibilityPoint.OnWritingAsync), - (typeof(DomainUser), ResourceDefinitionExtensibilityPoint.OnWriteSucceededAsync) + (typeof(DomainUser), ResourceDefinitionExtensibilityPoints.OnPrepareWriteAsync), + (typeof(DomainUser), ResourceDefinitionExtensibilityPoints.OnSetToOneRelationshipAsync), + (typeof(DomainUser), ResourceDefinitionExtensibilityPoints.OnWritingAsync), + (typeof(DomainUser), ResourceDefinitionExtensibilityPoints.OnWriteSucceededAsync) }, options => options.WithStrictOrdering()); await _testContext.RunOnDatabaseAsync(async dbContext => @@ -346,10 +346,10 @@ await _testContext.RunOnDatabaseAsync(async dbContext => hitCounter.HitExtensibilityPoints.Should().BeEquivalentTo(new[] { - (typeof(DomainUser), ResourceDefinitionExtensibilityPoint.OnPrepareWriteAsync), - (typeof(DomainUser), ResourceDefinitionExtensibilityPoint.OnSetToOneRelationshipAsync), - (typeof(DomainUser), ResourceDefinitionExtensibilityPoint.OnWritingAsync), - (typeof(DomainUser), ResourceDefinitionExtensibilityPoint.OnWriteSucceededAsync) + (typeof(DomainUser), ResourceDefinitionExtensibilityPoints.OnPrepareWriteAsync), + (typeof(DomainUser), ResourceDefinitionExtensibilityPoints.OnSetToOneRelationshipAsync), + (typeof(DomainUser), ResourceDefinitionExtensibilityPoints.OnWritingAsync), + (typeof(DomainUser), ResourceDefinitionExtensibilityPoints.OnWriteSucceededAsync) }, options => options.WithStrictOrdering()); await _testContext.RunOnDatabaseAsync(async dbContext => @@ -424,10 +424,10 @@ await _testContext.RunOnDatabaseAsync(async dbContext => hitCounter.HitExtensibilityPoints.Should().BeEquivalentTo(new[] { - (typeof(DomainUser), ResourceDefinitionExtensibilityPoint.OnPrepareWriteAsync), - (typeof(DomainUser), ResourceDefinitionExtensibilityPoint.OnSetToOneRelationshipAsync), - (typeof(DomainUser), ResourceDefinitionExtensibilityPoint.OnWritingAsync), - (typeof(DomainUser), ResourceDefinitionExtensibilityPoint.OnWriteSucceededAsync) + (typeof(DomainUser), ResourceDefinitionExtensibilityPoints.OnPrepareWriteAsync), + (typeof(DomainUser), ResourceDefinitionExtensibilityPoints.OnSetToOneRelationshipAsync), + (typeof(DomainUser), ResourceDefinitionExtensibilityPoints.OnWritingAsync), + (typeof(DomainUser), ResourceDefinitionExtensibilityPoints.OnWriteSucceededAsync) }, options => options.WithStrictOrdering()); await _testContext.RunOnDatabaseAsync(async dbContext => @@ -474,8 +474,8 @@ await _testContext.RunOnDatabaseAsync(async dbContext => hitCounter.HitExtensibilityPoints.Should().BeEquivalentTo(new[] { - (typeof(DomainUser), ResourceDefinitionExtensibilityPoint.OnWritingAsync), - (typeof(DomainUser), ResourceDefinitionExtensibilityPoint.OnWriteSucceededAsync) + (typeof(DomainUser), ResourceDefinitionExtensibilityPoints.OnWritingAsync), + (typeof(DomainUser), ResourceDefinitionExtensibilityPoints.OnWriteSucceededAsync) }, options => options.WithStrictOrdering()); await _testContext.RunOnDatabaseAsync(async dbContext => @@ -516,8 +516,8 @@ await _testContext.RunOnDatabaseAsync(async dbContext => hitCounter.HitExtensibilityPoints.Should().BeEquivalentTo(new[] { - (typeof(DomainUser), ResourceDefinitionExtensibilityPoint.OnWritingAsync), - (typeof(DomainUser), ResourceDefinitionExtensibilityPoint.OnWriteSucceededAsync) + (typeof(DomainUser), ResourceDefinitionExtensibilityPoints.OnWritingAsync), + (typeof(DomainUser), ResourceDefinitionExtensibilityPoints.OnWriteSucceededAsync) }, options => options.WithStrictOrdering()); await _testContext.RunOnDatabaseAsync(async dbContext => @@ -567,10 +567,10 @@ await _testContext.RunOnDatabaseAsync(async dbContext => hitCounter.HitExtensibilityPoints.Should().BeEquivalentTo(new[] { - (typeof(DomainUser), ResourceDefinitionExtensibilityPoint.OnPrepareWriteAsync), - (typeof(DomainUser), ResourceDefinitionExtensibilityPoint.OnSetToOneRelationshipAsync), - (typeof(DomainUser), ResourceDefinitionExtensibilityPoint.OnWritingAsync), - (typeof(DomainUser), ResourceDefinitionExtensibilityPoint.OnWriteSucceededAsync) + (typeof(DomainUser), ResourceDefinitionExtensibilityPoints.OnPrepareWriteAsync), + (typeof(DomainUser), ResourceDefinitionExtensibilityPoints.OnSetToOneRelationshipAsync), + (typeof(DomainUser), ResourceDefinitionExtensibilityPoints.OnWritingAsync), + (typeof(DomainUser), ResourceDefinitionExtensibilityPoints.OnWriteSucceededAsync) }, options => options.WithStrictOrdering()); await _testContext.RunOnDatabaseAsync(async dbContext => @@ -621,10 +621,10 @@ await _testContext.RunOnDatabaseAsync(async dbContext => hitCounter.HitExtensibilityPoints.Should().BeEquivalentTo(new[] { - (typeof(DomainUser), ResourceDefinitionExtensibilityPoint.OnPrepareWriteAsync), - (typeof(DomainUser), ResourceDefinitionExtensibilityPoint.OnSetToOneRelationshipAsync), - (typeof(DomainUser), ResourceDefinitionExtensibilityPoint.OnWritingAsync), - (typeof(DomainUser), ResourceDefinitionExtensibilityPoint.OnWriteSucceededAsync) + (typeof(DomainUser), ResourceDefinitionExtensibilityPoints.OnPrepareWriteAsync), + (typeof(DomainUser), ResourceDefinitionExtensibilityPoints.OnSetToOneRelationshipAsync), + (typeof(DomainUser), ResourceDefinitionExtensibilityPoints.OnWritingAsync), + (typeof(DomainUser), ResourceDefinitionExtensibilityPoints.OnWriteSucceededAsync) }, options => options.WithStrictOrdering()); await _testContext.RunOnDatabaseAsync(async dbContext => @@ -677,10 +677,10 @@ await _testContext.RunOnDatabaseAsync(async dbContext => hitCounter.HitExtensibilityPoints.Should().BeEquivalentTo(new[] { - (typeof(DomainUser), ResourceDefinitionExtensibilityPoint.OnPrepareWriteAsync), - (typeof(DomainUser), ResourceDefinitionExtensibilityPoint.OnSetToOneRelationshipAsync), - (typeof(DomainUser), ResourceDefinitionExtensibilityPoint.OnWritingAsync), - (typeof(DomainUser), ResourceDefinitionExtensibilityPoint.OnWriteSucceededAsync) + (typeof(DomainUser), ResourceDefinitionExtensibilityPoints.OnPrepareWriteAsync), + (typeof(DomainUser), ResourceDefinitionExtensibilityPoints.OnSetToOneRelationshipAsync), + (typeof(DomainUser), ResourceDefinitionExtensibilityPoints.OnWritingAsync), + (typeof(DomainUser), ResourceDefinitionExtensibilityPoints.OnWriteSucceededAsync) }, options => options.WithStrictOrdering()); await _testContext.RunOnDatabaseAsync(async dbContext => diff --git a/test/JsonApiDotNetCoreTests/IntegrationTests/Microservices/TransactionalOutboxPattern/OutboxTests.cs b/test/JsonApiDotNetCoreTests/IntegrationTests/Microservices/TransactionalOutboxPattern/OutboxTests.cs index 961a66feac..5c4a353a1b 100644 --- a/test/JsonApiDotNetCoreTests/IntegrationTests/Microservices/TransactionalOutboxPattern/OutboxTests.cs +++ b/test/JsonApiDotNetCoreTests/IntegrationTests/Microservices/TransactionalOutboxPattern/OutboxTests.cs @@ -94,8 +94,8 @@ await _testContext.RunOnDatabaseAsync(async dbContext => hitCounter.HitExtensibilityPoints.Should().BeEquivalentTo(new[] { - (typeof(DomainGroup), ResourceDefinitionExtensibilityPoint.OnAddToRelationshipAsync), - (typeof(DomainGroup), ResourceDefinitionExtensibilityPoint.OnWritingAsync) + (typeof(DomainGroup), ResourceDefinitionExtensibilityPoints.OnAddToRelationshipAsync), + (typeof(DomainGroup), ResourceDefinitionExtensibilityPoints.OnWritingAsync) }, options => options.WithStrictOrdering()); await _testContext.RunOnDatabaseAsync(async dbContext => diff --git a/test/JsonApiDotNetCoreTests/IntegrationTests/ResourceDefinitionExtensibilityPoint.cs b/test/JsonApiDotNetCoreTests/IntegrationTests/ResourceDefinitionExtensibilityPoints.cs similarity index 96% rename from test/JsonApiDotNetCoreTests/IntegrationTests/ResourceDefinitionExtensibilityPoint.cs rename to test/JsonApiDotNetCoreTests/IntegrationTests/ResourceDefinitionExtensibilityPoints.cs index fc99a3d061..4946b2e49d 100644 --- a/test/JsonApiDotNetCoreTests/IntegrationTests/ResourceDefinitionExtensibilityPoint.cs +++ b/test/JsonApiDotNetCoreTests/IntegrationTests/ResourceDefinitionExtensibilityPoints.cs @@ -7,7 +7,7 @@ namespace JsonApiDotNetCoreTests.IntegrationTests /// Lists the various extensibility points on . /// [Flags] - public enum ResourceDefinitionExtensibilityPoint + public enum ResourceDefinitionExtensibilityPoints { OnApplyIncludes = 1, OnApplyFilter = 1 << 1, diff --git a/test/JsonApiDotNetCoreTests/IntegrationTests/ResourceDefinitionHitCounter.cs b/test/JsonApiDotNetCoreTests/IntegrationTests/ResourceDefinitionHitCounter.cs index 3d465119fd..14c0fdaf9e 100644 --- a/test/JsonApiDotNetCoreTests/IntegrationTests/ResourceDefinitionHitCounter.cs +++ b/test/JsonApiDotNetCoreTests/IntegrationTests/ResourceDefinitionHitCounter.cs @@ -9,9 +9,10 @@ namespace JsonApiDotNetCoreTests.IntegrationTests /// public sealed class ResourceDefinitionHitCounter { - internal IList<(Type, ResourceDefinitionExtensibilityPoint)> HitExtensibilityPoints { get; } = new List<(Type, ResourceDefinitionExtensibilityPoint)>(); + internal IList<(Type, ResourceDefinitionExtensibilityPoints)> HitExtensibilityPoints { get; } = + new List<(Type, ResourceDefinitionExtensibilityPoints)>(); - internal void TrackInvocation(ResourceDefinitionExtensibilityPoint extensibilityPoint) + internal void TrackInvocation(ResourceDefinitionExtensibilityPoints extensibilityPoint) where TResource : IIdentifiable { HitExtensibilityPoints.Add((typeof(TResource), extensibilityPoint)); diff --git a/test/JsonApiDotNetCoreTests/IntegrationTests/ResourceDefinitions/Reading/MoonDefinition.cs b/test/JsonApiDotNetCoreTests/IntegrationTests/ResourceDefinitions/Reading/MoonDefinition.cs index ae496b96a8..550a733739 100644 --- a/test/JsonApiDotNetCoreTests/IntegrationTests/ResourceDefinitions/Reading/MoonDefinition.cs +++ b/test/JsonApiDotNetCoreTests/IntegrationTests/ResourceDefinitions/Reading/MoonDefinition.cs @@ -14,7 +14,7 @@ public sealed class MoonDefinition : HitCountingResourceDefinition { private readonly IClientSettingsProvider _clientSettingsProvider; - protected override ResourceDefinitionExtensibilityPoint ExtensibilityPointsToTrack => ResourceDefinitionExtensibilityPoint.Reading; + protected override ResourceDefinitionExtensibilityPoints ExtensibilityPointsToTrack => ResourceDefinitionExtensibilityPoints.Reading; public MoonDefinition(IResourceGraph resourceGraph, IClientSettingsProvider clientSettingsProvider, ResourceDefinitionHitCounter hitCounter) : base(resourceGraph, hitCounter) diff --git a/test/JsonApiDotNetCoreTests/IntegrationTests/ResourceDefinitions/Reading/PlanetDefinition.cs b/test/JsonApiDotNetCoreTests/IntegrationTests/ResourceDefinitions/Reading/PlanetDefinition.cs index 032f335320..d7152bf962 100644 --- a/test/JsonApiDotNetCoreTests/IntegrationTests/ResourceDefinitions/Reading/PlanetDefinition.cs +++ b/test/JsonApiDotNetCoreTests/IntegrationTests/ResourceDefinitions/Reading/PlanetDefinition.cs @@ -15,7 +15,7 @@ public sealed class PlanetDefinition : HitCountingResourceDefinition ResourceDefinitionExtensibilityPoint.Reading; + protected override ResourceDefinitionExtensibilityPoints ExtensibilityPointsToTrack => ResourceDefinitionExtensibilityPoints.Reading; public PlanetDefinition(IResourceGraph resourceGraph, IClientSettingsProvider clientSettingsProvider, ResourceDefinitionHitCounter hitCounter) : base(resourceGraph, hitCounter) diff --git a/test/JsonApiDotNetCoreTests/IntegrationTests/ResourceDefinitions/Reading/ResourceDefinitionReadTests.cs b/test/JsonApiDotNetCoreTests/IntegrationTests/ResourceDefinitions/Reading/ResourceDefinitionReadTests.cs index 53db3dd474..ea8971d6f0 100644 --- a/test/JsonApiDotNetCoreTests/IntegrationTests/ResourceDefinitions/Reading/ResourceDefinitionReadTests.cs +++ b/test/JsonApiDotNetCoreTests/IntegrationTests/ResourceDefinitions/Reading/ResourceDefinitionReadTests.cs @@ -81,12 +81,12 @@ await _testContext.RunOnDatabaseAsync(async dbContext => hitCounter.HitExtensibilityPoints.Should().BeEquivalentTo(new[] { - (typeof(Planet), ResourceDefinitionExtensibilityPoint.OnApplyFilter), - (typeof(Planet), ResourceDefinitionExtensibilityPoint.OnApplyPagination), - (typeof(Planet), ResourceDefinitionExtensibilityPoint.OnApplyFilter), - (typeof(Planet), ResourceDefinitionExtensibilityPoint.OnApplySort), - (typeof(Planet), ResourceDefinitionExtensibilityPoint.OnApplySparseFieldSet), - (typeof(Planet), ResourceDefinitionExtensibilityPoint.OnApplyIncludes) + (typeof(Planet), ResourceDefinitionExtensibilityPoints.OnApplyFilter), + (typeof(Planet), ResourceDefinitionExtensibilityPoints.OnApplyPagination), + (typeof(Planet), ResourceDefinitionExtensibilityPoints.OnApplyFilter), + (typeof(Planet), ResourceDefinitionExtensibilityPoints.OnApplySort), + (typeof(Planet), ResourceDefinitionExtensibilityPoints.OnApplySparseFieldSet), + (typeof(Planet), ResourceDefinitionExtensibilityPoints.OnApplyIncludes) }, options => options.WithStrictOrdering()); } @@ -133,17 +133,17 @@ await _testContext.RunOnDatabaseAsync(async dbContext => hitCounter.HitExtensibilityPoints.Should().BeEquivalentTo(new[] { - (typeof(Moon), ResourceDefinitionExtensibilityPoint.OnApplyPagination), - (typeof(Moon), ResourceDefinitionExtensibilityPoint.OnApplyFilter), - (typeof(Moon), ResourceDefinitionExtensibilityPoint.OnApplySort), - (typeof(Moon), ResourceDefinitionExtensibilityPoint.OnApplySparseFieldSet), - (typeof(Moon), ResourceDefinitionExtensibilityPoint.OnApplyIncludes), - (typeof(Planet), ResourceDefinitionExtensibilityPoint.OnApplySparseFieldSet), - (typeof(Planet), ResourceDefinitionExtensibilityPoint.OnApplyIncludes), - (typeof(Moon), ResourceDefinitionExtensibilityPoint.OnApplySparseFieldSet), - (typeof(Moon), ResourceDefinitionExtensibilityPoint.GetMeta), - (typeof(Planet), ResourceDefinitionExtensibilityPoint.OnApplySparseFieldSet), - (typeof(Planet), ResourceDefinitionExtensibilityPoint.GetMeta) + (typeof(Moon), ResourceDefinitionExtensibilityPoints.OnApplyPagination), + (typeof(Moon), ResourceDefinitionExtensibilityPoints.OnApplyFilter), + (typeof(Moon), ResourceDefinitionExtensibilityPoints.OnApplySort), + (typeof(Moon), ResourceDefinitionExtensibilityPoints.OnApplySparseFieldSet), + (typeof(Moon), ResourceDefinitionExtensibilityPoints.OnApplyIncludes), + (typeof(Planet), ResourceDefinitionExtensibilityPoints.OnApplySparseFieldSet), + (typeof(Planet), ResourceDefinitionExtensibilityPoints.OnApplyIncludes), + (typeof(Moon), ResourceDefinitionExtensibilityPoints.OnApplySparseFieldSet), + (typeof(Moon), ResourceDefinitionExtensibilityPoints.GetMeta), + (typeof(Planet), ResourceDefinitionExtensibilityPoints.OnApplySparseFieldSet), + (typeof(Planet), ResourceDefinitionExtensibilityPoints.GetMeta) }, options => options.WithStrictOrdering()); } @@ -190,21 +190,21 @@ await _testContext.RunOnDatabaseAsync(async dbContext => hitCounter.HitExtensibilityPoints.Should().BeEquivalentTo(new[] { - (typeof(Planet), ResourceDefinitionExtensibilityPoint.OnApplyPagination), - (typeof(Planet), ResourceDefinitionExtensibilityPoint.OnApplyFilter), - (typeof(Planet), ResourceDefinitionExtensibilityPoint.OnApplySort), - (typeof(Planet), ResourceDefinitionExtensibilityPoint.OnApplySparseFieldSet), - (typeof(Planet), ResourceDefinitionExtensibilityPoint.OnApplyIncludes), - (typeof(Moon), ResourceDefinitionExtensibilityPoint.OnApplyFilter), - (typeof(Moon), ResourceDefinitionExtensibilityPoint.OnApplySort), - (typeof(Moon), ResourceDefinitionExtensibilityPoint.OnApplyPagination), - (typeof(Moon), ResourceDefinitionExtensibilityPoint.OnApplySparseFieldSet), - (typeof(Moon), ResourceDefinitionExtensibilityPoint.OnApplyIncludes), - (typeof(Planet), ResourceDefinitionExtensibilityPoint.OnApplyIncludes), - (typeof(Planet), ResourceDefinitionExtensibilityPoint.OnApplySparseFieldSet), - (typeof(Planet), ResourceDefinitionExtensibilityPoint.GetMeta), - (typeof(Moon), ResourceDefinitionExtensibilityPoint.OnApplySparseFieldSet), - (typeof(Moon), ResourceDefinitionExtensibilityPoint.GetMeta) + (typeof(Planet), ResourceDefinitionExtensibilityPoints.OnApplyPagination), + (typeof(Planet), ResourceDefinitionExtensibilityPoints.OnApplyFilter), + (typeof(Planet), ResourceDefinitionExtensibilityPoints.OnApplySort), + (typeof(Planet), ResourceDefinitionExtensibilityPoints.OnApplySparseFieldSet), + (typeof(Planet), ResourceDefinitionExtensibilityPoints.OnApplyIncludes), + (typeof(Moon), ResourceDefinitionExtensibilityPoints.OnApplyFilter), + (typeof(Moon), ResourceDefinitionExtensibilityPoints.OnApplySort), + (typeof(Moon), ResourceDefinitionExtensibilityPoints.OnApplyPagination), + (typeof(Moon), ResourceDefinitionExtensibilityPoints.OnApplySparseFieldSet), + (typeof(Moon), ResourceDefinitionExtensibilityPoints.OnApplyIncludes), + (typeof(Planet), ResourceDefinitionExtensibilityPoints.OnApplyIncludes), + (typeof(Planet), ResourceDefinitionExtensibilityPoints.OnApplySparseFieldSet), + (typeof(Planet), ResourceDefinitionExtensibilityPoints.GetMeta), + (typeof(Moon), ResourceDefinitionExtensibilityPoints.OnApplySparseFieldSet), + (typeof(Moon), ResourceDefinitionExtensibilityPoints.GetMeta) }, options => options.WithStrictOrdering()); } @@ -248,15 +248,15 @@ await _testContext.RunOnDatabaseAsync(async dbContext => hitCounter.HitExtensibilityPoints.Should().BeEquivalentTo(new[] { - (typeof(Planet), ResourceDefinitionExtensibilityPoint.OnApplyFilter), - (typeof(Planet), ResourceDefinitionExtensibilityPoint.OnApplyPagination), - (typeof(Planet), ResourceDefinitionExtensibilityPoint.OnApplyFilter), - (typeof(Planet), ResourceDefinitionExtensibilityPoint.OnApplySort), - (typeof(Planet), ResourceDefinitionExtensibilityPoint.OnApplySparseFieldSet), - (typeof(Planet), ResourceDefinitionExtensibilityPoint.OnApplyIncludes), - (typeof(Planet), ResourceDefinitionExtensibilityPoint.OnApplySparseFieldSet), - (typeof(Planet), ResourceDefinitionExtensibilityPoint.GetMeta), - (typeof(Planet), ResourceDefinitionExtensibilityPoint.GetMeta) + (typeof(Planet), ResourceDefinitionExtensibilityPoints.OnApplyFilter), + (typeof(Planet), ResourceDefinitionExtensibilityPoints.OnApplyPagination), + (typeof(Planet), ResourceDefinitionExtensibilityPoints.OnApplyFilter), + (typeof(Planet), ResourceDefinitionExtensibilityPoints.OnApplySort), + (typeof(Planet), ResourceDefinitionExtensibilityPoints.OnApplySparseFieldSet), + (typeof(Planet), ResourceDefinitionExtensibilityPoints.OnApplyIncludes), + (typeof(Planet), ResourceDefinitionExtensibilityPoints.OnApplySparseFieldSet), + (typeof(Planet), ResourceDefinitionExtensibilityPoints.GetMeta), + (typeof(Planet), ResourceDefinitionExtensibilityPoints.GetMeta) }, options => options.WithStrictOrdering()); } @@ -307,14 +307,14 @@ await _testContext.RunOnDatabaseAsync(async dbContext => hitCounter.HitExtensibilityPoints.Should().BeEquivalentTo(new[] { - (typeof(Planet), ResourceDefinitionExtensibilityPoint.OnApplyFilter), - (typeof(Planet), ResourceDefinitionExtensibilityPoint.OnApplyPagination), - (typeof(Planet), ResourceDefinitionExtensibilityPoint.OnApplyFilter), - (typeof(Planet), ResourceDefinitionExtensibilityPoint.OnApplySort), - (typeof(Planet), ResourceDefinitionExtensibilityPoint.OnApplySparseFieldSet), - (typeof(Planet), ResourceDefinitionExtensibilityPoint.OnApplyIncludes), - (typeof(Planet), ResourceDefinitionExtensibilityPoint.OnApplySparseFieldSet), - (typeof(Planet), ResourceDefinitionExtensibilityPoint.GetMeta) + (typeof(Planet), ResourceDefinitionExtensibilityPoints.OnApplyFilter), + (typeof(Planet), ResourceDefinitionExtensibilityPoints.OnApplyPagination), + (typeof(Planet), ResourceDefinitionExtensibilityPoints.OnApplyFilter), + (typeof(Planet), ResourceDefinitionExtensibilityPoints.OnApplySort), + (typeof(Planet), ResourceDefinitionExtensibilityPoints.OnApplySparseFieldSet), + (typeof(Planet), ResourceDefinitionExtensibilityPoints.OnApplyIncludes), + (typeof(Planet), ResourceDefinitionExtensibilityPoints.OnApplySparseFieldSet), + (typeof(Planet), ResourceDefinitionExtensibilityPoints.GetMeta) }, options => options.WithStrictOrdering()); } @@ -359,18 +359,18 @@ await _testContext.RunOnDatabaseAsync(async dbContext => hitCounter.HitExtensibilityPoints.Should().BeEquivalentTo(new[] { - (typeof(Star), ResourceDefinitionExtensibilityPoint.OnApplyFilter), - (typeof(Planet), ResourceDefinitionExtensibilityPoint.OnApplyFilter), - (typeof(Planet), ResourceDefinitionExtensibilityPoint.OnApplyPagination), - (typeof(Planet), ResourceDefinitionExtensibilityPoint.OnApplyFilter), - (typeof(Planet), ResourceDefinitionExtensibilityPoint.OnApplySort), - (typeof(Planet), ResourceDefinitionExtensibilityPoint.OnApplySparseFieldSet), - (typeof(Planet), ResourceDefinitionExtensibilityPoint.OnApplyIncludes), - (typeof(Star), ResourceDefinitionExtensibilityPoint.OnApplySparseFieldSet), - (typeof(Star), ResourceDefinitionExtensibilityPoint.OnApplyFilter), - (typeof(Planet), ResourceDefinitionExtensibilityPoint.OnApplySparseFieldSet), - (typeof(Planet), ResourceDefinitionExtensibilityPoint.GetMeta), - (typeof(Planet), ResourceDefinitionExtensibilityPoint.GetMeta) + (typeof(Star), ResourceDefinitionExtensibilityPoints.OnApplyFilter), + (typeof(Planet), ResourceDefinitionExtensibilityPoints.OnApplyFilter), + (typeof(Planet), ResourceDefinitionExtensibilityPoints.OnApplyPagination), + (typeof(Planet), ResourceDefinitionExtensibilityPoints.OnApplyFilter), + (typeof(Planet), ResourceDefinitionExtensibilityPoints.OnApplySort), + (typeof(Planet), ResourceDefinitionExtensibilityPoints.OnApplySparseFieldSet), + (typeof(Planet), ResourceDefinitionExtensibilityPoints.OnApplyIncludes), + (typeof(Star), ResourceDefinitionExtensibilityPoints.OnApplySparseFieldSet), + (typeof(Star), ResourceDefinitionExtensibilityPoints.OnApplyFilter), + (typeof(Planet), ResourceDefinitionExtensibilityPoints.OnApplySparseFieldSet), + (typeof(Planet), ResourceDefinitionExtensibilityPoints.GetMeta), + (typeof(Planet), ResourceDefinitionExtensibilityPoints.GetMeta) }, options => options.WithStrictOrdering()); } @@ -415,16 +415,16 @@ await _testContext.RunOnDatabaseAsync(async dbContext => hitCounter.HitExtensibilityPoints.Should().BeEquivalentTo(new[] { - (typeof(Star), ResourceDefinitionExtensibilityPoint.OnApplyFilter), - (typeof(Planet), ResourceDefinitionExtensibilityPoint.OnApplyFilter), - (typeof(Planet), ResourceDefinitionExtensibilityPoint.OnApplyPagination), - (typeof(Planet), ResourceDefinitionExtensibilityPoint.OnApplyFilter), - (typeof(Planet), ResourceDefinitionExtensibilityPoint.OnApplySort), - (typeof(Planet), ResourceDefinitionExtensibilityPoint.OnApplySparseFieldSet), - (typeof(Planet), ResourceDefinitionExtensibilityPoint.OnApplyIncludes), - (typeof(Planet), ResourceDefinitionExtensibilityPoint.OnApplySparseFieldSet), - (typeof(Star), ResourceDefinitionExtensibilityPoint.OnApplySparseFieldSet), - (typeof(Star), ResourceDefinitionExtensibilityPoint.OnApplyFilter) + (typeof(Star), ResourceDefinitionExtensibilityPoints.OnApplyFilter), + (typeof(Planet), ResourceDefinitionExtensibilityPoints.OnApplyFilter), + (typeof(Planet), ResourceDefinitionExtensibilityPoints.OnApplyPagination), + (typeof(Planet), ResourceDefinitionExtensibilityPoints.OnApplyFilter), + (typeof(Planet), ResourceDefinitionExtensibilityPoints.OnApplySort), + (typeof(Planet), ResourceDefinitionExtensibilityPoints.OnApplySparseFieldSet), + (typeof(Planet), ResourceDefinitionExtensibilityPoints.OnApplyIncludes), + (typeof(Planet), ResourceDefinitionExtensibilityPoints.OnApplySparseFieldSet), + (typeof(Star), ResourceDefinitionExtensibilityPoints.OnApplySparseFieldSet), + (typeof(Star), ResourceDefinitionExtensibilityPoints.OnApplyFilter) }, options => options.WithStrictOrdering()); } @@ -467,16 +467,16 @@ await _testContext.RunOnDatabaseAsync(async dbContext => hitCounter.HitExtensibilityPoints.Should().BeEquivalentTo(new[] { - (typeof(Star), ResourceDefinitionExtensibilityPoint.OnApplyFilter), - (typeof(Star), ResourceDefinitionExtensibilityPoint.OnApplyPagination), - (typeof(Star), ResourceDefinitionExtensibilityPoint.OnApplyFilter), - (typeof(Star), ResourceDefinitionExtensibilityPoint.OnApplySort), - (typeof(Star), ResourceDefinitionExtensibilityPoint.OnApplySparseFieldSet), - (typeof(Star), ResourceDefinitionExtensibilityPoint.OnApplyIncludes), - (typeof(Star), ResourceDefinitionExtensibilityPoint.OnApplySparseFieldSet), - (typeof(Star), ResourceDefinitionExtensibilityPoint.GetMeta), - (typeof(Star), ResourceDefinitionExtensibilityPoint.GetMeta), - (typeof(Star), ResourceDefinitionExtensibilityPoint.GetMeta) + (typeof(Star), ResourceDefinitionExtensibilityPoints.OnApplyFilter), + (typeof(Star), ResourceDefinitionExtensibilityPoints.OnApplyPagination), + (typeof(Star), ResourceDefinitionExtensibilityPoints.OnApplyFilter), + (typeof(Star), ResourceDefinitionExtensibilityPoints.OnApplySort), + (typeof(Star), ResourceDefinitionExtensibilityPoints.OnApplySparseFieldSet), + (typeof(Star), ResourceDefinitionExtensibilityPoints.OnApplyIncludes), + (typeof(Star), ResourceDefinitionExtensibilityPoints.OnApplySparseFieldSet), + (typeof(Star), ResourceDefinitionExtensibilityPoints.GetMeta), + (typeof(Star), ResourceDefinitionExtensibilityPoints.GetMeta), + (typeof(Star), ResourceDefinitionExtensibilityPoints.GetMeta) }, options => options.WithStrictOrdering()); } @@ -519,16 +519,16 @@ await _testContext.RunOnDatabaseAsync(async dbContext => hitCounter.HitExtensibilityPoints.Should().BeEquivalentTo(new[] { - (typeof(Star), ResourceDefinitionExtensibilityPoint.OnApplyFilter), - (typeof(Star), ResourceDefinitionExtensibilityPoint.OnApplyPagination), - (typeof(Star), ResourceDefinitionExtensibilityPoint.OnApplyFilter), - (typeof(Star), ResourceDefinitionExtensibilityPoint.OnApplySort), - (typeof(Star), ResourceDefinitionExtensibilityPoint.OnApplySparseFieldSet), - (typeof(Star), ResourceDefinitionExtensibilityPoint.OnApplyIncludes), - (typeof(Star), ResourceDefinitionExtensibilityPoint.OnApplySparseFieldSet), - (typeof(Star), ResourceDefinitionExtensibilityPoint.GetMeta), - (typeof(Star), ResourceDefinitionExtensibilityPoint.GetMeta), - (typeof(Star), ResourceDefinitionExtensibilityPoint.GetMeta) + (typeof(Star), ResourceDefinitionExtensibilityPoints.OnApplyFilter), + (typeof(Star), ResourceDefinitionExtensibilityPoints.OnApplyPagination), + (typeof(Star), ResourceDefinitionExtensibilityPoints.OnApplyFilter), + (typeof(Star), ResourceDefinitionExtensibilityPoints.OnApplySort), + (typeof(Star), ResourceDefinitionExtensibilityPoints.OnApplySparseFieldSet), + (typeof(Star), ResourceDefinitionExtensibilityPoints.OnApplyIncludes), + (typeof(Star), ResourceDefinitionExtensibilityPoints.OnApplySparseFieldSet), + (typeof(Star), ResourceDefinitionExtensibilityPoints.GetMeta), + (typeof(Star), ResourceDefinitionExtensibilityPoints.GetMeta), + (typeof(Star), ResourceDefinitionExtensibilityPoints.GetMeta) }, options => options.WithStrictOrdering()); } @@ -559,18 +559,18 @@ await _testContext.RunOnDatabaseAsync(async dbContext => hitCounter.HitExtensibilityPoints.Should().BeEquivalentTo(new[] { - (typeof(Star), ResourceDefinitionExtensibilityPoint.OnApplyFilter), - (typeof(Star), ResourceDefinitionExtensibilityPoint.OnApplyPagination), - (typeof(Star), ResourceDefinitionExtensibilityPoint.OnApplyFilter), - (typeof(Star), ResourceDefinitionExtensibilityPoint.OnApplySort), - (typeof(Star), ResourceDefinitionExtensibilityPoint.OnApplySparseFieldSet), - (typeof(Star), ResourceDefinitionExtensibilityPoint.OnApplyIncludes), - (typeof(Star), ResourceDefinitionExtensibilityPoint.OnApplySparseFieldSet), - (typeof(Star), ResourceDefinitionExtensibilityPoint.GetMeta), - (typeof(Star), ResourceDefinitionExtensibilityPoint.GetMeta), - (typeof(Star), ResourceDefinitionExtensibilityPoint.GetMeta), - (typeof(Star), ResourceDefinitionExtensibilityPoint.GetMeta), - (typeof(Star), ResourceDefinitionExtensibilityPoint.GetMeta) + (typeof(Star), ResourceDefinitionExtensibilityPoints.OnApplyFilter), + (typeof(Star), ResourceDefinitionExtensibilityPoints.OnApplyPagination), + (typeof(Star), ResourceDefinitionExtensibilityPoints.OnApplyFilter), + (typeof(Star), ResourceDefinitionExtensibilityPoints.OnApplySort), + (typeof(Star), ResourceDefinitionExtensibilityPoints.OnApplySparseFieldSet), + (typeof(Star), ResourceDefinitionExtensibilityPoints.OnApplyIncludes), + (typeof(Star), ResourceDefinitionExtensibilityPoints.OnApplySparseFieldSet), + (typeof(Star), ResourceDefinitionExtensibilityPoints.GetMeta), + (typeof(Star), ResourceDefinitionExtensibilityPoints.GetMeta), + (typeof(Star), ResourceDefinitionExtensibilityPoints.GetMeta), + (typeof(Star), ResourceDefinitionExtensibilityPoints.GetMeta), + (typeof(Star), ResourceDefinitionExtensibilityPoints.GetMeta) }, options => options.WithStrictOrdering()); } @@ -604,13 +604,13 @@ await _testContext.RunOnDatabaseAsync(async dbContext => hitCounter.HitExtensibilityPoints.Should().BeEquivalentTo(new[] { - (typeof(Star), ResourceDefinitionExtensibilityPoint.OnApplyPagination), - (typeof(Star), ResourceDefinitionExtensibilityPoint.OnApplyFilter), - (typeof(Star), ResourceDefinitionExtensibilityPoint.OnApplySort), - (typeof(Star), ResourceDefinitionExtensibilityPoint.OnApplySparseFieldSet), - (typeof(Star), ResourceDefinitionExtensibilityPoint.OnApplyIncludes), - (typeof(Star), ResourceDefinitionExtensibilityPoint.OnApplySparseFieldSet), - (typeof(Star), ResourceDefinitionExtensibilityPoint.GetMeta) + (typeof(Star), ResourceDefinitionExtensibilityPoints.OnApplyPagination), + (typeof(Star), ResourceDefinitionExtensibilityPoints.OnApplyFilter), + (typeof(Star), ResourceDefinitionExtensibilityPoints.OnApplySort), + (typeof(Star), ResourceDefinitionExtensibilityPoints.OnApplySparseFieldSet), + (typeof(Star), ResourceDefinitionExtensibilityPoints.OnApplyIncludes), + (typeof(Star), ResourceDefinitionExtensibilityPoints.OnApplySparseFieldSet), + (typeof(Star), ResourceDefinitionExtensibilityPoints.GetMeta) }, options => options.WithStrictOrdering()); } @@ -645,13 +645,13 @@ await _testContext.RunOnDatabaseAsync(async dbContext => hitCounter.HitExtensibilityPoints.Should().BeEquivalentTo(new[] { - (typeof(Star), ResourceDefinitionExtensibilityPoint.OnApplyPagination), - (typeof(Star), ResourceDefinitionExtensibilityPoint.OnApplyFilter), - (typeof(Star), ResourceDefinitionExtensibilityPoint.OnApplySort), - (typeof(Star), ResourceDefinitionExtensibilityPoint.OnApplySparseFieldSet), - (typeof(Star), ResourceDefinitionExtensibilityPoint.OnApplyIncludes), - (typeof(Star), ResourceDefinitionExtensibilityPoint.OnApplySparseFieldSet), - (typeof(Star), ResourceDefinitionExtensibilityPoint.GetMeta) + (typeof(Star), ResourceDefinitionExtensibilityPoints.OnApplyPagination), + (typeof(Star), ResourceDefinitionExtensibilityPoints.OnApplyFilter), + (typeof(Star), ResourceDefinitionExtensibilityPoints.OnApplySort), + (typeof(Star), ResourceDefinitionExtensibilityPoints.OnApplySparseFieldSet), + (typeof(Star), ResourceDefinitionExtensibilityPoints.OnApplyIncludes), + (typeof(Star), ResourceDefinitionExtensibilityPoints.OnApplySparseFieldSet), + (typeof(Star), ResourceDefinitionExtensibilityPoints.GetMeta) }, options => options.WithStrictOrdering()); } @@ -685,13 +685,13 @@ await _testContext.RunOnDatabaseAsync(async dbContext => hitCounter.HitExtensibilityPoints.Should().BeEquivalentTo(new[] { - (typeof(Star), ResourceDefinitionExtensibilityPoint.OnApplyPagination), - (typeof(Star), ResourceDefinitionExtensibilityPoint.OnApplyFilter), - (typeof(Star), ResourceDefinitionExtensibilityPoint.OnApplySort), - (typeof(Star), ResourceDefinitionExtensibilityPoint.OnApplySparseFieldSet), - (typeof(Star), ResourceDefinitionExtensibilityPoint.OnApplyIncludes), - (typeof(Star), ResourceDefinitionExtensibilityPoint.OnApplySparseFieldSet), - (typeof(Star), ResourceDefinitionExtensibilityPoint.GetMeta) + (typeof(Star), ResourceDefinitionExtensibilityPoints.OnApplyPagination), + (typeof(Star), ResourceDefinitionExtensibilityPoints.OnApplyFilter), + (typeof(Star), ResourceDefinitionExtensibilityPoints.OnApplySort), + (typeof(Star), ResourceDefinitionExtensibilityPoints.OnApplySparseFieldSet), + (typeof(Star), ResourceDefinitionExtensibilityPoints.OnApplyIncludes), + (typeof(Star), ResourceDefinitionExtensibilityPoints.OnApplySparseFieldSet), + (typeof(Star), ResourceDefinitionExtensibilityPoints.GetMeta) }, options => options.WithStrictOrdering()); } @@ -725,13 +725,13 @@ await _testContext.RunOnDatabaseAsync(async dbContext => hitCounter.HitExtensibilityPoints.Should().BeEquivalentTo(new[] { - (typeof(Star), ResourceDefinitionExtensibilityPoint.OnApplyPagination), - (typeof(Star), ResourceDefinitionExtensibilityPoint.OnApplyFilter), - (typeof(Star), ResourceDefinitionExtensibilityPoint.OnApplySort), - (typeof(Star), ResourceDefinitionExtensibilityPoint.OnApplySparseFieldSet), - (typeof(Star), ResourceDefinitionExtensibilityPoint.OnApplyIncludes), - (typeof(Star), ResourceDefinitionExtensibilityPoint.OnApplySparseFieldSet), - (typeof(Star), ResourceDefinitionExtensibilityPoint.GetMeta) + (typeof(Star), ResourceDefinitionExtensibilityPoints.OnApplyPagination), + (typeof(Star), ResourceDefinitionExtensibilityPoints.OnApplyFilter), + (typeof(Star), ResourceDefinitionExtensibilityPoints.OnApplySort), + (typeof(Star), ResourceDefinitionExtensibilityPoints.OnApplySparseFieldSet), + (typeof(Star), ResourceDefinitionExtensibilityPoints.OnApplyIncludes), + (typeof(Star), ResourceDefinitionExtensibilityPoints.OnApplySparseFieldSet), + (typeof(Star), ResourceDefinitionExtensibilityPoints.GetMeta) }, options => options.WithStrictOrdering()); } @@ -769,16 +769,16 @@ await _testContext.RunOnDatabaseAsync(async dbContext => hitCounter.HitExtensibilityPoints.Should().BeEquivalentTo(new[] { - (typeof(Moon), ResourceDefinitionExtensibilityPoint.OnRegisterQueryableHandlersForQueryStringParameters), - (typeof(Moon), ResourceDefinitionExtensibilityPoint.OnRegisterQueryableHandlersForQueryStringParameters), - (typeof(Moon), ResourceDefinitionExtensibilityPoint.OnApplyFilter), - (typeof(Moon), ResourceDefinitionExtensibilityPoint.OnApplyPagination), - (typeof(Moon), ResourceDefinitionExtensibilityPoint.OnApplyFilter), - (typeof(Moon), ResourceDefinitionExtensibilityPoint.OnApplySort), - (typeof(Moon), ResourceDefinitionExtensibilityPoint.OnApplySparseFieldSet), - (typeof(Moon), ResourceDefinitionExtensibilityPoint.OnApplyIncludes), - (typeof(Moon), ResourceDefinitionExtensibilityPoint.OnApplySparseFieldSet), - (typeof(Moon), ResourceDefinitionExtensibilityPoint.GetMeta) + (typeof(Moon), ResourceDefinitionExtensibilityPoints.OnRegisterQueryableHandlersForQueryStringParameters), + (typeof(Moon), ResourceDefinitionExtensibilityPoints.OnRegisterQueryableHandlersForQueryStringParameters), + (typeof(Moon), ResourceDefinitionExtensibilityPoints.OnApplyFilter), + (typeof(Moon), ResourceDefinitionExtensibilityPoints.OnApplyPagination), + (typeof(Moon), ResourceDefinitionExtensibilityPoints.OnApplyFilter), + (typeof(Moon), ResourceDefinitionExtensibilityPoints.OnApplySort), + (typeof(Moon), ResourceDefinitionExtensibilityPoints.OnApplySparseFieldSet), + (typeof(Moon), ResourceDefinitionExtensibilityPoints.OnApplyIncludes), + (typeof(Moon), ResourceDefinitionExtensibilityPoints.OnApplySparseFieldSet), + (typeof(Moon), ResourceDefinitionExtensibilityPoints.GetMeta) }, options => options.WithStrictOrdering()); } @@ -826,16 +826,16 @@ await _testContext.RunOnDatabaseAsync(async dbContext => hitCounter.HitExtensibilityPoints.Should().BeEquivalentTo(new[] { - (typeof(Moon), ResourceDefinitionExtensibilityPoint.OnRegisterQueryableHandlersForQueryStringParameters), - (typeof(Moon), ResourceDefinitionExtensibilityPoint.OnRegisterQueryableHandlersForQueryStringParameters), - (typeof(Moon), ResourceDefinitionExtensibilityPoint.OnApplyFilter), - (typeof(Moon), ResourceDefinitionExtensibilityPoint.OnApplyPagination), - (typeof(Moon), ResourceDefinitionExtensibilityPoint.OnApplyFilter), - (typeof(Moon), ResourceDefinitionExtensibilityPoint.OnApplySort), - (typeof(Moon), ResourceDefinitionExtensibilityPoint.OnApplySparseFieldSet), - (typeof(Moon), ResourceDefinitionExtensibilityPoint.OnApplyIncludes), - (typeof(Moon), ResourceDefinitionExtensibilityPoint.OnApplySparseFieldSet), - (typeof(Moon), ResourceDefinitionExtensibilityPoint.GetMeta) + (typeof(Moon), ResourceDefinitionExtensibilityPoints.OnRegisterQueryableHandlersForQueryStringParameters), + (typeof(Moon), ResourceDefinitionExtensibilityPoints.OnRegisterQueryableHandlersForQueryStringParameters), + (typeof(Moon), ResourceDefinitionExtensibilityPoints.OnApplyFilter), + (typeof(Moon), ResourceDefinitionExtensibilityPoints.OnApplyPagination), + (typeof(Moon), ResourceDefinitionExtensibilityPoints.OnApplyFilter), + (typeof(Moon), ResourceDefinitionExtensibilityPoints.OnApplySort), + (typeof(Moon), ResourceDefinitionExtensibilityPoints.OnApplySparseFieldSet), + (typeof(Moon), ResourceDefinitionExtensibilityPoints.OnApplyIncludes), + (typeof(Moon), ResourceDefinitionExtensibilityPoints.OnApplySparseFieldSet), + (typeof(Moon), ResourceDefinitionExtensibilityPoints.GetMeta) }, options => options.WithStrictOrdering()); } @@ -873,7 +873,7 @@ await _testContext.RunOnDatabaseAsync(async dbContext => hitCounter.HitExtensibilityPoints.Should().BeEquivalentTo(new[] { - (typeof(Moon), ResourceDefinitionExtensibilityPoint.OnRegisterQueryableHandlersForQueryStringParameters) + (typeof(Moon), ResourceDefinitionExtensibilityPoints.OnRegisterQueryableHandlersForQueryStringParameters) }, options => options.WithStrictOrdering()); } } diff --git a/test/JsonApiDotNetCoreTests/IntegrationTests/ResourceDefinitions/Reading/StarDefinition.cs b/test/JsonApiDotNetCoreTests/IntegrationTests/ResourceDefinitions/Reading/StarDefinition.cs index a2b938dea1..c209ff3295 100644 --- a/test/JsonApiDotNetCoreTests/IntegrationTests/ResourceDefinitions/Reading/StarDefinition.cs +++ b/test/JsonApiDotNetCoreTests/IntegrationTests/ResourceDefinitions/Reading/StarDefinition.cs @@ -8,7 +8,7 @@ namespace JsonApiDotNetCoreTests.IntegrationTests.ResourceDefinitions.Reading [UsedImplicitly(ImplicitUseKindFlags.InstantiatedNoFixedConstructorSignature)] public sealed class StarDefinition : HitCountingResourceDefinition { - protected override ResourceDefinitionExtensibilityPoint ExtensibilityPointsToTrack => ResourceDefinitionExtensibilityPoint.Reading; + protected override ResourceDefinitionExtensibilityPoints ExtensibilityPointsToTrack => ResourceDefinitionExtensibilityPoints.Reading; public StarDefinition(IResourceGraph resourceGraph, ResourceDefinitionHitCounter hitCounter) : base(resourceGraph, hitCounter) diff --git a/test/JsonApiDotNetCoreTests/IntegrationTests/ResourceDefinitions/Serialization/ResourceDefinitionSerializationTests.cs b/test/JsonApiDotNetCoreTests/IntegrationTests/ResourceDefinitions/Serialization/ResourceDefinitionSerializationTests.cs index 937bbb1957..7bd35f1130 100644 --- a/test/JsonApiDotNetCoreTests/IntegrationTests/ResourceDefinitions/Serialization/ResourceDefinitionSerializationTests.cs +++ b/test/JsonApiDotNetCoreTests/IntegrationTests/ResourceDefinitions/Serialization/ResourceDefinitionSerializationTests.cs @@ -83,8 +83,8 @@ await _testContext.RunOnDatabaseAsync(async dbContext => hitCounter.HitExtensibilityPoints.Should().BeEquivalentTo(new[] { - (typeof(Student), ResourceDefinitionExtensibilityPoint.OnSerialize), - (typeof(Student), ResourceDefinitionExtensibilityPoint.OnSerialize) + (typeof(Student), ResourceDefinitionExtensibilityPoints.OnSerialize), + (typeof(Student), ResourceDefinitionExtensibilityPoints.OnSerialize) }, options => options.WithStrictOrdering()); } @@ -152,10 +152,10 @@ await _testContext.RunOnDatabaseAsync(async dbContext => hitCounter.HitExtensibilityPoints.Should().BeEquivalentTo(new[] { - (typeof(Student), ResourceDefinitionExtensibilityPoint.OnSerialize), - (typeof(Student), ResourceDefinitionExtensibilityPoint.OnSerialize), - (typeof(Student), ResourceDefinitionExtensibilityPoint.OnSerialize), - (typeof(Student), ResourceDefinitionExtensibilityPoint.OnSerialize) + (typeof(Student), ResourceDefinitionExtensibilityPoints.OnSerialize), + (typeof(Student), ResourceDefinitionExtensibilityPoints.OnSerialize), + (typeof(Student), ResourceDefinitionExtensibilityPoints.OnSerialize), + (typeof(Student), ResourceDefinitionExtensibilityPoints.OnSerialize) }, options => options.WithStrictOrdering()); } @@ -194,7 +194,7 @@ await _testContext.RunOnDatabaseAsync(async dbContext => hitCounter.HitExtensibilityPoints.Should().BeEquivalentTo(new[] { - (typeof(Student), ResourceDefinitionExtensibilityPoint.OnSerialize) + (typeof(Student), ResourceDefinitionExtensibilityPoints.OnSerialize) }, options => options.WithStrictOrdering()); } @@ -242,8 +242,8 @@ await _testContext.RunOnDatabaseAsync(async dbContext => hitCounter.HitExtensibilityPoints.Should().BeEquivalentTo(new[] { - (typeof(Student), ResourceDefinitionExtensibilityPoint.OnSerialize), - (typeof(Student), ResourceDefinitionExtensibilityPoint.OnSerialize) + (typeof(Student), ResourceDefinitionExtensibilityPoints.OnSerialize), + (typeof(Student), ResourceDefinitionExtensibilityPoints.OnSerialize) }, options => options.WithStrictOrdering()); } @@ -283,7 +283,7 @@ await _testContext.RunOnDatabaseAsync(async dbContext => hitCounter.HitExtensibilityPoints.Should().BeEquivalentTo(new[] { - (typeof(Student), ResourceDefinitionExtensibilityPoint.OnSerialize) + (typeof(Student), ResourceDefinitionExtensibilityPoints.OnSerialize) }, options => options.WithStrictOrdering()); } @@ -325,7 +325,7 @@ await _testContext.RunOnDatabaseAsync(async dbContext => hitCounter.HitExtensibilityPoints.Should().BeEquivalentTo(new[] { - (typeof(Student), ResourceDefinitionExtensibilityPoint.OnSerialize) + (typeof(Student), ResourceDefinitionExtensibilityPoints.OnSerialize) }, options => options.WithStrictOrdering()); } @@ -381,8 +381,8 @@ await _testContext.RunOnDatabaseAsync(async dbContext => hitCounter.HitExtensibilityPoints.Should().BeEquivalentTo(new[] { - (typeof(Student), ResourceDefinitionExtensibilityPoint.OnDeserialize), - (typeof(Student), ResourceDefinitionExtensibilityPoint.OnSerialize) + (typeof(Student), ResourceDefinitionExtensibilityPoints.OnDeserialize), + (typeof(Student), ResourceDefinitionExtensibilityPoints.OnSerialize) }, options => options.WithStrictOrdering()); } @@ -450,7 +450,7 @@ await _testContext.RunOnDatabaseAsync(async dbContext => hitCounter.HitExtensibilityPoints.Should().BeEquivalentTo(new[] { - (typeof(Student), ResourceDefinitionExtensibilityPoint.OnSerialize) + (typeof(Student), ResourceDefinitionExtensibilityPoints.OnSerialize) }, options => options.WithStrictOrdering()); } @@ -511,8 +511,8 @@ await _testContext.RunOnDatabaseAsync(async dbContext => hitCounter.HitExtensibilityPoints.Should().BeEquivalentTo(new[] { - (typeof(Student), ResourceDefinitionExtensibilityPoint.OnDeserialize), - (typeof(Student), ResourceDefinitionExtensibilityPoint.OnSerialize) + (typeof(Student), ResourceDefinitionExtensibilityPoints.OnDeserialize), + (typeof(Student), ResourceDefinitionExtensibilityPoints.OnSerialize) }, options => options.WithStrictOrdering()); } @@ -596,8 +596,8 @@ await _testContext.RunOnDatabaseAsync(async dbContext => hitCounter.HitExtensibilityPoints.Should().BeEquivalentTo(new[] { - (typeof(Student), ResourceDefinitionExtensibilityPoint.OnSerialize), - (typeof(Student), ResourceDefinitionExtensibilityPoint.OnSerialize) + (typeof(Student), ResourceDefinitionExtensibilityPoints.OnSerialize), + (typeof(Student), ResourceDefinitionExtensibilityPoints.OnSerialize) }, options => options.WithStrictOrdering()); } diff --git a/test/JsonApiDotNetCoreTests/IntegrationTests/ResourceDefinitions/Serialization/StudentDefinition.cs b/test/JsonApiDotNetCoreTests/IntegrationTests/ResourceDefinitions/Serialization/StudentDefinition.cs index 4cf10a3594..82b02e682f 100644 --- a/test/JsonApiDotNetCoreTests/IntegrationTests/ResourceDefinitions/Serialization/StudentDefinition.cs +++ b/test/JsonApiDotNetCoreTests/IntegrationTests/ResourceDefinitions/Serialization/StudentDefinition.cs @@ -8,7 +8,7 @@ public sealed class StudentDefinition : HitCountingResourceDefinition ResourceDefinitionExtensibilityPoint.Serialization; + protected override ResourceDefinitionExtensibilityPoints ExtensibilityPointsToTrack => ResourceDefinitionExtensibilityPoints.Serialization; public StudentDefinition(IResourceGraph resourceGraph, IEncryptionService encryptionService, ResourceDefinitionHitCounter hitCounter) : base(resourceGraph, hitCounter) From c184efe354b482ab91a62515bad2c66c01fcb798 Mon Sep 17 00:00:00 2001 From: Bart Koelman Date: Thu, 4 Nov 2021 04:03:21 +0100 Subject: [PATCH 5/6] Clarified documentation; fixed broken link --- docs/usage/options.md | 3 +++ docs/usage/resources/nullability.md | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/docs/usage/options.md b/docs/usage/options.md index 8b1ee5bae8..0cad33d655 100644 --- a/docs/usage/options.md +++ b/docs/usage/options.md @@ -39,6 +39,9 @@ options.MaximumPageNumber = new PageNumber(50); options.IncludeTotalResourceCount = true; ``` +To retrieve the total number of resources on secondary and relationship endpoints, the reverse of the relationship must to be available. For example, in `GET /customers/1/orders`, both the relationships `[HasMany] Customer.Orders` and `[HasOne] Order.Customer` must be defined. +If `IncludeTotalResourceCount` is set to `false` (or the inverse relationship is unavailable on a non-primary endpoint), best-effort paging links are returned instead. This means no `last` link and the `next` link only occurs when the current page is full. + ## Relative Links All links are absolute by default. However, you can configure relative links. diff --git a/docs/usage/resources/nullability.md b/docs/usage/resources/nullability.md index c3ec59eab6..aaa5e10817 100644 --- a/docs/usage/resources/nullability.md +++ b/docs/usage/resources/nullability.md @@ -2,7 +2,7 @@ Properties on a resource class can be declared as nullable or non-nullable. This affects both ASP.NET ModelState validation and the way Entity Framework Core generates database columns. -ModelState validation is enabled by default since v5.0. In earlier versions, it can be enabled in [options](~/usage/options.md#enable-modelstate-validation). +ModelState validation is enabled by default since v5.0. In earlier versions, it can be enabled in [options](~/usage/options.md#modelstate-validation). # Value types From c76ff4d0afbb93b93e32af3524e24e7f8aabff4e Mon Sep 17 00:00:00 2001 From: Bart Koelman Date: Thu, 4 Nov 2021 12:52:54 +0100 Subject: [PATCH 6/6] Check off roadmap entry --- ROADMAP.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ROADMAP.md b/ROADMAP.md index d96e015953..b45d4cef19 100644 --- a/ROADMAP.md +++ b/ROADMAP.md @@ -22,10 +22,10 @@ The need for breaking changes has blocked several efforts in the v4.x release, s - [x] Support System.Text.Json [#664](https://github.com/json-api-dotnet/JsonApiDotNetCore/issues/664) [#999](https://github.com/json-api-dotnet/JsonApiDotNetCore/issues/999) [1077](https://github.com/json-api-dotnet/JsonApiDotNetCore/issues/1077) [1078](https://github.com/json-api-dotnet/JsonApiDotNetCore/issues/1078) - [x] Optimize IIdentifiable to ResourceObject conversion [#1028](https://github.com/json-api-dotnet/JsonApiDotNetCore/issues/1028) [#1024](https://github.com/json-api-dotnet/JsonApiDotNetCore/issues/1024) [#233](https://github.com/json-api-dotnet/JsonApiDotNetCore/issues/233) - [x] Nullable reference types [#1029](https://github.com/json-api-dotnet/JsonApiDotNetCore/issues/1029) +- [x] Improved paging links [#1010](https://github.com/json-api-dotnet/JsonApiDotNetCore/issues/1010) Aside from the list above, we have interest in the following topics. It's too soon yet to decide whether they'll make it into v5.x or in a later major version. -- Improved paging links [#1010](https://github.com/json-api-dotnet/JsonApiDotNetCore/issues/1010) - Auto-generated controllers [#732](https://github.com/json-api-dotnet/JsonApiDotNetCore/issues/732) [#365](https://github.com/json-api-dotnet/JsonApiDotNetCore/issues/365) - Configuration validation [#170](https://github.com/json-api-dotnet/JsonApiDotNetCore/issues/170) - Optimistic concurrency [#1004](https://github.com/json-api-dotnet/JsonApiDotNetCore/issues/1004)