From 69cbdc2c55df2657e4d22904cbb119edf0d20abe Mon Sep 17 00:00:00 2001 From: Paul Welter Date: Thu, 21 Dec 2023 14:49:24 -0600 Subject: [PATCH] upgrade to .net 8 and lastest mediatR --- .github/workflows/dotnet.yml | 17 +-- ...cker.WebService.EntityFrameworkCore.csproj | 8 +- .../Tracker.WebService.MongoDB.csproj | 6 +- src/Directory.Build.props | 2 +- src/MediatR.CommandQuery.Audit/AuditRecord.cs | 4 +- .../AuditServiceExtensions.cs | 2 - .../ChangeCollector.cs | 4 - .../IChangeCollector.cs | 3 - .../MediatR.CommandQuery.Audit.csproj | 4 +- .../DomainServiceExtensions.cs | 40 +++--- .../Handlers/EntityIdentifierQueryHandler.cs | 5 - .../MediatR.CommandQuery.Cosmos.csproj | 4 +- .../DomainServiceExtensions.cs | 40 +++--- ...tR.CommandQuery.EntityFrameworkCore.csproj | 4 +- .../HangfireConfigurationExtensions.cs | 2 - .../IMediatorDispatcher.cs | 3 - .../MediatR.CommandQuery.Hangfire.csproj | 6 +- .../MediatorDispatcher.cs | 3 - .../MediatorExtensions.cs | 4 - .../DomainServiceExtensions.cs | 40 +++--- .../MediatR.CommandQuery.MongoDB.csproj | 4 +- .../EntityCommandControllerBase.cs | 2 - .../EntityQueryControllerBase.cs | 4 - .../JsonExceptionMiddleware.cs | 3 - .../MediatR.CommandQuery.Mvc.csproj | 2 +- .../Behaviors/MemoryCacheQueryBehavior.cs | 8 +- .../MediatR.CommandQuery.csproj | 16 +-- templates/DomainServiceRegistration.csx | 17 +-- templates/EntityController.csx | 13 +- .../Acceptance/AuditTests.cs | 56 +++++--- .../Acceptance/PriorityTests.cs | 7 +- .../Acceptance/TaskTests.cs | 84 +++++++----- .../CosmosKeyTests.cs | 4 - .../Data/Repositories/AuditRepository.cs | 6 - .../DatabaseCollection.cs | 2 - .../DatabaseFixture.cs | 112 +--------------- .../DatabaseInitializer.cs | 60 +++++++++ .../DatabaseTestBase.cs | 21 +-- .../Domain/Audit/AuditServiceRegistration.cs | 10 +- .../Priority/PriorityServiceRegistration.cs | 7 +- .../Domain/Role/RoleServiceRegistration.cs | 10 +- .../Status/StatusServiceRegistration.cs | 10 +- .../Domain/Task/TaskServiceRegistration.cs | 9 +- .../Tenant/TenantServiceRegistration.cs | 10 +- .../Domain/User/UserServiceRegistration.cs | 9 +- .../UserLogin/UserLoginServiceRegistration.cs | 9 +- .../GlobalUsings.cs | 3 + .../Logging/LogEntry.cs | 58 -------- .../Logging/MemoryLogger.cs | 35 ----- .../Logging/MemoryLoggerFactoryExtensions.cs | 15 --- .../Logging/MemoryLoggerProvider.cs | 50 ------- .../MediatR.CommandQuery.Cosmos.Tests.csproj | 25 ++-- .../MockPrincipal.cs | 1 - .../MockTenantResolver.cs | 1 - .../Acceptance/AuditTests.cs | 41 +++--- .../Acceptance/PriorityTests.cs | 10 +- .../Acceptance/TaskTests.cs | 85 ++++++------ .../Data/DataServiceRegistration.cs | 28 ++-- .../Data/TrackerContext.cs | 5 - .../DatabaseCollection.cs | 4 - .../DatabaseFixture.cs | 125 ++---------------- .../DatabaseInitializer.cs | 67 ++++++++++ .../DatabaseTestBase.cs | 21 +-- .../Domain/Audit/AuditServiceRegistration.cs | 8 +- .../Priority/PriorityServiceRegistration.cs | 8 +- .../Domain/Role/RoleServiceRegistration.cs | 8 +- .../Status/StatusServiceRegistration.cs | 8 +- .../Domain/Task/TaskServiceRegistration.cs | 8 +- .../Tenant/TenantServiceRegistration.cs | 8 +- .../Domain/User/UserServiceRegistration.cs | 8 +- .../UserLogin/UserLoginServiceRegistration.cs | 8 +- .../GlobalUsings.cs | 3 + .../Logging/LogEntry.cs | 58 -------- .../Logging/MemoryLogger.cs | 35 ----- .../Logging/MemoryLoggerFactoryExtensions.cs | 15 --- .../Logging/MemoryLoggerProvider.cs | 50 ------- ...EntityFrameworkCore.SqlServer.Tests.csproj | 25 ++-- .../GlobalUsings.cs | 2 + .../EntityCreateCommandHandlerTests.cs | 19 ++- .../EntityUpdateCommandHandlerTests.cs | 32 ++++- ...mandQuery.EntityFrameworkCore.Tests.csproj | 14 +- .../Acceptance/AuditTests.cs | 51 ++++--- .../Acceptance/PriorityTests.cs | 11 +- .../Acceptance/TaskTests.cs | 88 ++++++------ .../DatabaseCollection.cs | 2 - .../DatabaseFixture.cs | 112 ++-------------- .../DatabaseInitializer.cs | 58 ++++++++ .../DatabaseTestBase.cs | 21 +-- .../Domain/Audit/AuditServiceRegistration.cs | 9 +- .../Priority/PriorityServiceRegistration.cs | 9 +- .../Domain/Role/RoleServiceRegistration.cs | 9 +- .../Status/StatusServiceRegistration.cs | 10 +- .../Domain/Task/TaskServiceRegistration.cs | 9 +- .../Tenant/TenantServiceRegistration.cs | 10 +- .../Domain/User/UserServiceRegistration.cs | 9 +- .../UserLogin/UserLoginServiceRegistration.cs | 9 +- .../GlobalUsings.cs | 3 + .../Logging/LogEntry.cs | 58 -------- .../Logging/MemoryLogger.cs | 35 ----- .../Logging/MemoryLoggerFactoryExtensions.cs | 15 --- .../Logging/MemoryLoggerProvider.cs | 50 ------- .../MediatR.CommandQuery.MongoDB.Tests.csproj | 23 ++-- .../Commands/EntityCreateCommandTests.cs | 15 ++- .../Commands/EntityUpdateCommandTests.cs | 15 ++- .../Extensions/QueryExtensionsTests.cs | 30 ++++- .../GlobalUsings.cs | 2 + .../MediatR.CommandQuery.Tests.csproj | 12 +- 107 files changed, 824 insertions(+), 1438 deletions(-) create mode 100644 test/MediatR.CommandQuery.Cosmos.Tests/DatabaseInitializer.cs create mode 100644 test/MediatR.CommandQuery.Cosmos.Tests/GlobalUsings.cs delete mode 100644 test/MediatR.CommandQuery.Cosmos.Tests/Logging/LogEntry.cs delete mode 100644 test/MediatR.CommandQuery.Cosmos.Tests/Logging/MemoryLogger.cs delete mode 100644 test/MediatR.CommandQuery.Cosmos.Tests/Logging/MemoryLoggerFactoryExtensions.cs delete mode 100644 test/MediatR.CommandQuery.Cosmos.Tests/Logging/MemoryLoggerProvider.cs create mode 100644 test/MediatR.CommandQuery.EntityFrameworkCore.SqlServer.Tests/DatabaseInitializer.cs create mode 100644 test/MediatR.CommandQuery.EntityFrameworkCore.SqlServer.Tests/GlobalUsings.cs delete mode 100644 test/MediatR.CommandQuery.EntityFrameworkCore.SqlServer.Tests/Logging/LogEntry.cs delete mode 100644 test/MediatR.CommandQuery.EntityFrameworkCore.SqlServer.Tests/Logging/MemoryLogger.cs delete mode 100644 test/MediatR.CommandQuery.EntityFrameworkCore.SqlServer.Tests/Logging/MemoryLoggerFactoryExtensions.cs delete mode 100644 test/MediatR.CommandQuery.EntityFrameworkCore.SqlServer.Tests/Logging/MemoryLoggerProvider.cs create mode 100644 test/MediatR.CommandQuery.EntityFrameworkCore.Tests/GlobalUsings.cs create mode 100644 test/MediatR.CommandQuery.MongoDB.Tests/DatabaseInitializer.cs create mode 100644 test/MediatR.CommandQuery.MongoDB.Tests/GlobalUsings.cs delete mode 100644 test/MediatR.CommandQuery.MongoDB.Tests/Logging/LogEntry.cs delete mode 100644 test/MediatR.CommandQuery.MongoDB.Tests/Logging/MemoryLogger.cs delete mode 100644 test/MediatR.CommandQuery.MongoDB.Tests/Logging/MemoryLoggerFactoryExtensions.cs delete mode 100644 test/MediatR.CommandQuery.MongoDB.Tests/Logging/MemoryLoggerProvider.cs create mode 100644 test/MediatR.CommandQuery.Tests/GlobalUsings.cs diff --git a/.github/workflows/dotnet.yml b/.github/workflows/dotnet.yml index 274fbe0d..bd02de29 100644 --- a/.github/workflows/dotnet.yml +++ b/.github/workflows/dotnet.yml @@ -3,6 +3,7 @@ name: Build env: DOTNET_NOLOGO: true DOTNET_SKIP_FIRST_TIME_EXPERIENCE: true + DOTNET_ENVIRONMENT: github ASPNETCORE_ENVIRONMENT: github BUILD_PATH: '${{github.workspace}}/artifacts' COVERALLS_REPO_TOKEN: ${{ secrets.COVERALLS_REPO_TOKEN }} @@ -45,7 +46,7 @@ jobs: steps: - name: Checkout - uses: actions/checkout@v3 + uses: actions/checkout@v4 with: fetch-depth: 0 @@ -55,6 +56,7 @@ jobs: dotnet-version: | 6.0.x 7.0.x + 8.0.x - name: Restore Dependencies run: dotnet restore @@ -63,25 +65,18 @@ jobs: run: dotnet build --no-restore --configuration Release - name: Run Test - run: dotnet test --configuration Release --collect:"XPlat Code Coverage" --settings coverlet.runsettings --filter Category!=Cosmos - - - name: Generate Coverage - uses: danielpalme/ReportGenerator-GitHub-Action@5.1.23 - with: - reports: '${{github.workspace}}/test/*/TestResults/*/coverage.info' - targetdir: ${{env.BUILD_PATH}} - reporttypes: lcov + run: dotnet test --no-build --configuration Release --collect:"XPlat Code Coverage" --settings coverlet.runsettings --filter Category!=Cosmos - name: Report Coverage if: success() uses: coverallsapp/github-action@v2 with: - file: artifacts/lcov.info + file: '${{github.workspace}}/test/*/TestResults/*/coverage.info' format: lcov - name: Create Packages if: success() && github.event_name != 'pull_request' - run: dotnet pack --configuration Release --include-symbols --include-source --no-build --no-restore --output "${{env.BUILD_PATH}}" + run: dotnet pack --configuration Release --include-symbols --include-source --no-build --output "${{env.BUILD_PATH}}" - name: Upload Packages if: success() && github.event_name != 'pull_request' diff --git a/samples/Tracker.WebService.EntityFrameworkCore/Tracker.WebService.EntityFrameworkCore.csproj b/samples/Tracker.WebService.EntityFrameworkCore/Tracker.WebService.EntityFrameworkCore.csproj index 63476985..b1621167 100644 --- a/samples/Tracker.WebService.EntityFrameworkCore/Tracker.WebService.EntityFrameworkCore.csproj +++ b/samples/Tracker.WebService.EntityFrameworkCore/Tracker.WebService.EntityFrameworkCore.csproj @@ -1,7 +1,7 @@ - net7.0 + net8.0 Tracker.WebService enable @@ -13,9 +13,9 @@ - - - + + + diff --git a/samples/Tracker.WebService.MongoDB/Tracker.WebService.MongoDB.csproj b/samples/Tracker.WebService.MongoDB/Tracker.WebService.MongoDB.csproj index 14483db4..eb798698 100644 --- a/samples/Tracker.WebService.MongoDB/Tracker.WebService.MongoDB.csproj +++ b/samples/Tracker.WebService.MongoDB/Tracker.WebService.MongoDB.csproj @@ -1,7 +1,7 @@ - net7.0 + net8.0 Tracker.WebService enable @@ -13,8 +13,8 @@ - - + + diff --git a/src/Directory.Build.props b/src/Directory.Build.props index f9f74966..d69f3b2b 100644 --- a/src/Directory.Build.props +++ b/src/Directory.Build.props @@ -34,7 +34,7 @@ - + diff --git a/src/MediatR.CommandQuery.Audit/AuditRecord.cs b/src/MediatR.CommandQuery.Audit/AuditRecord.cs index c86b43ef..f74179a8 100644 --- a/src/MediatR.CommandQuery.Audit/AuditRecord.cs +++ b/src/MediatR.CommandQuery.Audit/AuditRecord.cs @@ -1,5 +1,3 @@ -using System; -using System.Collections.Generic; using System.Diagnostics.CodeAnalysis; using EntityChange; @@ -56,7 +54,7 @@ public class AuditRecord /// Gets or sets the username that initiated the activity. /// /// - /// The the username that initiated the activity. + /// The username that initiated the activity. /// public string? ActivityBy { get; set; } diff --git a/src/MediatR.CommandQuery.Audit/AuditServiceExtensions.cs b/src/MediatR.CommandQuery.Audit/AuditServiceExtensions.cs index def46d4a..257044d7 100644 --- a/src/MediatR.CommandQuery.Audit/AuditServiceExtensions.cs +++ b/src/MediatR.CommandQuery.Audit/AuditServiceExtensions.cs @@ -1,5 +1,3 @@ -using System; - using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection.Extensions; diff --git a/src/MediatR.CommandQuery.Audit/ChangeCollector.cs b/src/MediatR.CommandQuery.Audit/ChangeCollector.cs index ea0fbf32..590bc033 100644 --- a/src/MediatR.CommandQuery.Audit/ChangeCollector.cs +++ b/src/MediatR.CommandQuery.Audit/ChangeCollector.cs @@ -1,7 +1,3 @@ -using System; -using System.Collections.Generic; -using System.Linq; - using EntityChange; using EntityChange.Extensions; diff --git a/src/MediatR.CommandQuery.Audit/IChangeCollector.cs b/src/MediatR.CommandQuery.Audit/IChangeCollector.cs index 51233a09..54fb3183 100644 --- a/src/MediatR.CommandQuery.Audit/IChangeCollector.cs +++ b/src/MediatR.CommandQuery.Audit/IChangeCollector.cs @@ -1,6 +1,3 @@ -using System; -using System.Collections.Generic; - using MediatR.CommandQuery.Definitions; namespace MediatR.CommandQuery.Audit; diff --git a/src/MediatR.CommandQuery.Audit/MediatR.CommandQuery.Audit.csproj b/src/MediatR.CommandQuery.Audit/MediatR.CommandQuery.Audit.csproj index c113d70b..c7aabcd6 100644 --- a/src/MediatR.CommandQuery.Audit/MediatR.CommandQuery.Audit.csproj +++ b/src/MediatR.CommandQuery.Audit/MediatR.CommandQuery.Audit.csproj @@ -1,14 +1,14 @@ - net6.0;net7.0 + net6.0;net7.0;net8.0 1591 enable - + diff --git a/src/MediatR.CommandQuery.Cosmos/DomainServiceExtensions.cs b/src/MediatR.CommandQuery.Cosmos/DomainServiceExtensions.cs index fa1d9571..1ac0557b 100644 --- a/src/MediatR.CommandQuery.Cosmos/DomainServiceExtensions.cs +++ b/src/MediatR.CommandQuery.Cosmos/DomainServiceExtensions.cs @@ -1,5 +1,3 @@ -using System.Collections.Generic; - using Cosmos.Abstracts; using FluentValidation; @@ -11,6 +9,7 @@ using MediatR.CommandQuery.Extensions; using MediatR.CommandQuery.Queries; using MediatR.CommandQuery.Services; +using MediatR.Registration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection.Extensions; @@ -25,9 +24,8 @@ public static IServiceCollection AddMediator(this IServiceCollection services) throw new System.ArgumentNullException(nameof(services)); // Register MediatR - services.TryAddScoped(); - services.TryAddScoped(); - services.TryAddScoped(); + var serviceConfig = new MediatRServiceConfiguration(); + ServiceRegistrar.AddRequiredServices(services, serviceConfig); return services; } @@ -60,24 +58,24 @@ public static IServiceCollection AddEntityQueries, TReadModel>, EntityIdentifierQueryHandler>(); - services.TryAddScoped, IReadOnlyCollection>, EntityIdentifiersQueryHandler>(); - services.TryAddScoped, EntityPagedResult>, EntityPagedQueryHandler>(); - services.TryAddScoped, IReadOnlyCollection>, EntitySelectQueryHandler>(); + services.TryAddTransient, TReadModel>, EntityIdentifierQueryHandler>(); + services.TryAddTransient, IReadOnlyCollection>, EntityIdentifiersQueryHandler>(); + services.TryAddTransient, EntityPagedResult>, EntityPagedQueryHandler>(); + services.TryAddTransient, IReadOnlyCollection>, EntitySelectQueryHandler>(); // pipeline registration, run in order registered bool supportsTenant = typeof(TReadModel).Implements>(); if (supportsTenant) { - services.AddScoped, EntityPagedResult>, TenantPagedQueryBehavior>(); - services.AddScoped, IReadOnlyCollection>, TenantSelectQueryBehavior>(); + services.AddTransient, EntityPagedResult>, TenantPagedQueryBehavior>(); + services.AddTransient, IReadOnlyCollection>, TenantSelectQueryBehavior>(); } bool supportsDeleted = typeof(TReadModel).Implements(); if (supportsDeleted) { - services.AddScoped, EntityPagedResult>, DeletedPagedQueryBehavior>(); - services.AddScoped, IReadOnlyCollection>, DeletedSelectQueryBehavior>(); + services.AddTransient, EntityPagedResult>, DeletedPagedQueryBehavior>(); + services.AddTransient, IReadOnlyCollection>, DeletedSelectQueryBehavior>(); } return services; @@ -90,10 +88,10 @@ public static IServiceCollection AddEntityQueryMemoryCache, TReadModel>, MemoryCacheQueryBehavior, TReadModel>>(); - services.AddScoped, IReadOnlyCollection>, MemoryCacheQueryBehavior, IReadOnlyCollection>>(); - services.AddScoped, EntityPagedResult>, MemoryCacheQueryBehavior, EntityPagedResult>>(); - services.AddScoped, IReadOnlyCollection>, MemoryCacheQueryBehavior, IReadOnlyCollection>>(); + services.AddTransient, TReadModel>, MemoryCacheQueryBehavior, TReadModel>>(); + services.AddTransient, IReadOnlyCollection>, MemoryCacheQueryBehavior, IReadOnlyCollection>>(); + services.AddTransient, EntityPagedResult>, MemoryCacheQueryBehavior, EntityPagedResult>>(); + services.AddTransient, IReadOnlyCollection>, MemoryCacheQueryBehavior, IReadOnlyCollection>>(); return services; } @@ -105,10 +103,10 @@ public static IServiceCollection AddEntityQueryDistributedCache, TReadModel>, DistributedCacheQueryBehavior, TReadModel>>(); - services.AddScoped, IReadOnlyCollection>, DistributedCacheQueryBehavior, IReadOnlyCollection>>(); - services.AddScoped, EntityPagedResult>, DistributedCacheQueryBehavior, EntityPagedResult>>(); - services.AddScoped, IReadOnlyCollection>, DistributedCacheQueryBehavior, IReadOnlyCollection>>(); + services.AddTransient, TReadModel>, DistributedCacheQueryBehavior, TReadModel>>(); + services.AddTransient, IReadOnlyCollection>, DistributedCacheQueryBehavior, IReadOnlyCollection>>(); + services.AddTransient, EntityPagedResult>, DistributedCacheQueryBehavior, EntityPagedResult>>(); + services.AddTransient, IReadOnlyCollection>, DistributedCacheQueryBehavior, IReadOnlyCollection>>(); return services; } diff --git a/src/MediatR.CommandQuery.Cosmos/Handlers/EntityIdentifierQueryHandler.cs b/src/MediatR.CommandQuery.Cosmos/Handlers/EntityIdentifierQueryHandler.cs index d63ae7cd..35d3e02d 100644 --- a/src/MediatR.CommandQuery.Cosmos/Handlers/EntityIdentifierQueryHandler.cs +++ b/src/MediatR.CommandQuery.Cosmos/Handlers/EntityIdentifierQueryHandler.cs @@ -1,7 +1,3 @@ -using System; -using System.Threading; -using System.Threading.Tasks; - using AutoMapper; using Cosmos.Abstracts; @@ -9,7 +5,6 @@ using MediatR.CommandQuery.Definitions; using MediatR.CommandQuery.Queries; -using Microsoft.Azure.Cosmos; using Microsoft.Extensions.Logging; namespace MediatR.CommandQuery.Cosmos.Handlers; diff --git a/src/MediatR.CommandQuery.Cosmos/MediatR.CommandQuery.Cosmos.csproj b/src/MediatR.CommandQuery.Cosmos/MediatR.CommandQuery.Cosmos.csproj index ceb8adb3..5e964e71 100644 --- a/src/MediatR.CommandQuery.Cosmos/MediatR.CommandQuery.Cosmos.csproj +++ b/src/MediatR.CommandQuery.Cosmos/MediatR.CommandQuery.Cosmos.csproj @@ -1,14 +1,14 @@ - net6.0;net7.0 + net6.0;net7.0;net8.0 1591 enable - + diff --git a/src/MediatR.CommandQuery.EntityFrameworkCore/DomainServiceExtensions.cs b/src/MediatR.CommandQuery.EntityFrameworkCore/DomainServiceExtensions.cs index 6359d255..28e9a43c 100644 --- a/src/MediatR.CommandQuery.EntityFrameworkCore/DomainServiceExtensions.cs +++ b/src/MediatR.CommandQuery.EntityFrameworkCore/DomainServiceExtensions.cs @@ -1,5 +1,3 @@ -using System.Collections.Generic; - using FluentValidation; using MediatR.CommandQuery.Behaviors; @@ -9,6 +7,7 @@ using MediatR.CommandQuery.Extensions; using MediatR.CommandQuery.Queries; using MediatR.CommandQuery.Services; +using MediatR.Registration; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.DependencyInjection; @@ -24,9 +23,8 @@ public static IServiceCollection AddMediator(this IServiceCollection services) throw new System.ArgumentNullException(nameof(services)); // Register MediatR - services.TryAddScoped(); - services.TryAddScoped(); - services.TryAddScoped(); + var serviceConfig = new MediatRServiceConfiguration(); + ServiceRegistrar.AddRequiredServices(services, serviceConfig); return services; } @@ -59,24 +57,24 @@ public static IServiceCollection AddEntityQueries, TReadModel>, EntityIdentifierQueryHandler>(); - services.TryAddScoped, IReadOnlyCollection>, EntityIdentifiersQueryHandler>(); - services.TryAddScoped, EntityPagedResult>, EntityPagedQueryHandler>(); - services.TryAddScoped, IReadOnlyCollection>, EntitySelectQueryHandler>(); + services.TryAddTransient, TReadModel>, EntityIdentifierQueryHandler>(); + services.TryAddTransient, IReadOnlyCollection>, EntityIdentifiersQueryHandler>(); + services.TryAddTransient, EntityPagedResult>, EntityPagedQueryHandler>(); + services.TryAddTransient, IReadOnlyCollection>, EntitySelectQueryHandler>(); // pipeline registration, run in order registered bool supportsTenant = typeof(TReadModel).Implements>(); if (supportsTenant) { - services.AddScoped, EntityPagedResult>, TenantPagedQueryBehavior>(); - services.AddScoped, IReadOnlyCollection>, TenantSelectQueryBehavior>(); + services.AddTransient, EntityPagedResult>, TenantPagedQueryBehavior>(); + services.AddTransient, IReadOnlyCollection>, TenantSelectQueryBehavior>(); } bool supportsDeleted = typeof(TReadModel).Implements(); if (supportsDeleted) { - services.AddScoped, EntityPagedResult>, DeletedPagedQueryBehavior>(); - services.AddScoped, IReadOnlyCollection>, DeletedSelectQueryBehavior>(); + services.AddTransient, EntityPagedResult>, DeletedPagedQueryBehavior>(); + services.AddTransient, IReadOnlyCollection>, DeletedSelectQueryBehavior>(); } return services; @@ -89,10 +87,10 @@ public static IServiceCollection AddEntityQueryMemoryCache, TReadModel>, MemoryCacheQueryBehavior, TReadModel>>(); - services.AddScoped, IReadOnlyCollection>, MemoryCacheQueryBehavior, IReadOnlyCollection>>(); - services.AddScoped, EntityPagedResult>, MemoryCacheQueryBehavior, EntityPagedResult>>(); - services.AddScoped, IReadOnlyCollection>, MemoryCacheQueryBehavior, IReadOnlyCollection>>(); + services.AddTransient, TReadModel>, MemoryCacheQueryBehavior, TReadModel>>(); + services.AddTransient, IReadOnlyCollection>, MemoryCacheQueryBehavior, IReadOnlyCollection>>(); + services.AddTransient, EntityPagedResult>, MemoryCacheQueryBehavior, EntityPagedResult>>(); + services.AddTransient, IReadOnlyCollection>, MemoryCacheQueryBehavior, IReadOnlyCollection>>(); return services; } @@ -104,10 +102,10 @@ public static IServiceCollection AddEntityQueryDistributedCache, TReadModel>, DistributedCacheQueryBehavior, TReadModel>>(); - services.AddScoped, IReadOnlyCollection>, DistributedCacheQueryBehavior, IReadOnlyCollection>>(); - services.AddScoped, EntityPagedResult>, DistributedCacheQueryBehavior, EntityPagedResult>>(); - services.AddScoped, IReadOnlyCollection>, DistributedCacheQueryBehavior, IReadOnlyCollection>>(); + services.AddTransient, TReadModel>, DistributedCacheQueryBehavior, TReadModel>>(); + services.AddTransient, IReadOnlyCollection>, DistributedCacheQueryBehavior, IReadOnlyCollection>>(); + services.AddTransient, EntityPagedResult>, DistributedCacheQueryBehavior, EntityPagedResult>>(); + services.AddTransient, IReadOnlyCollection>, DistributedCacheQueryBehavior, IReadOnlyCollection>>(); return services; } diff --git a/src/MediatR.CommandQuery.EntityFrameworkCore/MediatR.CommandQuery.EntityFrameworkCore.csproj b/src/MediatR.CommandQuery.EntityFrameworkCore/MediatR.CommandQuery.EntityFrameworkCore.csproj index 641f55c2..6013e73f 100644 --- a/src/MediatR.CommandQuery.EntityFrameworkCore/MediatR.CommandQuery.EntityFrameworkCore.csproj +++ b/src/MediatR.CommandQuery.EntityFrameworkCore/MediatR.CommandQuery.EntityFrameworkCore.csproj @@ -1,14 +1,14 @@ - net6.0;net7.0 + net8.0 1591 enable - + diff --git a/src/MediatR.CommandQuery.Hangfire/HangfireConfigurationExtensions.cs b/src/MediatR.CommandQuery.Hangfire/HangfireConfigurationExtensions.cs index 7b1f3798..0c861302 100644 --- a/src/MediatR.CommandQuery.Hangfire/HangfireConfigurationExtensions.cs +++ b/src/MediatR.CommandQuery.Hangfire/HangfireConfigurationExtensions.cs @@ -1,5 +1,3 @@ -using System; - using Hangfire; using Microsoft.Extensions.DependencyInjection; diff --git a/src/MediatR.CommandQuery.Hangfire/IMediatorDispatcher.cs b/src/MediatR.CommandQuery.Hangfire/IMediatorDispatcher.cs index 3604f569..56bb0c53 100644 --- a/src/MediatR.CommandQuery.Hangfire/IMediatorDispatcher.cs +++ b/src/MediatR.CommandQuery.Hangfire/IMediatorDispatcher.cs @@ -1,6 +1,3 @@ -using System.Threading; -using System.Threading.Tasks; - using Hangfire; namespace MediatR.CommandQuery.Hangfire; diff --git a/src/MediatR.CommandQuery.Hangfire/MediatR.CommandQuery.Hangfire.csproj b/src/MediatR.CommandQuery.Hangfire/MediatR.CommandQuery.Hangfire.csproj index d621d5d6..88562642 100644 --- a/src/MediatR.CommandQuery.Hangfire/MediatR.CommandQuery.Hangfire.csproj +++ b/src/MediatR.CommandQuery.Hangfire/MediatR.CommandQuery.Hangfire.csproj @@ -1,14 +1,14 @@ - net6.0;net7.0 + net6.0;net7.0;net8.0 1591 enable - - + + diff --git a/src/MediatR.CommandQuery.Hangfire/MediatorDispatcher.cs b/src/MediatR.CommandQuery.Hangfire/MediatorDispatcher.cs index 865ae6aa..a5d83daf 100644 --- a/src/MediatR.CommandQuery.Hangfire/MediatorDispatcher.cs +++ b/src/MediatR.CommandQuery.Hangfire/MediatorDispatcher.cs @@ -1,7 +1,4 @@ -using System; using System.Diagnostics; -using System.Threading; -using System.Threading.Tasks; using Hangfire; diff --git a/src/MediatR.CommandQuery.Hangfire/MediatorExtensions.cs b/src/MediatR.CommandQuery.Hangfire/MediatorExtensions.cs index 5e3d86e4..f615cd17 100644 --- a/src/MediatR.CommandQuery.Hangfire/MediatorExtensions.cs +++ b/src/MediatR.CommandQuery.Hangfire/MediatorExtensions.cs @@ -1,7 +1,3 @@ -using System; -using System.Threading; -using System.Threading.Tasks; - using Hangfire; namespace MediatR.CommandQuery.Hangfire; diff --git a/src/MediatR.CommandQuery.MongoDB/DomainServiceExtensions.cs b/src/MediatR.CommandQuery.MongoDB/DomainServiceExtensions.cs index 607395a3..2eca10e1 100644 --- a/src/MediatR.CommandQuery.MongoDB/DomainServiceExtensions.cs +++ b/src/MediatR.CommandQuery.MongoDB/DomainServiceExtensions.cs @@ -1,5 +1,3 @@ -using System.Collections.Generic; - using FluentValidation; using MediatR.CommandQuery.Behaviors; @@ -9,6 +7,7 @@ using MediatR.CommandQuery.MongoDB.Handlers; using MediatR.CommandQuery.Queries; using MediatR.CommandQuery.Services; +using MediatR.Registration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection.Extensions; @@ -25,9 +24,8 @@ public static IServiceCollection AddMediator(this IServiceCollection services) throw new System.ArgumentNullException(nameof(services)); // Register MediatR - services.TryAddScoped(); - services.TryAddScoped(); - services.TryAddScoped(); + var serviceConfig = new MediatRServiceConfiguration(); + ServiceRegistrar.AddRequiredServices(services, serviceConfig); return services; } @@ -60,24 +58,24 @@ public static IServiceCollection AddEntityQueries, TReadModel>, EntityIdentifierQueryHandler>(); - services.TryAddScoped, IReadOnlyCollection>, EntityIdentifiersQueryHandler>(); - services.TryAddScoped, EntityPagedResult>, EntityPagedQueryHandler>(); - services.TryAddScoped, IReadOnlyCollection>, EntitySelectQueryHandler>(); + services.TryAddTransient, TReadModel>, EntityIdentifierQueryHandler>(); + services.TryAddTransient, IReadOnlyCollection>, EntityIdentifiersQueryHandler>(); + services.TryAddTransient, EntityPagedResult>, EntityPagedQueryHandler>(); + services.TryAddTransient, IReadOnlyCollection>, EntitySelectQueryHandler>(); // pipeline registration, run in order registered bool supportsTenant = typeof(TReadModel).Implements>(); if (supportsTenant) { - services.AddScoped, EntityPagedResult>, TenantPagedQueryBehavior>(); - services.AddScoped, IReadOnlyCollection>, TenantSelectQueryBehavior>(); + services.AddTransient, EntityPagedResult>, TenantPagedQueryBehavior>(); + services.AddTransient, IReadOnlyCollection>, TenantSelectQueryBehavior>(); } bool supportsDeleted = typeof(TReadModel).Implements(); if (supportsDeleted) { - services.AddScoped, EntityPagedResult>, DeletedPagedQueryBehavior>(); - services.AddScoped, IReadOnlyCollection>, DeletedSelectQueryBehavior>(); + services.AddTransient, EntityPagedResult>, DeletedPagedQueryBehavior>(); + services.AddTransient, IReadOnlyCollection>, DeletedSelectQueryBehavior>(); } return services; @@ -90,10 +88,10 @@ public static IServiceCollection AddEntityQueryMemoryCache, TReadModel>, MemoryCacheQueryBehavior, TReadModel>>(); - services.AddScoped, IReadOnlyCollection>, MemoryCacheQueryBehavior, IReadOnlyCollection>>(); - services.AddScoped, EntityPagedResult>, MemoryCacheQueryBehavior, EntityPagedResult>>(); - services.AddScoped, IReadOnlyCollection>, MemoryCacheQueryBehavior, IReadOnlyCollection>>(); + services.AddTransient, TReadModel>, MemoryCacheQueryBehavior, TReadModel>>(); + services.AddTransient, IReadOnlyCollection>, MemoryCacheQueryBehavior, IReadOnlyCollection>>(); + services.AddTransient, EntityPagedResult>, MemoryCacheQueryBehavior, EntityPagedResult>>(); + services.AddTransient, IReadOnlyCollection>, MemoryCacheQueryBehavior, IReadOnlyCollection>>(); return services; } @@ -105,10 +103,10 @@ public static IServiceCollection AddEntityQueryDistributedCache, TReadModel>, DistributedCacheQueryBehavior, TReadModel>>(); - services.AddScoped, IReadOnlyCollection>, DistributedCacheQueryBehavior, IReadOnlyCollection>>(); - services.AddScoped, EntityPagedResult>, DistributedCacheQueryBehavior, EntityPagedResult>>(); - services.AddScoped, IReadOnlyCollection>, DistributedCacheQueryBehavior, IReadOnlyCollection>>(); + services.AddTransient, TReadModel>, DistributedCacheQueryBehavior, TReadModel>>(); + services.AddTransient, IReadOnlyCollection>, DistributedCacheQueryBehavior, IReadOnlyCollection>>(); + services.AddTransient, EntityPagedResult>, DistributedCacheQueryBehavior, EntityPagedResult>>(); + services.AddTransient, IReadOnlyCollection>, DistributedCacheQueryBehavior, IReadOnlyCollection>>(); return services; } diff --git a/src/MediatR.CommandQuery.MongoDB/MediatR.CommandQuery.MongoDB.csproj b/src/MediatR.CommandQuery.MongoDB/MediatR.CommandQuery.MongoDB.csproj index 74d1cd2b..e4378429 100644 --- a/src/MediatR.CommandQuery.MongoDB/MediatR.CommandQuery.MongoDB.csproj +++ b/src/MediatR.CommandQuery.MongoDB/MediatR.CommandQuery.MongoDB.csproj @@ -1,14 +1,14 @@ - net6.0;net7.0 + net6.0;net7.0;net8.0 1591 enable - + diff --git a/src/MediatR.CommandQuery.Mvc/EntityCommandControllerBase.cs b/src/MediatR.CommandQuery.Mvc/EntityCommandControllerBase.cs index 1f636a61..4a4d759a 100644 --- a/src/MediatR.CommandQuery.Mvc/EntityCommandControllerBase.cs +++ b/src/MediatR.CommandQuery.Mvc/EntityCommandControllerBase.cs @@ -1,6 +1,4 @@ using System.Net.Mime; -using System.Threading; -using System.Threading.Tasks; using MediatR.CommandQuery.Commands; diff --git a/src/MediatR.CommandQuery.Mvc/EntityQueryControllerBase.cs b/src/MediatR.CommandQuery.Mvc/EntityQueryControllerBase.cs index f7aed6ee..1e1f191f 100644 --- a/src/MediatR.CommandQuery.Mvc/EntityQueryControllerBase.cs +++ b/src/MediatR.CommandQuery.Mvc/EntityQueryControllerBase.cs @@ -1,8 +1,4 @@ -using System.Collections.Generic; -using System.Linq; using System.Net.Mime; -using System.Threading; -using System.Threading.Tasks; using MediatR.CommandQuery.Queries; diff --git a/src/MediatR.CommandQuery.Mvc/JsonExceptionMiddleware.cs b/src/MediatR.CommandQuery.Mvc/JsonExceptionMiddleware.cs index 3ed28606..f1482c2a 100644 --- a/src/MediatR.CommandQuery.Mvc/JsonExceptionMiddleware.cs +++ b/src/MediatR.CommandQuery.Mvc/JsonExceptionMiddleware.cs @@ -1,8 +1,5 @@ -using System; using System.Diagnostics; -using System.Linq; using System.Text.Json; -using System.Threading.Tasks; using FluentValidation; diff --git a/src/MediatR.CommandQuery.Mvc/MediatR.CommandQuery.Mvc.csproj b/src/MediatR.CommandQuery.Mvc/MediatR.CommandQuery.Mvc.csproj index e192303b..708bb108 100644 --- a/src/MediatR.CommandQuery.Mvc/MediatR.CommandQuery.Mvc.csproj +++ b/src/MediatR.CommandQuery.Mvc/MediatR.CommandQuery.Mvc.csproj @@ -1,7 +1,7 @@ - net6.0;net7.0 + net6.0;net7.0;net8.0 Library 1591 enable diff --git a/src/MediatR.CommandQuery/Behaviors/MemoryCacheQueryBehavior.cs b/src/MediatR.CommandQuery/Behaviors/MemoryCacheQueryBehavior.cs index 64d7f732..2ecf8b52 100644 --- a/src/MediatR.CommandQuery/Behaviors/MemoryCacheQueryBehavior.cs +++ b/src/MediatR.CommandQuery/Behaviors/MemoryCacheQueryBehavior.cs @@ -1,7 +1,3 @@ -using System; -using System.Threading; -using System.Threading.Tasks; - using MediatR.CommandQuery.Definitions; using Microsoft.Extensions.Caching.Memory; @@ -37,10 +33,10 @@ protected override async Task Process( var cacheKey = cacheRequest.GetCacheKey(); - if (_memoryCache.TryGetValue(cacheKey, out TResponse cachedResult)) + if (_memoryCache.TryGetValue(cacheKey, out TResponse? cachedResult)) { LogCacheAction(Logger, "Hit", cacheKey); - return cachedResult; + return cachedResult!; } LogCacheAction(Logger, "Miss", cacheKey); diff --git a/src/MediatR.CommandQuery/MediatR.CommandQuery.csproj b/src/MediatR.CommandQuery/MediatR.CommandQuery.csproj index 0c0995af..7d3bb175 100644 --- a/src/MediatR.CommandQuery/MediatR.CommandQuery.csproj +++ b/src/MediatR.CommandQuery/MediatR.CommandQuery.csproj @@ -1,19 +1,19 @@ - net6.0;net7.0 + net6.0;net7.0;net8.0 1591 enable - - - - - - - + + + + + + + diff --git a/templates/DomainServiceRegistration.csx b/templates/DomainServiceRegistration.csx index 582883ed..f4203ac8 100644 --- a/templates/DomainServiceRegistration.csx +++ b/templates/DomainServiceRegistration.csx @@ -31,7 +31,6 @@ public string WriteCode() CodeBuilder.AppendLine("using System;"); CodeBuilder.AppendLine("using System.Collections.Generic;"); - CodeBuilder.AppendLine("using KickStart.DependencyInjection;"); CodeBuilder.AppendLine("using MediatR.CommandQuery.EntityFrameworkCore;"); CodeBuilder.AppendLine("using Microsoft.Extensions.DependencyInjection;"); @@ -40,15 +39,12 @@ public string WriteCode() CodeBuilder.AppendLine(); CodeBuilder.AppendLine("// ReSharper disable once CheckNamespace"); - CodeBuilder.AppendLine($"namespace {TemplateOptions.Namespace}"); - CodeBuilder.AppendLine("{"); + CodeBuilder.AppendLine($"namespace {TemplateOptions.Namespace};"); + CodeBuilder.AppendLine(); - using (CodeBuilder.Indent()) - { - GenerateClass(readModel, createModel, updateModel); - } + GenerateClass(readModel, createModel, updateModel); - CodeBuilder.AppendLine("}"); + CodeBuilder.AppendLine(); return CodeBuilder.ToString(); } @@ -57,7 +53,7 @@ private void GenerateClass(string readModel, string createModel, string updateMo { string className = System.IO.Path.GetFileNameWithoutExtension(TemplateOptions.FileName); - CodeBuilder.AppendLine($"public class {className} : IDependencyInjectionRegistration"); + CodeBuilder.AppendLine($"public class {className}"); CodeBuilder.AppendLine("{"); using (CodeBuilder.Indent()) @@ -79,7 +75,8 @@ private void GenerateRegister(string readModel, string createModel, string updat var keyType = TemplateOptions.Parameters["keyType"]; - CodeBuilder.AppendLine($"public void Register(IServiceCollection services, IDictionary data)"); + CodeBuilder.AppendLine($"[RegisterServices]"); + CodeBuilder.AppendLine($"public void Register(IServiceCollection services)"); CodeBuilder.AppendLine("{"); using (CodeBuilder.Indent()) diff --git a/templates/EntityController.csx b/templates/EntityController.csx index 7fdd4d4e..7bd51228 100644 --- a/templates/EntityController.csx +++ b/templates/EntityController.csx @@ -38,15 +38,12 @@ public string WriteCode() CodeBuilder.AppendLine(); - CodeBuilder.AppendLine($"namespace {TemplateOptions.Namespace}"); - CodeBuilder.AppendLine("{"); - - using (CodeBuilder.Indent()) - { - GenerateClass(readModel, createModel, updateModel); - } + CodeBuilder.AppendLine($"namespace {TemplateOptions.Namespace};"); + CodeBuilder.AppendLine(); - CodeBuilder.AppendLine("}"); + GenerateClass(readModel, createModel, updateModel); + + CodeBuilder.AppendLine(); return CodeBuilder.ToString(); } diff --git a/test/MediatR.CommandQuery.Cosmos.Tests/Acceptance/AuditTests.cs b/test/MediatR.CommandQuery.Cosmos.Tests/Acceptance/AuditTests.cs index 5e146b84..8ed5e023 100644 --- a/test/MediatR.CommandQuery.Cosmos.Tests/Acceptance/AuditTests.cs +++ b/test/MediatR.CommandQuery.Cosmos.Tests/Acceptance/AuditTests.cs @@ -3,11 +3,9 @@ using AutoMapper; -using Cosmos.Abstracts; - -using DataGenerator; +using Bogus; -using FluentAssertions; +using Cosmos.Abstracts; using MediatR.CommandQuery.Commands; using MediatR.CommandQuery.Cosmos.Tests.Data.Entities; @@ -18,16 +16,17 @@ using Microsoft.AspNetCore.JsonPatch.Operations; using Microsoft.Extensions.DependencyInjection; -using Xunit; using Xunit.Abstractions; using Task = System.Threading.Tasks.Task; namespace MediatR.CommandQuery.Cosmos.Tests.Acceptance; +[Collection(DatabaseCollection.CollectionName)] public class AuditTests : DatabaseTestBase { - public AuditTests(ITestOutputHelper output, DatabaseFixture databaseFixture) : base(output, databaseFixture) + public AuditTests(ITestOutputHelper output, DatabaseFixture databaseFixture) + : base(output, databaseFixture) { } @@ -42,18 +41,26 @@ public async Task FullTest() mapper.Should().NotBeNull(); // Create Entity - var createModel = Generator.Default.Single(); - createModel.Username = "TEST"; - createModel.Content = "Test " + DateTime.Now.Ticks; + var generator = new Faker() + .RuleFor(p => p.Id, (faker, model) => ObjectId.GenerateNewId().ToString()) + .RuleFor(p => p.Username, (faker, model) => faker.Internet.UserName()) + .RuleFor(p => p.Content, (faker, model) => faker.Lorem.Paragraph()) + .RuleFor(p => p.Created, (faker, model) => faker.Date.PastOffset()) + .RuleFor(p => p.CreatedBy, (faker, model) => faker.Internet.Email()) + .RuleFor(p => p.Updated, (faker, model) => faker.Date.SoonOffset()) + .RuleFor(p => p.UpdatedBy, (faker, model) => faker.Internet.Email()) + .RuleFor(p => p.Date, (faker, model) => faker.Date.Soon()); + + var createModel = generator.Generate(); var createCommand = new EntityCreateCommand(MockPrincipal.Default, createModel); - var createResult = await mediator.Send(createCommand).ConfigureAwait(false); + var createResult = await mediator.Send(createCommand); createResult.Should().NotBeNull(); // Get Entity by Key var key = CosmosKey.Encode(createResult.Id, createResult.Id); var identifierQuery = new EntityIdentifierQuery(MockPrincipal.Default, key); - var identifierResult = await mediator.Send(identifierQuery).ConfigureAwait(false); + var identifierResult = await mediator.Send(identifierQuery); identifierResult.Should().NotBeNull(); identifierResult.Username.Should().Be(createModel.Username); @@ -65,7 +72,7 @@ public async Task FullTest() }; var listQuery = new EntityPagedQuery(MockPrincipal.Default, entityQuery); - var listResult = await mediator.Send(listQuery).ConfigureAwait(false); + var listResult = await mediator.Send(listQuery); listResult.Should().NotBeNull(); // Patch Entity @@ -79,7 +86,7 @@ public async Task FullTest() var patchCommand = new EntityPatchCommand(MockPrincipal.Default, key, patchModel); - var patchResult = await mediator.Send(patchCommand).ConfigureAwait(false); + var patchResult = await mediator.Send(patchCommand); patchResult.Should().NotBeNull(); patchResult.Content.Should().Be("Patch Update"); @@ -88,13 +95,13 @@ public async Task FullTest() updateModel.Content = "Update Command"; var updateCommand = new EntityUpdateCommand(MockPrincipal.Default, key, updateModel); - var updateResult = await mediator.Send(updateCommand).ConfigureAwait(false); + var updateResult = await mediator.Send(updateCommand); updateResult.Should().NotBeNull(); updateResult.Content.Should().Be("Update Command"); // Delete Entity var deleteCommand = new EntityDeleteCommand(MockPrincipal.Default, key); - var deleteResult = await mediator.Send(deleteCommand).ConfigureAwait(false); + var deleteResult = await mediator.Send(deleteCommand); deleteResult.Should().NotBeNull(); deleteResult.Id.Should().Be(createResult.Id); } @@ -113,18 +120,25 @@ public async Task Upsert() var mapper = ServiceProvider.GetService(); mapper.Should().NotBeNull(); + var handler = ServiceProvider.GetService, AuditReadModel>>(); + // Update Entity - var updateModel = Generator.Default.Single(); - updateModel.Username = "TEST"; - updateModel.Content = "Insert " + DateTime.Now.Ticks; + var generator = new Faker() + .RuleFor(p => p.Username, (faker, model) => faker.Internet.UserName()) + .RuleFor(p => p.Content, (faker, model) => faker.Lorem.Paragraph()) + .RuleFor(p => p.Updated, (faker, model) => faker.Date.SoonOffset()) + .RuleFor(p => p.UpdatedBy, (faker, model) => faker.Internet.Email()) + .RuleFor(p => p.Date, (faker, model) => faker.Date.Soon()); + + var updateModel = generator.Generate(); var upsertCommandNew = new EntityUpsertCommand(MockPrincipal.Default, key, updateModel); - var upsertResultNew = await mediator.Send(upsertCommandNew).ConfigureAwait(false); + var upsertResultNew = await mediator.Send(upsertCommandNew); upsertResultNew.Should().NotBeNull(); // Get Entity by Key var identifierQuery = new EntityIdentifierQuery(MockPrincipal.Default, key); - var identifierResult = await mediator.Send(identifierQuery).ConfigureAwait(false); + var identifierResult = await mediator.Send(identifierQuery); identifierResult.Should().NotBeNull(); identifierResult.Username.Should().Be(updateModel.Username); @@ -133,7 +147,7 @@ public async Task Upsert() // Upsert again, should be update var upsertCommandUpdate = new EntityUpsertCommand(MockPrincipal.Default, key, updateModel); - var upsertResultUpdate = await mediator.Send(upsertCommandUpdate).ConfigureAwait(false); + var upsertResultUpdate = await mediator.Send(upsertCommandUpdate); upsertResultUpdate.Should().NotBeNull(); upsertResultUpdate.Content.Should().NotBe(upsertResultNew.Content); } diff --git a/test/MediatR.CommandQuery.Cosmos.Tests/Acceptance/PriorityTests.cs b/test/MediatR.CommandQuery.Cosmos.Tests/Acceptance/PriorityTests.cs index 43f0e552..02a2c80f 100644 --- a/test/MediatR.CommandQuery.Cosmos.Tests/Acceptance/PriorityTests.cs +++ b/test/MediatR.CommandQuery.Cosmos.Tests/Acceptance/PriorityTests.cs @@ -16,6 +16,7 @@ namespace MediatR.CommandQuery.Cosmos.Tests.Acceptance; +[Collection(DatabaseCollection.CollectionName)] public class PriorityTests : DatabaseTestBase { public PriorityTests(ITestOutputHelper output, DatabaseFixture databaseFixture) @@ -34,7 +35,7 @@ public async Task EntityIdentifierQuery() mapper.Should().NotBeNull(); var identifierQuery = new EntityIdentifierQuery(MockPrincipal.Default, PriorityConstants.Normal.ToCosmosKey()); - var identifierResult = await mediator.Send(identifierQuery).ConfigureAwait(false); + var identifierResult = await mediator.Send(identifierQuery); identifierResult.Should().NotBeNull(); identifierResult.Id.Should().Be(PriorityConstants.Normal.Id); } @@ -56,7 +57,7 @@ public async Task EntityIdentifiersQuery() }; var identifierQuery = new EntityIdentifiersQuery(MockPrincipal.Default, identifiers); - var identifierResults = await mediator.Send(identifierQuery).ConfigureAwait(false); + var identifierResults = await mediator.Send(identifierQuery); identifierResults.Should().NotBeNull(); identifierResults.Count.Should().Be(2); @@ -86,7 +87,7 @@ public async Task EntityQueryIn() }; var listQuery = new EntityPagedQuery(MockPrincipal.Default, entityQuery); - var listResult = await mediator.Send(listQuery).ConfigureAwait(false); + var listResult = await mediator.Send(listQuery); listResult.Should().NotBeNull(); listResult.Total.Should().Be(2); } diff --git a/test/MediatR.CommandQuery.Cosmos.Tests/Acceptance/TaskTests.cs b/test/MediatR.CommandQuery.Cosmos.Tests/Acceptance/TaskTests.cs index c42c729f..bb30a26d 100644 --- a/test/MediatR.CommandQuery.Cosmos.Tests/Acceptance/TaskTests.cs +++ b/test/MediatR.CommandQuery.Cosmos.Tests/Acceptance/TaskTests.cs @@ -3,9 +3,9 @@ using AutoMapper; -using Cosmos.Abstracts; +using Bogus; -using DataGenerator; +using Cosmos.Abstracts; using FluentAssertions; @@ -25,6 +25,7 @@ namespace MediatR.CommandQuery.Cosmos.Tests.Acceptance; +[Collection(DatabaseCollection.CollectionName)] public class TaskTests : DatabaseTestBase { public TaskTests(ITestOutputHelper output, DatabaseFixture databaseFixture) @@ -43,20 +44,23 @@ public async Task FullTest() mapper.Should().NotBeNull(); // Create Entity - var createModel = Generator.Default.Single(); - createModel.Title = "Testing"; - createModel.Description = "Test " + DateTime.Now.Ticks; - createModel.StatusId = StatusConstants.NotStarted.Id; - createModel.TenantId = TenantConstants.Test.Id; + var generator = new Faker() + .RuleFor(t => t.TenantId, f => TenantConstants.Test.Id) + .RuleFor(t => t.StatusId, f => StatusConstants.NotStarted.Id) + .RuleFor(t => t.PriorityId, f => PriorityConstants.Normal.Id) + .RuleFor(t => t.Title, f => f.Lorem.Word()) + .RuleFor(t => t.Description, f => f.Lorem.Sentence()); + + var createModel = generator.Generate(); var createCommand = new EntityCreateCommand(MockPrincipal.Default, createModel); - var createResult = await mediator.Send(createCommand).ConfigureAwait(false); + var createResult = await mediator.Send(createCommand); createResult.Should().NotBeNull(); // Get Entity by Key var cosmosKey = CosmosKey.Encode(createResult.Id, createResult.TenantId); var identifierQuery = new EntityIdentifierQuery(MockPrincipal.Default, cosmosKey); - var identifierResult = await mediator.Send(identifierQuery).ConfigureAwait(false); + var identifierResult = await mediator.Send(identifierQuery); identifierResult.Should().NotBeNull(); identifierResult.Title.Should().Be(createModel.Title); @@ -68,7 +72,7 @@ public async Task FullTest() }; var listQuery = new EntityPagedQuery(MockPrincipal.Default, entityQuery); - var listResult = await mediator.Send(listQuery).ConfigureAwait(false); + var listResult = await mediator.Send(listQuery); listResult.Should().NotBeNull(); // Patch Entity @@ -81,7 +85,7 @@ public async Task FullTest() }); var patchCommand = new EntityPatchCommand(MockPrincipal.Default, cosmosKey, patchModel); - var patchResult = await mediator.Send(patchCommand).ConfigureAwait(false); + var patchResult = await mediator.Send(patchCommand); patchResult.Should().NotBeNull(); patchResult.Title.Should().Be("Patch Update"); @@ -90,13 +94,13 @@ public async Task FullTest() updateModel.Title = "Update Command"; var updateCommand = new EntityUpdateCommand(MockPrincipal.Default, cosmosKey, updateModel); - var updateResult = await mediator.Send(updateCommand).ConfigureAwait(false); + var updateResult = await mediator.Send(updateCommand); updateResult.Should().NotBeNull(); updateResult.Title.Should().Be("Update Command"); // Delete Entity var deleteCommand = new EntityDeleteCommand(MockPrincipal.Default, cosmosKey); - var deleteResult = await mediator.Send(deleteCommand).ConfigureAwait(false); + var deleteResult = await mediator.Send(deleteCommand); deleteResult.Should().NotBeNull(); deleteResult.Id.Should().Be(createResult.Id); } @@ -114,19 +118,22 @@ public async Task Upsert() mapper.Should().NotBeNull(); // Update Entity - var updateModel = Generator.Default.Single(); - updateModel.Title = "Upsert Test"; - updateModel.Description = "Insert " + DateTime.Now.Ticks; - updateModel.StatusId = StatusConstants.NotStarted.Id; - updateModel.TenantId = TenantConstants.Test.Id; + var generator = new Faker() + .RuleFor(t => t.TenantId, f => TenantConstants.Test.Id) + .RuleFor(t => t.StatusId, f => StatusConstants.NotStarted.Id) + .RuleFor(t => t.PriorityId, f => PriorityConstants.Normal.Id) + .RuleFor(t => t.Title, f => f.Lorem.Word()) + .RuleFor(t => t.Description, f => f.Lorem.Sentence()); + + var updateModel = generator.Generate(); var upsertCommandNew = new EntityUpsertCommand(MockPrincipal.Default, cosmosKey, updateModel); - var upsertResultNew = await mediator.Send(upsertCommandNew).ConfigureAwait(false); + var upsertResultNew = await mediator.Send(upsertCommandNew); upsertResultNew.Should().NotBeNull(); // Get Entity by Key var identifierQuery = new EntityIdentifierQuery(MockPrincipal.Default, cosmosKey); - var identifierResult = await mediator.Send(identifierQuery).ConfigureAwait(false); + var identifierResult = await mediator.Send(identifierQuery); identifierResult.Should().NotBeNull(); identifierResult.Title.Should().Be(updateModel.Title); @@ -135,7 +142,7 @@ public async Task Upsert() // Upsert again, should be update var upsertCommandUpdate = new EntityUpsertCommand(MockPrincipal.Default, cosmosKey, updateModel); - var upsertResultUpdate = await mediator.Send(upsertCommandUpdate).ConfigureAwait(false); + var upsertResultUpdate = await mediator.Send(upsertCommandUpdate); upsertResultUpdate.Should().NotBeNull(); upsertResultUpdate.Description.Should().NotBe(upsertResultNew.Description); } @@ -151,11 +158,14 @@ public async Task TenantDoesNotMatch() mapper.Should().NotBeNull(); // Create Entity - var createModel = Generator.Default.Single(); - createModel.Title = "Testing"; - createModel.Description = "Test " + DateTime.Now.Ticks; - createModel.StatusId = StatusConstants.NotStarted.Id; - createModel.TenantId = Guid.NewGuid().ToString(); + var generator = new Faker() + .RuleFor(t => t.TenantId, f => Guid.NewGuid().ToString()) + .RuleFor(t => t.StatusId, f => StatusConstants.NotStarted.Id) + .RuleFor(t => t.PriorityId, f => PriorityConstants.Normal.Id) + .RuleFor(t => t.Title, f => f.Lorem.Word()) + .RuleFor(t => t.Description, f => f.Lorem.Sentence()); + + var createModel = generator.Generate(); var createCommand = new EntityCreateCommand(MockPrincipal.Default, createModel); await Assert.ThrowsAsync(() => mediator.Send(createCommand)); @@ -172,14 +182,16 @@ public async Task TenantSetDefault() mapper.Should().NotBeNull(); // Create Entity - var createModel = Generator.Default.Single(); - createModel.Title = "Testing"; - createModel.Description = "Test " + DateTime.Now.Ticks; - createModel.StatusId = StatusConstants.NotStarted.Id; - createModel.TenantId = null; + var generator = new Faker() + .RuleFor(t => t.StatusId, f => StatusConstants.NotStarted.Id) + .RuleFor(t => t.PriorityId, f => PriorityConstants.Normal.Id) + .RuleFor(t => t.Title, f => f.Lorem.Word()) + .RuleFor(t => t.Description, f => f.Lorem.Sentence()); + + var createModel = generator.Generate(); var createCommand = new EntityCreateCommand(MockPrincipal.Default, createModel); - var createResult = await mediator.Send(createCommand).ConfigureAwait(false); + var createResult = await mediator.Send(createCommand); createResult.Should().NotBeNull(); createResult.TenantId.Should().Be(TenantConstants.Test.Id); @@ -199,7 +211,7 @@ public async Task EntityPageQuery() var entityQuery = new EntityQuery { Filter = filter }; var pagedQuery = new EntityPagedQuery(MockPrincipal.Default, entityQuery); - var selectResult = await mediator.Send(pagedQuery).ConfigureAwait(false); + var selectResult = await mediator.Send(pagedQuery); selectResult.Should().NotBeNull(); } @@ -217,7 +229,7 @@ public async Task EntitySelectQuery() var select = new EntitySelect(filter); var selectQuery = new EntitySelectQuery(MockPrincipal.Default, select); - var selectResult = await mediator.Send(selectQuery).ConfigureAwait(false); + var selectResult = await mediator.Send(selectQuery); selectResult.Should().NotBeNull(); } @@ -235,7 +247,7 @@ public async Task EntitySelectQueryDelete() var select = new EntitySelect(filter); var selectQuery = new EntitySelectQuery(MockPrincipal.Default, select); - var selectResult = await mediator.Send(selectQuery).ConfigureAwait(false); + var selectResult = await mediator.Send(selectQuery); selectResult.Should().NotBeNull(); } @@ -262,7 +274,7 @@ public async Task EntitySelectQueryDeleteNested() var select = new EntitySelect(filter); var selectQuery = new EntitySelectQuery(MockPrincipal.Default, select); - var selectResult = await mediator.Send(selectQuery).ConfigureAwait(false); + var selectResult = await mediator.Send(selectQuery); selectResult.Should().NotBeNull(); } } diff --git a/test/MediatR.CommandQuery.Cosmos.Tests/CosmosKeyTests.cs b/test/MediatR.CommandQuery.Cosmos.Tests/CosmosKeyTests.cs index f2ed464e..8f6df27d 100644 --- a/test/MediatR.CommandQuery.Cosmos.Tests/CosmosKeyTests.cs +++ b/test/MediatR.CommandQuery.Cosmos.Tests/CosmosKeyTests.cs @@ -1,11 +1,7 @@ using System.Collections.Generic; -using FluentAssertions; - using Microsoft.Azure.Cosmos; -using Xunit; - namespace MediatR.CommandQuery.Cosmos.Tests; public class CosmosKeyTests diff --git a/test/MediatR.CommandQuery.Cosmos.Tests/Data/Repositories/AuditRepository.cs b/test/MediatR.CommandQuery.Cosmos.Tests/Data/Repositories/AuditRepository.cs index 7494b73f..a4baeee0 100644 --- a/test/MediatR.CommandQuery.Cosmos.Tests/Data/Repositories/AuditRepository.cs +++ b/test/MediatR.CommandQuery.Cosmos.Tests/Data/Repositories/AuditRepository.cs @@ -1,9 +1,3 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - using Cosmos.Abstracts; using MediatR.CommandQuery.Cosmos.Tests.Data.Entities; diff --git a/test/MediatR.CommandQuery.Cosmos.Tests/DatabaseCollection.cs b/test/MediatR.CommandQuery.Cosmos.Tests/DatabaseCollection.cs index 32803775..92a0510a 100644 --- a/test/MediatR.CommandQuery.Cosmos.Tests/DatabaseCollection.cs +++ b/test/MediatR.CommandQuery.Cosmos.Tests/DatabaseCollection.cs @@ -1,5 +1,3 @@ -using Xunit; - namespace MediatR.CommandQuery.Cosmos.Tests; [CollectionDefinition(DatabaseCollection.CollectionName)] diff --git a/test/MediatR.CommandQuery.Cosmos.Tests/DatabaseFixture.cs b/test/MediatR.CommandQuery.Cosmos.Tests/DatabaseFixture.cs index ac3eaf15..df3c6334 100644 --- a/test/MediatR.CommandQuery.Cosmos.Tests/DatabaseFixture.cs +++ b/test/MediatR.CommandQuery.Cosmos.Tests/DatabaseFixture.cs @@ -1,49 +1,18 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Reflection; - -using Cosmos.Abstracts; - -using KickStart; - -using MediatR.CommandQuery.Cosmos.Tests.Data.Entities; -using MediatR.CommandQuery.Cosmos.Tests.Logging; using MediatR.CommandQuery.Definitions; -using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection.Extensions; -using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Hosting; -using Xunit.Abstractions; +using XUnit.Hosting; namespace MediatR.CommandQuery.Cosmos.Tests; -public class DatabaseFixture : IDisposable +public class DatabaseFixture : TestHostFixture { - private readonly ILogger _logger; - - public DatabaseFixture() + protected override void ConfigureServices(HostBuilderContext context, IServiceCollection services) { - var enviromentName = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT") ?? "Test"; - var builder = new Microsoft.Extensions.Configuration.ConfigurationBuilder() - .AddJsonFile("appsettings.json") - .AddJsonFile($"appsettings.{enviromentName}.json", true); - - Configuration = builder.Build(); - ConnectionString = Configuration.GetConnectionString(ConnectionName); ; - - var services = new ServiceCollection(); - services.AddSingleton(p => Configuration); - services.AddLogging(f => - { - f.SetMinimumLevel(LogLevel.Trace); - f.AddMemory(); - f.AddFilter("Microsoft", LogLevel.Information); - f.AddFilter("System", LogLevel.Warning); - }); - services.AddOptions(); + services.AddHostedService(); services.TryAddTransient, MockTenantResolver>(); @@ -52,75 +21,6 @@ public DatabaseFixture() services.AddMediator(); services.AddValidatorsFromAssembly(); - services.KickStart(config => config - .IncludeAssemblyFor() - .IncludeAssemblyFor() - .Data("configuration", Configuration) - .Data("hostProcess", "test") - .UseStartupTask() - ); - - ServiceProvider = services.BuildServiceProvider(); - - var factory = ServiceProvider.GetService(); - _logger = factory.CreateLogger(); - - CreateDatabase(); - } - - - public string ConnectionString { get; set; } - - public string ConnectionName { get; set; } = "Tracker"; - - public IConfigurationRoot Configuration { get; } - - public IServiceProvider ServiceProvider { get; } - - - private void CreateDatabase() - { - var priorityRepository = ServiceProvider.GetRequiredService>(); - var statusRepository = ServiceProvider.GetRequiredService>(); - var tenantRepository = ServiceProvider.GetRequiredService>(); - var userRepository = ServiceProvider.GetRequiredService>(); - - System.Threading.Tasks.Task.WaitAll( - priorityRepository.SaveAsync(Constants.PriorityConstants.High), - priorityRepository.SaveAsync(Constants.PriorityConstants.Normal), - priorityRepository.SaveAsync(Constants.PriorityConstants.Low), - - statusRepository.SaveAsync(Constants.StatusConstants.NotStarted), - statusRepository.SaveAsync(Constants.StatusConstants.InProgress), - statusRepository.SaveAsync(Constants.StatusConstants.Completed), - statusRepository.SaveAsync(Constants.StatusConstants.Blocked), - statusRepository.SaveAsync(Constants.StatusConstants.Deferred), - statusRepository.SaveAsync(Constants.StatusConstants.Done), - - tenantRepository.SaveAsync(Constants.TenantConstants.Test), - - userRepository.SaveAsync(Constants.UserConstants.WilliamAdama), - userRepository.SaveAsync(Constants.UserConstants.LauraRoslin), - userRepository.SaveAsync(Constants.UserConstants.KaraThrace), - userRepository.SaveAsync(Constants.UserConstants.LeeAdama), - userRepository.SaveAsync(Constants.UserConstants.GaiusBaltar), - userRepository.SaveAsync(Constants.UserConstants.SaulTigh) - ); - } - - - public void Report(ITestOutputHelper output) - { - var logs = MemoryLoggerProvider.Current.LogEntries.ToList(); - - foreach (var log in logs) - output.WriteLine(log.ToString()); - - // reset logger - MemoryLoggerProvider.Current.Clear(); - } - - public void Dispose() - { + services.AddMediatRCommandQueryCosmosTests(); } } diff --git a/test/MediatR.CommandQuery.Cosmos.Tests/DatabaseInitializer.cs b/test/MediatR.CommandQuery.Cosmos.Tests/DatabaseInitializer.cs new file mode 100644 index 00000000..a3514680 --- /dev/null +++ b/test/MediatR.CommandQuery.Cosmos.Tests/DatabaseInitializer.cs @@ -0,0 +1,60 @@ +using System; +using System.Threading; + +using Cosmos.Abstracts; + +using MediatR.CommandQuery.Cosmos.Tests.Data.Entities; + +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; +using Microsoft.Extensions.Logging; + +using Task = System.Threading.Tasks.Task; + +namespace MediatR.CommandQuery.Cosmos.Tests; + +public class DatabaseInitializer : IHostedService +{ + private readonly ILogger _logger; + private readonly IServiceProvider _serviceProvider; + + public DatabaseInitializer(ILogger logger, IServiceProvider serviceProvider) + { + _logger = logger; + _serviceProvider = serviceProvider; + } + + + public async Task StartAsync(CancellationToken cancellationToken) + { + var priorityRepository = _serviceProvider.GetRequiredService>(); + var statusRepository = _serviceProvider.GetRequiredService>(); + var tenantRepository = _serviceProvider.GetRequiredService>(); + var userRepository = _serviceProvider.GetRequiredService>(); + + await priorityRepository.SaveAsync(Constants.PriorityConstants.High, cancellationToken); + await priorityRepository.SaveAsync(Constants.PriorityConstants.Normal, cancellationToken); + await priorityRepository.SaveAsync(Constants.PriorityConstants.Low, cancellationToken); + + await statusRepository.SaveAsync(Constants.StatusConstants.NotStarted, cancellationToken); + await statusRepository.SaveAsync(Constants.StatusConstants.InProgress, cancellationToken); + await statusRepository.SaveAsync(Constants.StatusConstants.Completed, cancellationToken); + await statusRepository.SaveAsync(Constants.StatusConstants.Blocked, cancellationToken); + await statusRepository.SaveAsync(Constants.StatusConstants.Deferred, cancellationToken); + await statusRepository.SaveAsync(Constants.StatusConstants.Done, cancellationToken); + + await tenantRepository.SaveAsync(Constants.TenantConstants.Test, cancellationToken); + + await userRepository.SaveAsync(Constants.UserConstants.WilliamAdama, cancellationToken); + await userRepository.SaveAsync(Constants.UserConstants.LauraRoslin, cancellationToken); + await userRepository.SaveAsync(Constants.UserConstants.KaraThrace, cancellationToken); + await userRepository.SaveAsync(Constants.UserConstants.LeeAdama, cancellationToken); + await userRepository.SaveAsync(Constants.UserConstants.GaiusBaltar, cancellationToken); + await userRepository.SaveAsync(Constants.UserConstants.SaulTigh, cancellationToken); + } + + public Task StopAsync(CancellationToken cancellationToken) + { + return Task.CompletedTask; + } +} diff --git a/test/MediatR.CommandQuery.Cosmos.Tests/DatabaseTestBase.cs b/test/MediatR.CommandQuery.Cosmos.Tests/DatabaseTestBase.cs index 76bcb6e7..926e9c90 100644 --- a/test/MediatR.CommandQuery.Cosmos.Tests/DatabaseTestBase.cs +++ b/test/MediatR.CommandQuery.Cosmos.Tests/DatabaseTestBase.cs @@ -1,30 +1,19 @@ using System; -using Xunit; using Xunit.Abstractions; +using XUnit.Hosting; + namespace MediatR.CommandQuery.Cosmos.Tests; [Collection(DatabaseCollection.CollectionName)] -public abstract class DatabaseTestBase : IDisposable +public abstract class DatabaseTestBase : TestHostBase { protected DatabaseTestBase(ITestOutputHelper output, DatabaseFixture databaseFixture) + : base(output, databaseFixture) { - Output = output; - Fixture = databaseFixture; - Fixture?.Report(Output); } + public IServiceProvider ServiceProvider => Fixture.Services; - public ITestOutputHelper Output { get; } - - public DatabaseFixture Fixture { get; } - - public IServiceProvider ServiceProvider => Fixture?.ServiceProvider; - - - public void Dispose() - { - Fixture?.Report(Output); - } } diff --git a/test/MediatR.CommandQuery.Cosmos.Tests/Domain/Audit/AuditServiceRegistration.cs b/test/MediatR.CommandQuery.Cosmos.Tests/Domain/Audit/AuditServiceRegistration.cs index 4f56cccf..eae64121 100644 --- a/test/MediatR.CommandQuery.Cosmos.Tests/Domain/Audit/AuditServiceRegistration.cs +++ b/test/MediatR.CommandQuery.Cosmos.Tests/Domain/Audit/AuditServiceRegistration.cs @@ -1,9 +1,5 @@ -using System.Collections.Generic; - using Cosmos.Abstracts; -using KickStart.DependencyInjection; - using MediatR.CommandQuery.Cosmos.Tests.Data.Entities; using MediatR.CommandQuery.Cosmos.Tests.Domain.Models; @@ -12,9 +8,11 @@ // ReSharper disable once CheckNamespace namespace MediatR.CommandQuery.Cosmos.Tests.Domain; -public class AuditServiceRegistration : IDependencyInjectionRegistration +public class AuditServiceRegistration { - public void Register(IServiceCollection services, IDictionary data) + + [RegisterServices] + public void Register(IServiceCollection services) { services.AddEntityQueries, Audit, AuditReadModel>(); services.AddEntityCommands, Audit, AuditReadModel, AuditCreateModel, AuditUpdateModel>(); diff --git a/test/MediatR.CommandQuery.Cosmos.Tests/Domain/Priority/PriorityServiceRegistration.cs b/test/MediatR.CommandQuery.Cosmos.Tests/Domain/Priority/PriorityServiceRegistration.cs index 5391741a..e74045d5 100644 --- a/test/MediatR.CommandQuery.Cosmos.Tests/Domain/Priority/PriorityServiceRegistration.cs +++ b/test/MediatR.CommandQuery.Cosmos.Tests/Domain/Priority/PriorityServiceRegistration.cs @@ -2,7 +2,7 @@ using Cosmos.Abstracts; -using KickStart.DependencyInjection; +using Injectio.Attributes; using MediatR.CommandQuery.Cosmos.Tests.Domain.Models; @@ -11,9 +11,10 @@ // ReSharper disable once CheckNamespace namespace MediatR.CommandQuery.Cosmos.Tests.Domain; -public class PriorityServiceRegistration : IDependencyInjectionRegistration +public class PriorityServiceRegistration { - public void Register(IServiceCollection services, IDictionary data) + [RegisterServices] + public void Register(IServiceCollection services) { services.AddEntityQueries, Data.Entities.Priority, PriorityReadModel>(); services.AddEntityCommands, Data.Entities.Priority, PriorityReadModel, PriorityCreateModel, PriorityUpdateModel>(); diff --git a/test/MediatR.CommandQuery.Cosmos.Tests/Domain/Role/RoleServiceRegistration.cs b/test/MediatR.CommandQuery.Cosmos.Tests/Domain/Role/RoleServiceRegistration.cs index b5db7e61..fcfe8d6c 100644 --- a/test/MediatR.CommandQuery.Cosmos.Tests/Domain/Role/RoleServiceRegistration.cs +++ b/test/MediatR.CommandQuery.Cosmos.Tests/Domain/Role/RoleServiceRegistration.cs @@ -1,9 +1,6 @@ -using System; -using System.Collections.Generic; - using Cosmos.Abstracts; -using KickStart.DependencyInjection; +using Injectio.Attributes; using MediatR.CommandQuery.Cosmos.Tests.Domain.Models; @@ -12,9 +9,10 @@ // ReSharper disable once CheckNamespace namespace MediatR.CommandQuery.Cosmos.Tests.Domain; -public class RoleServiceRegistration : IDependencyInjectionRegistration +public class RoleServiceRegistration { - public void Register(IServiceCollection services, IDictionary data) + [RegisterServices] + public void Register(IServiceCollection services) { services.AddEntityQueries, Data.Entities.Role, RoleReadModel>(); services.AddEntityCommands, Data.Entities.Role, RoleReadModel, RoleCreateModel, RoleUpdateModel>(); diff --git a/test/MediatR.CommandQuery.Cosmos.Tests/Domain/Status/StatusServiceRegistration.cs b/test/MediatR.CommandQuery.Cosmos.Tests/Domain/Status/StatusServiceRegistration.cs index d56ad665..060589bf 100644 --- a/test/MediatR.CommandQuery.Cosmos.Tests/Domain/Status/StatusServiceRegistration.cs +++ b/test/MediatR.CommandQuery.Cosmos.Tests/Domain/Status/StatusServiceRegistration.cs @@ -1,9 +1,6 @@ -using System; -using System.Collections.Generic; - using Cosmos.Abstracts; -using KickStart.DependencyInjection; +using Injectio.Attributes; using MediatR.CommandQuery.Cosmos.Tests.Domain.Models; @@ -12,9 +9,10 @@ // ReSharper disable once CheckNamespace namespace MediatR.CommandQuery.Cosmos.Tests.Domain; -public class StatusServiceRegistration : IDependencyInjectionRegistration +public class StatusServiceRegistration { - public void Register(IServiceCollection services, IDictionary data) + [RegisterServices] + public void Register(IServiceCollection services) { services.AddEntityQueries, Data.Entities.Status, StatusReadModel>(); services.AddEntityCommands, Data.Entities.Status, StatusReadModel, StatusCreateModel, StatusUpdateModel>(); diff --git a/test/MediatR.CommandQuery.Cosmos.Tests/Domain/Task/TaskServiceRegistration.cs b/test/MediatR.CommandQuery.Cosmos.Tests/Domain/Task/TaskServiceRegistration.cs index a6299774..42bd0460 100644 --- a/test/MediatR.CommandQuery.Cosmos.Tests/Domain/Task/TaskServiceRegistration.cs +++ b/test/MediatR.CommandQuery.Cosmos.Tests/Domain/Task/TaskServiceRegistration.cs @@ -1,8 +1,6 @@ -using System.Collections.Generic; - using Cosmos.Abstracts; -using KickStart.DependencyInjection; +using Injectio.Attributes; using MediatR.CommandQuery.Cosmos.Tests.Domain.Handlers; using MediatR.CommandQuery.Cosmos.Tests.Domain.Models; @@ -13,9 +11,10 @@ // ReSharper disable once CheckNamespace namespace MediatR.CommandQuery.Cosmos.Tests.Domain; -public class TaskServiceRegistration : IDependencyInjectionRegistration +public class TaskServiceRegistration { - public void Register(IServiceCollection services, IDictionary data) + [RegisterServices] + public void Register(IServiceCollection services) { services.AddEntityQueries, Data.Entities.Task, TaskReadModel>(); services.AddEntityCommands, Data.Entities.Task, TaskReadModel, TaskCreateModel, TaskUpdateModel>(); diff --git a/test/MediatR.CommandQuery.Cosmos.Tests/Domain/Tenant/TenantServiceRegistration.cs b/test/MediatR.CommandQuery.Cosmos.Tests/Domain/Tenant/TenantServiceRegistration.cs index e480f70a..198d9a84 100644 --- a/test/MediatR.CommandQuery.Cosmos.Tests/Domain/Tenant/TenantServiceRegistration.cs +++ b/test/MediatR.CommandQuery.Cosmos.Tests/Domain/Tenant/TenantServiceRegistration.cs @@ -1,9 +1,6 @@ -using System; -using System.Collections.Generic; - using Cosmos.Abstracts; -using KickStart.DependencyInjection; +using Injectio.Attributes; using MediatR.CommandQuery.Cosmos.Tests.Domain.Models; @@ -12,9 +9,10 @@ // ReSharper disable once CheckNamespace namespace MediatR.CommandQuery.Cosmos.Tests.Domain; -public class TenantServiceRegistration : IDependencyInjectionRegistration +public class TenantServiceRegistration { - public void Register(IServiceCollection services, IDictionary data) + [RegisterServices] + public void Register(IServiceCollection services) { services.AddEntityQueries, Data.Entities.Tenant, TenantReadModel>(); services.AddEntityCommands, Data.Entities.Tenant, TenantReadModel, TenantCreateModel, TenantUpdateModel>(); diff --git a/test/MediatR.CommandQuery.Cosmos.Tests/Domain/User/UserServiceRegistration.cs b/test/MediatR.CommandQuery.Cosmos.Tests/Domain/User/UserServiceRegistration.cs index 96ed26b8..acf497c3 100644 --- a/test/MediatR.CommandQuery.Cosmos.Tests/Domain/User/UserServiceRegistration.cs +++ b/test/MediatR.CommandQuery.Cosmos.Tests/Domain/User/UserServiceRegistration.cs @@ -1,8 +1,6 @@ -using System.Collections.Generic; - using Cosmos.Abstracts; -using KickStart.DependencyInjection; +using Injectio.Attributes; using MediatR.CommandQuery.Cosmos.Tests.Domain.Models; @@ -11,9 +9,10 @@ // ReSharper disable once CheckNamespace namespace MediatR.CommandQuery.Cosmos.Tests.Domain; -public class UserServiceRegistration : IDependencyInjectionRegistration +public class UserServiceRegistration { - public void Register(IServiceCollection services, IDictionary data) + [RegisterServices] + public void Register(IServiceCollection services) { services.AddEntityQueries, Data.Entities.User, UserReadModel>(); services.AddEntityCommands, Data.Entities.User, UserReadModel, UserCreateModel, UserUpdateModel>(); diff --git a/test/MediatR.CommandQuery.Cosmos.Tests/Domain/UserLogin/UserLoginServiceRegistration.cs b/test/MediatR.CommandQuery.Cosmos.Tests/Domain/UserLogin/UserLoginServiceRegistration.cs index 5058ae9d..e0cf0aeb 100644 --- a/test/MediatR.CommandQuery.Cosmos.Tests/Domain/UserLogin/UserLoginServiceRegistration.cs +++ b/test/MediatR.CommandQuery.Cosmos.Tests/Domain/UserLogin/UserLoginServiceRegistration.cs @@ -1,8 +1,6 @@ -using System.Collections.Generic; - using Cosmos.Abstracts; -using KickStart.DependencyInjection; +using Injectio.Attributes; using MediatR.CommandQuery.Cosmos.Tests.Domain.Models; @@ -11,9 +9,10 @@ // ReSharper disable once CheckNamespace namespace MediatR.CommandQuery.Cosmos.Tests.Domain; -public class UserLoginServiceRegistration : IDependencyInjectionRegistration +public class UserLoginServiceRegistration { - public void Register(IServiceCollection services, IDictionary data) + [RegisterServices] + public void Register(IServiceCollection services) { services.AddEntityQueries, Data.Entities.UserLogin, UserLoginReadModel>(); } diff --git a/test/MediatR.CommandQuery.Cosmos.Tests/GlobalUsings.cs b/test/MediatR.CommandQuery.Cosmos.Tests/GlobalUsings.cs new file mode 100644 index 00000000..ea463bf8 --- /dev/null +++ b/test/MediatR.CommandQuery.Cosmos.Tests/GlobalUsings.cs @@ -0,0 +1,3 @@ +global using FluentAssertions; +global using Injectio.Attributes; +global using Xunit; diff --git a/test/MediatR.CommandQuery.Cosmos.Tests/Logging/LogEntry.cs b/test/MediatR.CommandQuery.Cosmos.Tests/Logging/LogEntry.cs deleted file mode 100644 index 4c9865bd..00000000 --- a/test/MediatR.CommandQuery.Cosmos.Tests/Logging/LogEntry.cs +++ /dev/null @@ -1,58 +0,0 @@ -using System; -using System.Text; - -using Microsoft.Extensions.Logging; - -namespace MediatR.CommandQuery.Cosmos.Tests.Logging; - -public class LogEntry -{ - public LogEntry( - string category, - LogLevel logLevel, - EventId eventId, - object state, - Exception exception, - string message) - { - Timestamp = DateTimeOffset.Now; - LogLevel = logLevel; - EventId = eventId; - State = state; - Exception = exception; - Message = message; - Category = category; - } - - public DateTimeOffset Timestamp { get; } - - public string Category { get; } - - public EventId EventId { get; } - - public Exception Exception { get; } - - public LogLevel LogLevel { get; } - - public string Message { get; } - - public object State { get; } - - public override string ToString() - { - var builder = new StringBuilder(); - builder - .Append(Timestamp.ToString("HH:mm:ss.fff")) - .Append(" [") - .Append(LogLevel.ToString()) - .Append("] ") - .Append(Category) - .Append(": ") - .Append(Message); - - if (Exception != null) - builder.AppendLine().AppendLine(Exception.ToString()); - - return builder.ToString(); - } -} diff --git a/test/MediatR.CommandQuery.Cosmos.Tests/Logging/MemoryLogger.cs b/test/MediatR.CommandQuery.Cosmos.Tests/Logging/MemoryLogger.cs deleted file mode 100644 index da98b39f..00000000 --- a/test/MediatR.CommandQuery.Cosmos.Tests/Logging/MemoryLogger.cs +++ /dev/null @@ -1,35 +0,0 @@ -using System; - -using Microsoft.Extensions.Logging; - -namespace MediatR.CommandQuery.Cosmos.Tests.Logging; - -public class MemoryLogger : ILogger -{ - private readonly MemoryLoggerProvider _provider; - private readonly string _categoryName; - - public MemoryLogger(MemoryLoggerProvider provider, string categoryName) - { - _provider = provider; - _categoryName = categoryName; - } - - public IDisposable BeginScope(TState state) - { - return _provider.ScopeProvider?.Push(state); - } - - public bool IsEnabled(LogLevel logLevel) - { - return true; - } - - public void Log(LogLevel logLevel, EventId eventId, TState state, Exception exception, Func formatter) - { - var message = formatter(state, exception); - var logEvent = new LogEntry(_categoryName, logLevel, eventId, state, exception, message); - - _provider.WriteLog(logEvent); - } -} diff --git a/test/MediatR.CommandQuery.Cosmos.Tests/Logging/MemoryLoggerFactoryExtensions.cs b/test/MediatR.CommandQuery.Cosmos.Tests/Logging/MemoryLoggerFactoryExtensions.cs deleted file mode 100644 index 589d98e4..00000000 --- a/test/MediatR.CommandQuery.Cosmos.Tests/Logging/MemoryLoggerFactoryExtensions.cs +++ /dev/null @@ -1,15 +0,0 @@ -using System; - -using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.Logging; - -namespace MediatR.CommandQuery.Cosmos.Tests.Logging; - -public static class MemoryLoggerFactoryExtensions -{ - public static ILoggingBuilder AddMemory(this ILoggingBuilder builder) - { - builder.Services.AddSingleton(s => MemoryLoggerProvider.Current); - return builder; - } -} diff --git a/test/MediatR.CommandQuery.Cosmos.Tests/Logging/MemoryLoggerProvider.cs b/test/MediatR.CommandQuery.Cosmos.Tests/Logging/MemoryLoggerProvider.cs deleted file mode 100644 index 5b60f7ef..00000000 --- a/test/MediatR.CommandQuery.Cosmos.Tests/Logging/MemoryLoggerProvider.cs +++ /dev/null @@ -1,50 +0,0 @@ -using System; -using System.Collections.Concurrent; -using System.Collections.Generic; -using System.Linq; - -using Microsoft.Extensions.Logging; - -namespace MediatR.CommandQuery.Cosmos.Tests.Logging; - -[ProviderAlias("Memory")] -public class MemoryLoggerProvider : ILoggerProvider, ISupportExternalScope -{ - private readonly ConcurrentQueue _logEntries = new ConcurrentQueue(); - - - public IExternalScopeProvider ScopeProvider { get; private set; } - - public IReadOnlyList LogEntries => _logEntries.ToList(); - - - public ILogger CreateLogger(string categoryName) - { - return new MemoryLogger(this, categoryName); - } - - public void WriteLog(LogEntry logEntry) - { - _logEntries.Enqueue(logEntry); - } - - public void Clear() - { - _logEntries.Clear(); - } - - public void Dispose() - { - _logEntries.Clear(); - } - - void ISupportExternalScope.SetScopeProvider(IExternalScopeProvider scopeProvider) - { - ScopeProvider = scopeProvider; - } - - - private static readonly Lazy _current = new Lazy(); - - public static MemoryLoggerProvider Current => _current.Value; -} diff --git a/test/MediatR.CommandQuery.Cosmos.Tests/MediatR.CommandQuery.Cosmos.Tests.csproj b/test/MediatR.CommandQuery.Cosmos.Tests/MediatR.CommandQuery.Cosmos.Tests.csproj index 4cfc3c8e..96b088c6 100644 --- a/test/MediatR.CommandQuery.Cosmos.Tests/MediatR.CommandQuery.Cosmos.Tests.csproj +++ b/test/MediatR.CommandQuery.Cosmos.Tests/MediatR.CommandQuery.Cosmos.Tests.csproj @@ -1,25 +1,30 @@ - net7.0 + net6.0;net7.0;net8.0 false + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + all runtime; build; native; contentfiles; analyzers; buildtransitive - - - - - - - - - + + + + + + + + + runtime; build; native; contentfiles; analyzers; buildtransitive all diff --git a/test/MediatR.CommandQuery.Cosmos.Tests/MockPrincipal.cs b/test/MediatR.CommandQuery.Cosmos.Tests/MockPrincipal.cs index 3a060c7a..a1278818 100644 --- a/test/MediatR.CommandQuery.Cosmos.Tests/MockPrincipal.cs +++ b/test/MediatR.CommandQuery.Cosmos.Tests/MockPrincipal.cs @@ -1,4 +1,3 @@ -using System; using System.Security.Claims; using System.Security.Principal; diff --git a/test/MediatR.CommandQuery.Cosmos.Tests/MockTenantResolver.cs b/test/MediatR.CommandQuery.Cosmos.Tests/MockTenantResolver.cs index 0999aadb..3a45b9fa 100644 --- a/test/MediatR.CommandQuery.Cosmos.Tests/MockTenantResolver.cs +++ b/test/MediatR.CommandQuery.Cosmos.Tests/MockTenantResolver.cs @@ -1,4 +1,3 @@ -using System; using System.Security.Principal; using System.Threading.Tasks; diff --git a/test/MediatR.CommandQuery.EntityFrameworkCore.SqlServer.Tests/Acceptance/AuditTests.cs b/test/MediatR.CommandQuery.EntityFrameworkCore.SqlServer.Tests/Acceptance/AuditTests.cs index e940d468..11d4cbe3 100644 --- a/test/MediatR.CommandQuery.EntityFrameworkCore.SqlServer.Tests/Acceptance/AuditTests.cs +++ b/test/MediatR.CommandQuery.EntityFrameworkCore.SqlServer.Tests/Acceptance/AuditTests.cs @@ -3,9 +3,7 @@ using AutoMapper; -using DataGenerator; - -using FluentAssertions; +using Bogus; using MediatR.CommandQuery.Commands; using MediatR.CommandQuery.EntityFrameworkCore.SqlServer.Tests.Data.Entities; @@ -16,13 +14,13 @@ using Microsoft.AspNetCore.JsonPatch.Operations; using Microsoft.Extensions.DependencyInjection; -using Xunit; using Xunit.Abstractions; using Task = System.Threading.Tasks.Task; namespace MediatR.CommandQuery.EntityFrameworkCore.SqlServer.Tests.Acceptance; +[Collection(DatabaseCollection.CollectionName)] public class AuditTests : DatabaseTestBase { public AuditTests(ITestOutputHelper output, DatabaseFixture databaseFixture) : base(output, databaseFixture) @@ -40,17 +38,25 @@ public async Task FullTest() mapper.Should().NotBeNull(); // Create Entity - var createModel = Generator.Default.Single(); + var generator = new Faker() + .RuleFor(p => p.Id, (faker, model) => Guid.NewGuid()) + .RuleFor(p => p.Created, (faker, model) => faker.Date.PastOffset()) + .RuleFor(p => p.CreatedBy, (faker, model) => faker.Internet.Email()) + .RuleFor(p => p.Updated, (faker, model) => faker.Date.SoonOffset()) + .RuleFor(p => p.UpdatedBy, (faker, model) => faker.Internet.Email()) + .RuleFor(p => p.Date, (faker, model) => faker.Date.Soon()); + + var createModel = generator.Generate(); createModel.Username = "TEST"; createModel.Content = "Test " + DateTime.Now.Ticks; var createCommand = new EntityCreateCommand(MockPrincipal.Default, createModel); - var createResult = await mediator.Send(createCommand).ConfigureAwait(false); + var createResult = await mediator.Send(createCommand); createResult.Should().NotBeNull(); // Get Entity by Key var identifierQuery = new EntityIdentifierQuery(MockPrincipal.Default, createResult.Id); - var identifierResult = await mediator.Send(identifierQuery).ConfigureAwait(false); + var identifierResult = await mediator.Send(identifierQuery); identifierResult.Should().NotBeNull(); identifierResult.Username.Should().Be(createModel.Username); @@ -62,7 +68,7 @@ public async Task FullTest() }; var listQuery = new EntityPagedQuery(MockPrincipal.Default, entityQuery); - var listResult = await mediator.Send(listQuery).ConfigureAwait(false); + var listResult = await mediator.Send(listQuery); listResult.Should().NotBeNull(); // Patch Entity @@ -75,7 +81,7 @@ public async Task FullTest() }); var patchCommand = new EntityPatchCommand(MockPrincipal.Default, createResult.Id, patchModel); - var patchResult = await mediator.Send(patchCommand).ConfigureAwait(false); + var patchResult = await mediator.Send(patchCommand); patchResult.Should().NotBeNull(); patchResult.Content.Should().Be("Patch Update"); @@ -84,13 +90,13 @@ public async Task FullTest() updateModel.Content = "Update Command"; var updateCommand = new EntityUpdateCommand(MockPrincipal.Default, createResult.Id, updateModel); - var updateResult = await mediator.Send(updateCommand).ConfigureAwait(false); + var updateResult = await mediator.Send(updateCommand); updateResult.Should().NotBeNull(); updateResult.Content.Should().Be("Update Command"); // Delete Entity var deleteCommand = new EntityDeleteCommand(MockPrincipal.Default, createResult.Id); - var deleteResult = await mediator.Send(deleteCommand).ConfigureAwait(false); + var deleteResult = await mediator.Send(deleteCommand); deleteResult.Should().NotBeNull(); deleteResult.Id.Should().Be(createResult.Id); } @@ -108,17 +114,22 @@ public async Task Upsert() mapper.Should().NotBeNull(); // Update Entity - var updateModel = Generator.Default.Single(); + var generator = new Faker() + .RuleFor(p => p.Updated, (faker, model) => faker.Date.SoonOffset()) + .RuleFor(p => p.UpdatedBy, (faker, model) => faker.Internet.Email()) + .RuleFor(p => p.Date, (faker, model) => faker.Date.Soon()); + + var updateModel = generator.Generate(); updateModel.Username = "TEST"; updateModel.Content = "Insert " + DateTime.Now.Ticks; var upsertCommandNew = new EntityUpsertCommand(MockPrincipal.Default, key, updateModel); - var upsertResultNew = await mediator.Send(upsertCommandNew).ConfigureAwait(false); + var upsertResultNew = await mediator.Send(upsertCommandNew); upsertResultNew.Should().NotBeNull(); // Get Entity by Key var identifierQuery = new EntityIdentifierQuery(MockPrincipal.Default, key); - var identifierResult = await mediator.Send(identifierQuery).ConfigureAwait(false); + var identifierResult = await mediator.Send(identifierQuery); identifierResult.Should().NotBeNull(); identifierResult.Username.Should().Be(updateModel.Username); @@ -127,7 +138,7 @@ public async Task Upsert() // Upsert again, should be update var upsertCommandUpdate = new EntityUpsertCommand(MockPrincipal.Default, key, updateModel); - var upsertResultUpdate = await mediator.Send(upsertCommandUpdate).ConfigureAwait(false); + var upsertResultUpdate = await mediator.Send(upsertCommandUpdate); upsertResultUpdate.Should().NotBeNull(); upsertResultUpdate.Content.Should().NotBe(upsertResultNew.Content); } diff --git a/test/MediatR.CommandQuery.EntityFrameworkCore.SqlServer.Tests/Acceptance/PriorityTests.cs b/test/MediatR.CommandQuery.EntityFrameworkCore.SqlServer.Tests/Acceptance/PriorityTests.cs index aec679a0..dacabe2d 100644 --- a/test/MediatR.CommandQuery.EntityFrameworkCore.SqlServer.Tests/Acceptance/PriorityTests.cs +++ b/test/MediatR.CommandQuery.EntityFrameworkCore.SqlServer.Tests/Acceptance/PriorityTests.cs @@ -4,19 +4,17 @@ using AutoMapper; -using FluentAssertions; - using MediatR.CommandQuery.EntityFrameworkCore.SqlServer.Tests.Constants; using MediatR.CommandQuery.EntityFrameworkCore.SqlServer.Tests.Domain.Priority.Models; using MediatR.CommandQuery.Queries; using Microsoft.Extensions.DependencyInjection; -using Xunit; using Xunit.Abstractions; namespace MediatR.CommandQuery.EntityFrameworkCore.SqlServer.Tests.Acceptance; +[Collection(DatabaseCollection.CollectionName)] public class PriorityTests : DatabaseTestBase { public PriorityTests(ITestOutputHelper output, DatabaseFixture databaseFixture) @@ -35,7 +33,7 @@ public async Task EntityIdentifierQuery() mapper.Should().NotBeNull(); var identifierQuery = new EntityIdentifierQuery(MockPrincipal.Default, PriorityConstants.Normal); - var identifierResult = await mediator.Send(identifierQuery).ConfigureAwait(false); + var identifierResult = await mediator.Send(identifierQuery); identifierResult.Should().NotBeNull(); identifierResult.Id.Should().Be(PriorityConstants.Normal); } @@ -57,7 +55,7 @@ public async Task EntityIdentifiersQuery() }; var identifierQuery = new EntityIdentifiersQuery(MockPrincipal.Default, identifiers); - var identifierResults = await mediator.Send(identifierQuery).ConfigureAwait(false); + var identifierResults = await mediator.Send(identifierQuery); identifierResults.Should().NotBeNull(); identifierResults.Count.Should().Be(2); @@ -87,7 +85,7 @@ public async Task EntityQueryIn() }; var listQuery = new EntityPagedQuery(MockPrincipal.Default, entityQuery); - var listResult = await mediator.Send(listQuery).ConfigureAwait(false); + var listResult = await mediator.Send(listQuery); listResult.Should().NotBeNull(); listResult.Total.Should().Be(2); } diff --git a/test/MediatR.CommandQuery.EntityFrameworkCore.SqlServer.Tests/Acceptance/TaskTests.cs b/test/MediatR.CommandQuery.EntityFrameworkCore.SqlServer.Tests/Acceptance/TaskTests.cs index 5f2b83ed..f8d53f43 100644 --- a/test/MediatR.CommandQuery.EntityFrameworkCore.SqlServer.Tests/Acceptance/TaskTests.cs +++ b/test/MediatR.CommandQuery.EntityFrameworkCore.SqlServer.Tests/Acceptance/TaskTests.cs @@ -3,9 +3,7 @@ using AutoMapper; -using DataGenerator; - -using FluentAssertions; +using Bogus; using MediatR.CommandQuery.Commands; using MediatR.CommandQuery.EntityFrameworkCore.SqlServer.Tests.Constants; @@ -16,13 +14,13 @@ using Microsoft.AspNetCore.JsonPatch.Operations; using Microsoft.Extensions.DependencyInjection; -using Xunit; using Xunit.Abstractions; using Task = System.Threading.Tasks.Task; namespace MediatR.CommandQuery.EntityFrameworkCore.SqlServer.Tests.Acceptance; +[Collection(DatabaseCollection.CollectionName)] public class TaskTests : DatabaseTestBase { public TaskTests(ITestOutputHelper output, DatabaseFixture databaseFixture) @@ -41,19 +39,22 @@ public async Task FullTest() mapper.Should().NotBeNull(); // Create Entity - var createModel = Generator.Default.Single(); - createModel.Title = "Testing"; - createModel.Description = "Test " + DateTime.Now.Ticks; - createModel.StatusId = StatusConstants.NotStarted; - createModel.TenantId = TenantConstants.Test; + var generator = new Faker() + .RuleFor(t => t.TenantId, f => TenantConstants.Test) + .RuleFor(t => t.StatusId, f => StatusConstants.NotStarted) + .RuleFor(t => t.PriorityId, f => PriorityConstants.Normal) + .RuleFor(t => t.Title, f => f.Lorem.Word()) + .RuleFor(t => t.Description, f => f.Lorem.Sentence()); + + var createModel = generator.Generate(); var createCommand = new EntityCreateCommand(MockPrincipal.Default, createModel); - var createResult = await mediator.Send(createCommand).ConfigureAwait(false); + var createResult = await mediator.Send(createCommand); createResult.Should().NotBeNull(); // Get Entity by Key var identifierQuery = new EntityIdentifierQuery(MockPrincipal.Default, createResult.Id); - var identifierResult = await mediator.Send(identifierQuery).ConfigureAwait(false); + var identifierResult = await mediator.Send(identifierQuery); identifierResult.Should().NotBeNull(); identifierResult.Title.Should().Be(createModel.Title); @@ -65,7 +66,7 @@ public async Task FullTest() }; var listQuery = new EntityPagedQuery(MockPrincipal.Default, entityQuery); - var listResult = await mediator.Send(listQuery).ConfigureAwait(false); + var listResult = await mediator.Send(listQuery); listResult.Should().NotBeNull(); // Patch Entity @@ -78,7 +79,7 @@ public async Task FullTest() }); var patchCommand = new EntityPatchCommand(MockPrincipal.Default, createResult.Id, patchModel); - var patchResult = await mediator.Send(patchCommand).ConfigureAwait(false); + var patchResult = await mediator.Send(patchCommand); patchResult.Should().NotBeNull(); patchResult.Title.Should().Be("Patch Update"); @@ -87,13 +88,13 @@ public async Task FullTest() updateModel.Title = "Update Command"; var updateCommand = new EntityUpdateCommand(MockPrincipal.Default, createResult.Id, updateModel); - var updateResult = await mediator.Send(updateCommand).ConfigureAwait(false); + var updateResult = await mediator.Send(updateCommand); updateResult.Should().NotBeNull(); updateResult.Title.Should().Be("Update Command"); // Delete Entity var deleteCommand = new EntityDeleteCommand(MockPrincipal.Default, createResult.Id); - var deleteResult = await mediator.Send(deleteCommand).ConfigureAwait(false); + var deleteResult = await mediator.Send(deleteCommand); deleteResult.Should().NotBeNull(); deleteResult.Id.Should().Be(createResult.Id); } @@ -110,19 +111,22 @@ public async Task Upsert() mapper.Should().NotBeNull(); // Update Entity - var updateModel = Generator.Default.Single(); - updateModel.Title = "Upsert Test"; - updateModel.Description = "Insert " + DateTime.Now.Ticks; - updateModel.StatusId = StatusConstants.NotStarted; - updateModel.TenantId = TenantConstants.Test; + var generator = new Faker() + .RuleFor(t => t.TenantId, f => TenantConstants.Test) + .RuleFor(t => t.StatusId, f => StatusConstants.NotStarted) + .RuleFor(t => t.PriorityId, f => PriorityConstants.Normal) + .RuleFor(t => t.Title, f => f.Lorem.Word()) + .RuleFor(t => t.Description, f => f.Lorem.Sentence()); + + var updateModel = generator.Generate(); var upsertCommandNew = new EntityUpsertCommand(MockPrincipal.Default, key, updateModel); - var upsertResultNew = await mediator.Send(upsertCommandNew).ConfigureAwait(false); + var upsertResultNew = await mediator.Send(upsertCommandNew); upsertResultNew.Should().NotBeNull(); // Get Entity by Key var identifierQuery = new EntityIdentifierQuery(MockPrincipal.Default, key); - var identifierResult = await mediator.Send(identifierQuery).ConfigureAwait(false); + var identifierResult = await mediator.Send(identifierQuery); identifierResult.Should().NotBeNull(); identifierResult.Title.Should().Be(updateModel.Title); @@ -131,7 +135,7 @@ public async Task Upsert() // Upsert again, should be update var upsertCommandUpdate = new EntityUpsertCommand(MockPrincipal.Default, key, updateModel); - var upsertResultUpdate = await mediator.Send(upsertCommandUpdate).ConfigureAwait(false); + var upsertResultUpdate = await mediator.Send(upsertCommandUpdate); upsertResultUpdate.Should().NotBeNull(); upsertResultUpdate.Description.Should().NotBe(upsertResultNew.Description); } @@ -147,11 +151,14 @@ public async Task TenantDoesNotMatch() mapper.Should().NotBeNull(); // Create Entity - var createModel = Generator.Default.Single(); - createModel.Title = "Testing"; - createModel.Description = "Test " + DateTime.Now.Ticks; - createModel.StatusId = StatusConstants.NotStarted; - createModel.TenantId = Guid.NewGuid(); + var generator = new Faker() + .RuleFor(t => t.TenantId, f => Guid.NewGuid()) + .RuleFor(t => t.StatusId, f => StatusConstants.NotStarted) + .RuleFor(t => t.PriorityId, f => PriorityConstants.Normal) + .RuleFor(t => t.Title, f => f.Lorem.Word()) + .RuleFor(t => t.Description, f => f.Lorem.Sentence()); + + var createModel = generator.Generate(); var createCommand = new EntityCreateCommand(MockPrincipal.Default, createModel); await Assert.ThrowsAsync(() => mediator.Send(createCommand)); @@ -168,14 +175,16 @@ public async Task TenantSetDefault() mapper.Should().NotBeNull(); // Create Entity - var createModel = Generator.Default.Single(); - createModel.Title = "Testing"; - createModel.Description = "Test " + DateTime.Now.Ticks; - createModel.StatusId = StatusConstants.NotStarted; - createModel.TenantId = Guid.Empty; + var generator = new Faker() + .RuleFor(t => t.StatusId, f => StatusConstants.NotStarted) + .RuleFor(t => t.PriorityId, f => PriorityConstants.Normal) + .RuleFor(t => t.Title, f => f.Lorem.Word()) + .RuleFor(t => t.Description, f => f.Lorem.Sentence()); + + var createModel = generator.Generate(); var createCommand = new EntityCreateCommand(MockPrincipal.Default, createModel); - var createResult = await mediator.Send(createCommand).ConfigureAwait(false); + var createResult = await mediator.Send(createCommand); createResult.Should().NotBeNull(); createResult.TenantId.Should().Be(TenantConstants.Test); @@ -195,7 +204,7 @@ public async Task EntityPageQuery() var entityQuery = new EntityQuery { Filter = filter }; var pagedQuery = new EntityPagedQuery(MockPrincipal.Default, entityQuery); - var selectResult = await mediator.Send(pagedQuery).ConfigureAwait(false); + var selectResult = await mediator.Send(pagedQuery); selectResult.Should().NotBeNull(); } @@ -213,7 +222,7 @@ public async Task EntitySelectQuery() var select = new EntitySelect(filter); var selectQuery = new EntitySelectQuery(MockPrincipal.Default, select); - var selectResult = await mediator.Send(selectQuery).ConfigureAwait(false); + var selectResult = await mediator.Send(selectQuery); selectResult.Should().NotBeNull(); } @@ -231,7 +240,7 @@ public async Task EntitySelectQueryDelete() var select = new EntitySelect(filter); var selectQuery = new EntitySelectQuery(MockPrincipal.Default, select); - var selectResult = await mediator.Send(selectQuery).ConfigureAwait(false); + var selectResult = await mediator.Send(selectQuery); selectResult.Should().NotBeNull(); } @@ -258,7 +267,7 @@ public async Task EntitySelectQueryDeleteNested() var select = new EntitySelect(filter); var selectQuery = new EntitySelectQuery(MockPrincipal.Default, select); - var selectResult = await mediator.Send(selectQuery).ConfigureAwait(false); + var selectResult = await mediator.Send(selectQuery); selectResult.Should().NotBeNull(); } } diff --git a/test/MediatR.CommandQuery.EntityFrameworkCore.SqlServer.Tests/Data/DataServiceRegistration.cs b/test/MediatR.CommandQuery.EntityFrameworkCore.SqlServer.Tests/Data/DataServiceRegistration.cs index fac60e97..420d4c21 100644 --- a/test/MediatR.CommandQuery.EntityFrameworkCore.SqlServer.Tests/Data/DataServiceRegistration.cs +++ b/test/MediatR.CommandQuery.EntityFrameworkCore.SqlServer.Tests/Data/DataServiceRegistration.cs @@ -1,27 +1,23 @@ -using System; -using System.Collections.Generic; - -using KickStart.DependencyInjection; - using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; namespace MediatR.CommandQuery.EntityFrameworkCore.SqlServer.Tests.Data; -public class DataServiceRegistration : IDependencyInjectionRegistration +public class DataServiceRegistration { - public void Register(IServiceCollection services, IDictionary data) + [RegisterServices] + public void Register(IServiceCollection services) { - data.TryGetValue("configuration", out var configurationData); - - if (!(configurationData is IConfiguration configuration)) - return; - - var connectionString = configuration.GetConnectionString("Tracker"); + services.AddDbContext( + optionsAction: (provider, options) => + { + var configuration = provider.GetRequiredService(); + var connectionString = configuration.GetConnectionString("Tracker"); - services.AddDbContext(options => options - .UseSqlServer(connectionString) - ); + options.UseSqlServer(connectionString, providerOptions => providerOptions.EnableRetryOnFailure()); + }, + contextLifetime: ServiceLifetime.Transient, + optionsLifetime: ServiceLifetime.Transient); } } diff --git a/test/MediatR.CommandQuery.EntityFrameworkCore.SqlServer.Tests/Data/TrackerContext.cs b/test/MediatR.CommandQuery.EntityFrameworkCore.SqlServer.Tests/Data/TrackerContext.cs index 05c7021c..ae9c010e 100644 --- a/test/MediatR.CommandQuery.EntityFrameworkCore.SqlServer.Tests/Data/TrackerContext.cs +++ b/test/MediatR.CommandQuery.EntityFrameworkCore.SqlServer.Tests/Data/TrackerContext.cs @@ -1,8 +1,3 @@ -using System; - -using MediatR.CommandQuery.EntityFrameworkCore.SqlServer.Tests.Data.Entities; -using MediatR.CommandQuery.EntityFrameworkCore.SqlServer.Tests.Data.Mapping; - using Microsoft.EntityFrameworkCore; namespace MediatR.CommandQuery.EntityFrameworkCore.SqlServer.Tests.Data; diff --git a/test/MediatR.CommandQuery.EntityFrameworkCore.SqlServer.Tests/DatabaseCollection.cs b/test/MediatR.CommandQuery.EntityFrameworkCore.SqlServer.Tests/DatabaseCollection.cs index 296922ed..c9e5dfad 100644 --- a/test/MediatR.CommandQuery.EntityFrameworkCore.SqlServer.Tests/DatabaseCollection.cs +++ b/test/MediatR.CommandQuery.EntityFrameworkCore.SqlServer.Tests/DatabaseCollection.cs @@ -1,7 +1,3 @@ -using System; - -using Xunit; - namespace MediatR.CommandQuery.EntityFrameworkCore.SqlServer.Tests; [CollectionDefinition(DatabaseCollection.CollectionName)] diff --git a/test/MediatR.CommandQuery.EntityFrameworkCore.SqlServer.Tests/DatabaseFixture.cs b/test/MediatR.CommandQuery.EntityFrameworkCore.SqlServer.Tests/DatabaseFixture.cs index 4646863b..5fda19be 100644 --- a/test/MediatR.CommandQuery.EntityFrameworkCore.SqlServer.Tests/DatabaseFixture.cs +++ b/test/MediatR.CommandQuery.EntityFrameworkCore.SqlServer.Tests/DatabaseFixture.cs @@ -1,136 +1,27 @@ using System; -using System.Linq; -using System.Reflection; - -using AutoMapper; - -using DbUp; -using DbUp.Engine.Output; - -using KickStart; using MediatR.CommandQuery.Definitions; -using MediatR.CommandQuery.EntityFrameworkCore.SqlServer.Tests.Data; -using MediatR.CommandQuery.EntityFrameworkCore.SqlServer.Tests.Logging; -using MediatR.CommandQuery.Models; -using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection.Extensions; -using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Hosting; -using Xunit.Abstractions; +using XUnit.Hosting; namespace MediatR.CommandQuery.EntityFrameworkCore.SqlServer.Tests; -public class DatabaseFixture : IUpgradeLog, IDisposable +public class DatabaseFixture : TestHostFixture { - private readonly ILogger _logger; - - public DatabaseFixture() + protected override void ConfigureServices(HostBuilderContext context, IServiceCollection services) { - var enviromentName = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT") ?? "Test"; - var builder = new Microsoft.Extensions.Configuration.ConfigurationBuilder() - .AddJsonFile("appsettings.json") - .AddJsonFile($"appsettings.{enviromentName}.json", true); - - Configuration = builder.Build(); - ConnectionString = Configuration.GetConnectionString(ConnectionName); ; - - var services = new ServiceCollection(); - services.AddSingleton(p => Configuration); - services.AddLogging(f => - { - f.SetMinimumLevel(LogLevel.Trace); - f.AddMemory(); - f.AddFilter("Microsoft", LogLevel.Information); - f.AddFilter("System", LogLevel.Warning); - }); - services.AddOptions(); + services.AddHostedService(); services.TryAddTransient, MockTenantResolver>(); - services.AddAutoMapper(typeof(TrackerContext).Assembly); + services.AddAutoMapper(typeof(DatabaseFixture).Assembly); services.AddMediator(); - services.AddValidatorsFromAssembly(); + services.AddValidatorsFromAssembly(); - services.KickStart(config => config - .IncludeAssemblyFor() - .IncludeAssemblyFor() - .Data("configuration", Configuration) - .Data("hostProcess", "test") - .UseStartupTask() - ); - - ServiceProvider = services.BuildServiceProvider(); - - var factory = ServiceProvider.GetService(); - _logger = factory.CreateLogger(); - - CreateDatabase(); + services.AddMediatRCommandQueryEntityFrameworkCoreSqlServerTests(); } - - - public string ConnectionString { get; set; } - - public string ConnectionName { get; set; } = "Tracker"; - - public IConfigurationRoot Configuration { get; } - - public IServiceProvider ServiceProvider { get; } - - - private void CreateDatabase() - { - EnsureDatabase.For - .SqlDatabase(ConnectionString, this); - - var upgradeEngine = DeployChanges.To - .SqlDatabase(ConnectionString) - .WithScriptsEmbeddedInAssembly(Assembly.GetExecutingAssembly()) - .LogTo(this) - .Build(); - - var result = upgradeEngine.PerformUpgrade(); - - if (result.Successful) - return; - - _logger.LogError(result.Error, "Database Error: {message}", result.Error.Message); - - throw result.Error; - } - - - public void Report(ITestOutputHelper output) - { - var logs = MemoryLoggerProvider.Current.LogEntries.ToList(); - - foreach (var log in logs) - output.WriteLine(log.ToString()); - - // reset logger - MemoryLoggerProvider.Current.Clear(); - } - - public void Dispose() - { - } - - - void IUpgradeLog.WriteInformation(string format, params object[] args) - { - _logger.LogInformation(format, args); - } - - void IUpgradeLog.WriteError(string format, params object[] args) - { - _logger.LogError(format, args); - } - - void IUpgradeLog.WriteWarning(string format, params object[] args) - { - _logger.LogWarning(format, args); - } - } diff --git a/test/MediatR.CommandQuery.EntityFrameworkCore.SqlServer.Tests/DatabaseInitializer.cs b/test/MediatR.CommandQuery.EntityFrameworkCore.SqlServer.Tests/DatabaseInitializer.cs new file mode 100644 index 00000000..4ff048f1 --- /dev/null +++ b/test/MediatR.CommandQuery.EntityFrameworkCore.SqlServer.Tests/DatabaseInitializer.cs @@ -0,0 +1,67 @@ +using System.Reflection; +using System.Threading; +using System.Threading.Tasks; + +using DbUp; +using DbUp.Engine.Output; + +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.Hosting; +using Microsoft.Extensions.Logging; + +namespace MediatR.CommandQuery.EntityFrameworkCore.SqlServer.Tests; + +public class DatabaseInitializer : IHostedService, IUpgradeLog +{ + private readonly ILogger _logger; + private readonly IConfiguration _configuration; + + public DatabaseInitializer(ILogger logger, IConfiguration configuration) + { + _logger = logger; + _configuration = configuration; + } + + + public Task StartAsync(CancellationToken cancellationToken) + { + var connectionString = _configuration.GetConnectionString("Tracker"); + + // create database + EnsureDatabase.For + .SqlDatabase(connectionString, this); + + var upgradeEngine = DeployChanges.To + .SqlDatabase(connectionString) + .WithScriptsEmbeddedInAssembly(Assembly.GetExecutingAssembly()) + .LogTo(this) + .Build(); + + var result = upgradeEngine.PerformUpgrade(); + + return result.Successful + ? Task.CompletedTask + : Task.FromException(result.Error); + } + + public Task StopAsync(CancellationToken cancellationToken) + { + return Task.CompletedTask; + } + + + public void WriteError(string format, params object[] args) + { + _logger.LogError(format, args); + } + + public void WriteInformation(string format, params object[] args) + { + _logger.LogInformation(format, args); + } + + public void WriteWarning(string format, params object[] args) + { + _logger.LogWarning(format, args); + } +} diff --git a/test/MediatR.CommandQuery.EntityFrameworkCore.SqlServer.Tests/DatabaseTestBase.cs b/test/MediatR.CommandQuery.EntityFrameworkCore.SqlServer.Tests/DatabaseTestBase.cs index 80f0df30..ecdc9400 100644 --- a/test/MediatR.CommandQuery.EntityFrameworkCore.SqlServer.Tests/DatabaseTestBase.cs +++ b/test/MediatR.CommandQuery.EntityFrameworkCore.SqlServer.Tests/DatabaseTestBase.cs @@ -1,30 +1,19 @@ using System; -using Xunit; using Xunit.Abstractions; +using XUnit.Hosting; + namespace MediatR.CommandQuery.EntityFrameworkCore.SqlServer.Tests; [Collection(DatabaseCollection.CollectionName)] -public abstract class DatabaseTestBase : IDisposable +public abstract class DatabaseTestBase : TestHostBase { protected DatabaseTestBase(ITestOutputHelper output, DatabaseFixture databaseFixture) + : base(output, databaseFixture) { - Output = output; - Fixture = databaseFixture; - Fixture?.Report(Output); } + public IServiceProvider ServiceProvider => Fixture.Services; - public ITestOutputHelper Output { get; } - - public DatabaseFixture Fixture { get; } - - public IServiceProvider ServiceProvider => Fixture?.ServiceProvider; - - - public void Dispose() - { - Fixture?.Report(Output); - } } diff --git a/test/MediatR.CommandQuery.EntityFrameworkCore.SqlServer.Tests/Domain/Audit/AuditServiceRegistration.cs b/test/MediatR.CommandQuery.EntityFrameworkCore.SqlServer.Tests/Domain/Audit/AuditServiceRegistration.cs index 190f4078..2651d8f5 100644 --- a/test/MediatR.CommandQuery.EntityFrameworkCore.SqlServer.Tests/Domain/Audit/AuditServiceRegistration.cs +++ b/test/MediatR.CommandQuery.EntityFrameworkCore.SqlServer.Tests/Domain/Audit/AuditServiceRegistration.cs @@ -1,7 +1,4 @@ using System; -using System.Collections.Generic; - -using KickStart.DependencyInjection; using MediatR.CommandQuery.EntityFrameworkCore.SqlServer.Tests.Data; using MediatR.CommandQuery.EntityFrameworkCore.SqlServer.Tests.Domain.Audit.Models; @@ -11,9 +8,10 @@ // ReSharper disable once CheckNamespace namespace MediatR.CommandQuery.EntityFrameworkCore.SqlServer.Tests.Domain.Audit; -public class AuditServiceRegistration : IDependencyInjectionRegistration +public class AuditServiceRegistration { - public void Register(IServiceCollection services, IDictionary data) + [RegisterServices] + public void Register(IServiceCollection services) { services.AddEntityQueries(); services.AddEntityCommands(); diff --git a/test/MediatR.CommandQuery.EntityFrameworkCore.SqlServer.Tests/Domain/Priority/PriorityServiceRegistration.cs b/test/MediatR.CommandQuery.EntityFrameworkCore.SqlServer.Tests/Domain/Priority/PriorityServiceRegistration.cs index 78636930..07525a73 100644 --- a/test/MediatR.CommandQuery.EntityFrameworkCore.SqlServer.Tests/Domain/Priority/PriorityServiceRegistration.cs +++ b/test/MediatR.CommandQuery.EntityFrameworkCore.SqlServer.Tests/Domain/Priority/PriorityServiceRegistration.cs @@ -1,7 +1,4 @@ using System; -using System.Collections.Generic; - -using KickStart.DependencyInjection; using MediatR.CommandQuery.EntityFrameworkCore.SqlServer.Tests.Data; using MediatR.CommandQuery.EntityFrameworkCore.SqlServer.Tests.Domain.Priority.Models; @@ -11,9 +8,10 @@ // ReSharper disable once CheckNamespace namespace MediatR.CommandQuery.EntityFrameworkCore.SqlServer.Tests.Domain.Priority; -public class PriorityServiceRegistration : IDependencyInjectionRegistration +public class PriorityServiceRegistration { - public void Register(IServiceCollection services, IDictionary data) + [RegisterServices] + public void Register(IServiceCollection services) { services.AddEntityQueries(); services.AddEntityCommands(); diff --git a/test/MediatR.CommandQuery.EntityFrameworkCore.SqlServer.Tests/Domain/Role/RoleServiceRegistration.cs b/test/MediatR.CommandQuery.EntityFrameworkCore.SqlServer.Tests/Domain/Role/RoleServiceRegistration.cs index 79a0d7a9..cd209e6f 100644 --- a/test/MediatR.CommandQuery.EntityFrameworkCore.SqlServer.Tests/Domain/Role/RoleServiceRegistration.cs +++ b/test/MediatR.CommandQuery.EntityFrameworkCore.SqlServer.Tests/Domain/Role/RoleServiceRegistration.cs @@ -1,7 +1,4 @@ using System; -using System.Collections.Generic; - -using KickStart.DependencyInjection; using MediatR.CommandQuery.EntityFrameworkCore.SqlServer.Tests.Data; using MediatR.CommandQuery.EntityFrameworkCore.SqlServer.Tests.Domain.Role.Models; @@ -11,9 +8,10 @@ // ReSharper disable once CheckNamespace namespace MediatR.CommandQuery.EntityFrameworkCore.SqlServer.Tests.Domain.Role; -public class RoleServiceRegistration : IDependencyInjectionRegistration +public class RoleServiceRegistration { - public void Register(IServiceCollection services, IDictionary data) + [RegisterServices] + public void Register(IServiceCollection services) { services.AddEntityQueries(); services.AddEntityCommands(); diff --git a/test/MediatR.CommandQuery.EntityFrameworkCore.SqlServer.Tests/Domain/Status/StatusServiceRegistration.cs b/test/MediatR.CommandQuery.EntityFrameworkCore.SqlServer.Tests/Domain/Status/StatusServiceRegistration.cs index c4987593..f503a2d2 100644 --- a/test/MediatR.CommandQuery.EntityFrameworkCore.SqlServer.Tests/Domain/Status/StatusServiceRegistration.cs +++ b/test/MediatR.CommandQuery.EntityFrameworkCore.SqlServer.Tests/Domain/Status/StatusServiceRegistration.cs @@ -1,7 +1,4 @@ using System; -using System.Collections.Generic; - -using KickStart.DependencyInjection; using MediatR.CommandQuery.EntityFrameworkCore.SqlServer.Tests.Data; using MediatR.CommandQuery.EntityFrameworkCore.SqlServer.Tests.Domain.Status.Models; @@ -11,9 +8,10 @@ // ReSharper disable once CheckNamespace namespace MediatR.CommandQuery.EntityFrameworkCore.SqlServer.Tests.Domain.Status; -public class StatusServiceRegistration : IDependencyInjectionRegistration +public class StatusServiceRegistration { - public void Register(IServiceCollection services, IDictionary data) + [RegisterServices] + public void Register(IServiceCollection services) { services.AddEntityQueries(); services.AddEntityCommands(); diff --git a/test/MediatR.CommandQuery.EntityFrameworkCore.SqlServer.Tests/Domain/Task/TaskServiceRegistration.cs b/test/MediatR.CommandQuery.EntityFrameworkCore.SqlServer.Tests/Domain/Task/TaskServiceRegistration.cs index 6f8e243f..f23a867f 100644 --- a/test/MediatR.CommandQuery.EntityFrameworkCore.SqlServer.Tests/Domain/Task/TaskServiceRegistration.cs +++ b/test/MediatR.CommandQuery.EntityFrameworkCore.SqlServer.Tests/Domain/Task/TaskServiceRegistration.cs @@ -1,7 +1,4 @@ using System; -using System.Collections.Generic; - -using KickStart.DependencyInjection; using MediatR.CommandQuery.EntityFrameworkCore.SqlServer.Tests.Data; using MediatR.CommandQuery.EntityFrameworkCore.SqlServer.Tests.Domain.Task.Handlers; @@ -13,9 +10,10 @@ // ReSharper disable once CheckNamespace namespace MediatR.CommandQuery.EntityFrameworkCore.SqlServer.Tests.Domain.Task; -public class TaskServiceRegistration : IDependencyInjectionRegistration +public class TaskServiceRegistration { - public void Register(IServiceCollection services, IDictionary data) + [RegisterServices] + public void Register(IServiceCollection services) { services.AddEntityQueries(); services.AddEntityCommands(); diff --git a/test/MediatR.CommandQuery.EntityFrameworkCore.SqlServer.Tests/Domain/Tenant/TenantServiceRegistration.cs b/test/MediatR.CommandQuery.EntityFrameworkCore.SqlServer.Tests/Domain/Tenant/TenantServiceRegistration.cs index 2e9ba289..e5b1995b 100644 --- a/test/MediatR.CommandQuery.EntityFrameworkCore.SqlServer.Tests/Domain/Tenant/TenantServiceRegistration.cs +++ b/test/MediatR.CommandQuery.EntityFrameworkCore.SqlServer.Tests/Domain/Tenant/TenantServiceRegistration.cs @@ -1,7 +1,4 @@ using System; -using System.Collections.Generic; - -using KickStart.DependencyInjection; using MediatR.CommandQuery.EntityFrameworkCore.SqlServer.Tests.Data; using MediatR.CommandQuery.EntityFrameworkCore.SqlServer.Tests.Domain.Tenant.Models; @@ -11,9 +8,10 @@ // ReSharper disable once CheckNamespace namespace MediatR.CommandQuery.EntityFrameworkCore.SqlServer.Tests.Domain.Tenant; -public class TenantServiceRegistration : IDependencyInjectionRegistration +public class TenantServiceRegistration { - public void Register(IServiceCollection services, IDictionary data) + [RegisterServices] + public void Register(IServiceCollection services) { services.AddEntityQueries(); services.AddEntityCommands(); diff --git a/test/MediatR.CommandQuery.EntityFrameworkCore.SqlServer.Tests/Domain/User/UserServiceRegistration.cs b/test/MediatR.CommandQuery.EntityFrameworkCore.SqlServer.Tests/Domain/User/UserServiceRegistration.cs index 78d98224..a3e352c5 100644 --- a/test/MediatR.CommandQuery.EntityFrameworkCore.SqlServer.Tests/Domain/User/UserServiceRegistration.cs +++ b/test/MediatR.CommandQuery.EntityFrameworkCore.SqlServer.Tests/Domain/User/UserServiceRegistration.cs @@ -1,7 +1,4 @@ using System; -using System.Collections.Generic; - -using KickStart.DependencyInjection; using MediatR.CommandQuery.EntityFrameworkCore.SqlServer.Tests.Data; using MediatR.CommandQuery.EntityFrameworkCore.SqlServer.Tests.Domain.User.Models; @@ -11,9 +8,10 @@ // ReSharper disable once CheckNamespace namespace MediatR.CommandQuery.EntityFrameworkCore.SqlServer.Tests.Domain.User; -public class UserServiceRegistration : IDependencyInjectionRegistration +public class UserServiceRegistration { - public void Register(IServiceCollection services, IDictionary data) + [RegisterServices] + public void Register(IServiceCollection services) { services.AddEntityQueries(); services.AddEntityCommands(); diff --git a/test/MediatR.CommandQuery.EntityFrameworkCore.SqlServer.Tests/Domain/UserLogin/UserLoginServiceRegistration.cs b/test/MediatR.CommandQuery.EntityFrameworkCore.SqlServer.Tests/Domain/UserLogin/UserLoginServiceRegistration.cs index cda002cc..289be782 100644 --- a/test/MediatR.CommandQuery.EntityFrameworkCore.SqlServer.Tests/Domain/UserLogin/UserLoginServiceRegistration.cs +++ b/test/MediatR.CommandQuery.EntityFrameworkCore.SqlServer.Tests/Domain/UserLogin/UserLoginServiceRegistration.cs @@ -1,7 +1,4 @@ using System; -using System.Collections.Generic; - -using KickStart.DependencyInjection; using MediatR.CommandQuery.EntityFrameworkCore.SqlServer.Tests.Data; using MediatR.CommandQuery.EntityFrameworkCore.SqlServer.Tests.Domain.UserLogin.Models; @@ -11,9 +8,10 @@ // ReSharper disable once CheckNamespace namespace MediatR.CommandQuery.EntityFrameworkCore.SqlServer.Tests.Domain.UserLogin; -public class UserLoginServiceRegistration : IDependencyInjectionRegistration +public class UserLoginServiceRegistration { - public void Register(IServiceCollection services, IDictionary data) + [RegisterServices] + public void Register(IServiceCollection services) { services.AddEntityQueries(); } diff --git a/test/MediatR.CommandQuery.EntityFrameworkCore.SqlServer.Tests/GlobalUsings.cs b/test/MediatR.CommandQuery.EntityFrameworkCore.SqlServer.Tests/GlobalUsings.cs new file mode 100644 index 00000000..ea463bf8 --- /dev/null +++ b/test/MediatR.CommandQuery.EntityFrameworkCore.SqlServer.Tests/GlobalUsings.cs @@ -0,0 +1,3 @@ +global using FluentAssertions; +global using Injectio.Attributes; +global using Xunit; diff --git a/test/MediatR.CommandQuery.EntityFrameworkCore.SqlServer.Tests/Logging/LogEntry.cs b/test/MediatR.CommandQuery.EntityFrameworkCore.SqlServer.Tests/Logging/LogEntry.cs deleted file mode 100644 index 30ada629..00000000 --- a/test/MediatR.CommandQuery.EntityFrameworkCore.SqlServer.Tests/Logging/LogEntry.cs +++ /dev/null @@ -1,58 +0,0 @@ -using System; -using System.Text; - -using Microsoft.Extensions.Logging; - -namespace MediatR.CommandQuery.EntityFrameworkCore.SqlServer.Tests.Logging; - -public class LogEntry -{ - public LogEntry( - string category, - LogLevel logLevel, - EventId eventId, - object state, - Exception exception, - string message) - { - Timestamp = DateTimeOffset.Now; - LogLevel = logLevel; - EventId = eventId; - State = state; - Exception = exception; - Message = message; - Category = category; - } - - public DateTimeOffset Timestamp { get; } - - public string Category { get; } - - public EventId EventId { get; } - - public Exception Exception { get; } - - public LogLevel LogLevel { get; } - - public string Message { get; } - - public object State { get; } - - public override string ToString() - { - var builder = new StringBuilder(); - builder - .Append(Timestamp.ToString("HH:mm:ss.fff")) - .Append(" [") - .Append(LogLevel.ToString()) - .Append("] ") - .Append(Category) - .Append(": ") - .Append(Message); - - if (Exception != null) - builder.AppendLine().AppendLine(Exception.ToString()); - - return builder.ToString(); - } -} diff --git a/test/MediatR.CommandQuery.EntityFrameworkCore.SqlServer.Tests/Logging/MemoryLogger.cs b/test/MediatR.CommandQuery.EntityFrameworkCore.SqlServer.Tests/Logging/MemoryLogger.cs deleted file mode 100644 index d7715346..00000000 --- a/test/MediatR.CommandQuery.EntityFrameworkCore.SqlServer.Tests/Logging/MemoryLogger.cs +++ /dev/null @@ -1,35 +0,0 @@ -using System; - -using Microsoft.Extensions.Logging; - -namespace MediatR.CommandQuery.EntityFrameworkCore.SqlServer.Tests.Logging; - -public class MemoryLogger : ILogger -{ - private readonly MemoryLoggerProvider _provider; - private readonly string _categoryName; - - public MemoryLogger(MemoryLoggerProvider provider, string categoryName) - { - _provider = provider; - _categoryName = categoryName; - } - - public IDisposable BeginScope(TState state) - { - return _provider.ScopeProvider?.Push(state); - } - - public bool IsEnabled(LogLevel logLevel) - { - return true; - } - - public void Log(LogLevel logLevel, EventId eventId, TState state, Exception exception, Func formatter) - { - var message = formatter(state, exception); - var logEvent = new LogEntry(_categoryName, logLevel, eventId, state, exception, message); - - _provider.WriteLog(logEvent); - } -} diff --git a/test/MediatR.CommandQuery.EntityFrameworkCore.SqlServer.Tests/Logging/MemoryLoggerFactoryExtensions.cs b/test/MediatR.CommandQuery.EntityFrameworkCore.SqlServer.Tests/Logging/MemoryLoggerFactoryExtensions.cs deleted file mode 100644 index 5b1591de..00000000 --- a/test/MediatR.CommandQuery.EntityFrameworkCore.SqlServer.Tests/Logging/MemoryLoggerFactoryExtensions.cs +++ /dev/null @@ -1,15 +0,0 @@ -using System; - -using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.Logging; - -namespace MediatR.CommandQuery.EntityFrameworkCore.SqlServer.Tests.Logging; - -public static class MemoryLoggerFactoryExtensions -{ - public static ILoggingBuilder AddMemory(this ILoggingBuilder builder) - { - builder.Services.AddSingleton(s => MemoryLoggerProvider.Current); - return builder; - } -} diff --git a/test/MediatR.CommandQuery.EntityFrameworkCore.SqlServer.Tests/Logging/MemoryLoggerProvider.cs b/test/MediatR.CommandQuery.EntityFrameworkCore.SqlServer.Tests/Logging/MemoryLoggerProvider.cs deleted file mode 100644 index e6dd163c..00000000 --- a/test/MediatR.CommandQuery.EntityFrameworkCore.SqlServer.Tests/Logging/MemoryLoggerProvider.cs +++ /dev/null @@ -1,50 +0,0 @@ -using System; -using System.Collections.Concurrent; -using System.Collections.Generic; -using System.Linq; - -using Microsoft.Extensions.Logging; - -namespace MediatR.CommandQuery.EntityFrameworkCore.SqlServer.Tests.Logging; - -[ProviderAlias("Memory")] -public class MemoryLoggerProvider : ILoggerProvider, ISupportExternalScope -{ - private readonly ConcurrentQueue _logEntries = new ConcurrentQueue(); - - - public IExternalScopeProvider ScopeProvider { get; private set; } - - public IReadOnlyList LogEntries => _logEntries.ToList(); - - - public ILogger CreateLogger(string categoryName) - { - return new MemoryLogger(this, categoryName); - } - - public void WriteLog(LogEntry logEntry) - { - _logEntries.Enqueue(logEntry); - } - - public void Clear() - { - _logEntries.Clear(); - } - - public void Dispose() - { - _logEntries.Clear(); - } - - void ISupportExternalScope.SetScopeProvider(IExternalScopeProvider scopeProvider) - { - ScopeProvider = scopeProvider; - } - - - private static readonly Lazy _current = new Lazy(); - - public static MemoryLoggerProvider Current => _current.Value; -} diff --git a/test/MediatR.CommandQuery.EntityFrameworkCore.SqlServer.Tests/MediatR.CommandQuery.EntityFrameworkCore.SqlServer.Tests.csproj b/test/MediatR.CommandQuery.EntityFrameworkCore.SqlServer.Tests/MediatR.CommandQuery.EntityFrameworkCore.SqlServer.Tests.csproj index b51267be..b0eb200b 100644 --- a/test/MediatR.CommandQuery.EntityFrameworkCore.SqlServer.Tests/MediatR.CommandQuery.EntityFrameworkCore.SqlServer.Tests.csproj +++ b/test/MediatR.CommandQuery.EntityFrameworkCore.SqlServer.Tests/MediatR.CommandQuery.EntityFrameworkCore.SqlServer.Tests.csproj @@ -1,7 +1,7 @@ - net7.0 + net8.0 false @@ -17,21 +17,22 @@ + all runtime; build; native; contentfiles; analyzers; buildtransitive - - - - - - - - - - - + + + + + + + + + + + all runtime; build; native; contentfiles; analyzers diff --git a/test/MediatR.CommandQuery.EntityFrameworkCore.Tests/GlobalUsings.cs b/test/MediatR.CommandQuery.EntityFrameworkCore.Tests/GlobalUsings.cs new file mode 100644 index 00000000..7b25dddc --- /dev/null +++ b/test/MediatR.CommandQuery.EntityFrameworkCore.Tests/GlobalUsings.cs @@ -0,0 +1,2 @@ +global using FluentAssertions; +global using Xunit; diff --git a/test/MediatR.CommandQuery.EntityFrameworkCore.Tests/Handlers/EntityCreateCommandHandlerTests.cs b/test/MediatR.CommandQuery.EntityFrameworkCore.Tests/Handlers/EntityCreateCommandHandlerTests.cs index 68e2b67a..17c7db30 100644 --- a/test/MediatR.CommandQuery.EntityFrameworkCore.Tests/Handlers/EntityCreateCommandHandlerTests.cs +++ b/test/MediatR.CommandQuery.EntityFrameworkCore.Tests/Handlers/EntityCreateCommandHandlerTests.cs @@ -4,9 +4,7 @@ using AutoMapper; -using DataGenerator; - -using FluentAssertions; +using Bogus; using MediatR.CommandQuery.Commands; using MediatR.CommandQuery.EntityFrameworkCore.Handlers; @@ -17,8 +15,6 @@ using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Logging.Abstractions; -using Xunit; - namespace MediatR.CommandQuery.EntityFrameworkCore.Tests.Handlers; public class EntityCreateCommandHandlerTests @@ -26,7 +22,18 @@ public class EntityCreateCommandHandlerTests [Fact] public async Task CreateLocation() { - var createModel = Generator.Default.Single(); + var generator = new Faker() + .RuleFor(p => p.Name, (faker, model) => faker.Company.CompanyName()) + .RuleFor(p => p.Description, (faker, model) => faker.Lorem.Sentence()) + .RuleFor(p => p.AddressLine1, (faker, model) => faker.Address.StreetAddress()) + .RuleFor(p => p.AddressLine2, (faker, model) => faker.Address.SecondaryAddress()) + .RuleFor(p => p.City, (faker, model) => faker.Address.City()) + .RuleFor(p => p.StateProvince, (faker, model) => faker.Address.StateAbbr()) + .RuleFor(p => p.PostalCode, (faker, model) => faker.Address.ZipCode()) + .RuleFor(p => p.Latitude, (faker, model) => (decimal)faker.Address.Latitude()) + .RuleFor(p => p.Longitude, (faker, model) => (decimal)faker.Address.Longitude()); + + var createModel = generator.Generate(); createModel.Should().NotBeNull(); var createCommand = new EntityCreateCommand(MockPrincipal.Default, createModel); diff --git a/test/MediatR.CommandQuery.EntityFrameworkCore.Tests/Handlers/EntityUpdateCommandHandlerTests.cs b/test/MediatR.CommandQuery.EntityFrameworkCore.Tests/Handlers/EntityUpdateCommandHandlerTests.cs index c5274be3..68898f16 100644 --- a/test/MediatR.CommandQuery.EntityFrameworkCore.Tests/Handlers/EntityUpdateCommandHandlerTests.cs +++ b/test/MediatR.CommandQuery.EntityFrameworkCore.Tests/Handlers/EntityUpdateCommandHandlerTests.cs @@ -4,9 +4,7 @@ using AutoMapper; -using DataGenerator; - -using FluentAssertions; +using Bogus; using MediatR.CommandQuery.Commands; using MediatR.CommandQuery.EntityFrameworkCore.Handlers; @@ -17,8 +15,6 @@ using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Logging.Abstractions; -using Xunit; - namespace MediatR.CommandQuery.EntityFrameworkCore.Tests.Handlers; public class EntityUpdateCommandHandlerTests @@ -26,7 +22,18 @@ public class EntityUpdateCommandHandlerTests [Fact] public async Task UpdateLocation() { - var original = Generator.Default.Single(); + var generatorLocation = new Faker() + .RuleFor(p => p.Name, (faker, model) => faker.Company.CompanyName()) + .RuleFor(p => p.Description, (faker, model) => faker.Lorem.Sentence()) + .RuleFor(p => p.AddressLine1, (faker, model) => faker.Address.StreetAddress()) + .RuleFor(p => p.AddressLine2, (faker, model) => faker.Address.SecondaryAddress()) + .RuleFor(p => p.City, (faker, model) => faker.Address.City()) + .RuleFor(p => p.StateProvince, (faker, model) => faker.Address.StateAbbr()) + .RuleFor(p => p.PostalCode, (faker, model) => faker.Address.ZipCode()) + .RuleFor(p => p.Latitude, (faker, model) => (decimal)faker.Address.Latitude()) + .RuleFor(p => p.Longitude, (faker, model) => (decimal)faker.Address.Longitude()); + + var original = generatorLocation.Generate(); var config = new MapperConfiguration(cfg => { @@ -44,7 +51,18 @@ public async Task UpdateLocation() context.Locations.Add(original); context.SaveChanges(); - var updateModel = Generator.Default.Single(); + var generatorUpdateModel = new Faker() + .RuleFor(p => p.Name, (faker, model) => faker.Company.CompanyName()) + .RuleFor(p => p.Description, (faker, model) => faker.Lorem.Sentence()) + .RuleFor(p => p.AddressLine1, (faker, model) => faker.Address.StreetAddress()) + .RuleFor(p => p.AddressLine2, (faker, model) => faker.Address.SecondaryAddress()) + .RuleFor(p => p.City, (faker, model) => faker.Address.City()) + .RuleFor(p => p.StateProvince, (faker, model) => faker.Address.StateAbbr()) + .RuleFor(p => p.PostalCode, (faker, model) => faker.Address.ZipCode()) + .RuleFor(p => p.Latitude, (faker, model) => (decimal)faker.Address.Latitude()) + .RuleFor(p => p.Longitude, (faker, model) => (decimal)faker.Address.Longitude()); + + var updateModel = generatorUpdateModel.Generate(); updateModel.Should().NotBeNull(); var updateCommand = new EntityUpdateCommand(MockPrincipal.Default, original.Id, updateModel); diff --git a/test/MediatR.CommandQuery.EntityFrameworkCore.Tests/MediatR.CommandQuery.EntityFrameworkCore.Tests.csproj b/test/MediatR.CommandQuery.EntityFrameworkCore.Tests/MediatR.CommandQuery.EntityFrameworkCore.Tests.csproj index ae21d744..2168a0d7 100644 --- a/test/MediatR.CommandQuery.EntityFrameworkCore.Tests/MediatR.CommandQuery.EntityFrameworkCore.Tests.csproj +++ b/test/MediatR.CommandQuery.EntityFrameworkCore.Tests/MediatR.CommandQuery.EntityFrameworkCore.Tests.csproj @@ -1,21 +1,21 @@ - net7.0 + net8.0 false + all runtime; build; native; contentfiles; analyzers; buildtransitive - - - - - - + + + + + all runtime; build; native; contentfiles; analyzers diff --git a/test/MediatR.CommandQuery.MongoDB.Tests/Acceptance/AuditTests.cs b/test/MediatR.CommandQuery.MongoDB.Tests/Acceptance/AuditTests.cs index 77b10bba..576577a2 100644 --- a/test/MediatR.CommandQuery.MongoDB.Tests/Acceptance/AuditTests.cs +++ b/test/MediatR.CommandQuery.MongoDB.Tests/Acceptance/AuditTests.cs @@ -3,9 +3,7 @@ using AutoMapper; -using DataGenerator; - -using FluentAssertions; +using Bogus; using MediatR.CommandQuery.Commands; using MediatR.CommandQuery.MongoDB.Tests.Data.Entities; @@ -16,16 +14,15 @@ using Microsoft.AspNetCore.JsonPatch.Operations; using Microsoft.Extensions.DependencyInjection; -using MongoDB.Abstracts; using MongoDB.Bson; -using Xunit; using Xunit.Abstractions; using Task = System.Threading.Tasks.Task; namespace MediatR.CommandQuery.MongoDB.Tests.Acceptance; +[Collection(DatabaseCollection.CollectionName)] public class AuditTests : DatabaseTestBase { public AuditTests(ITestOutputHelper output, DatabaseFixture databaseFixture) : base(output, databaseFixture) @@ -43,19 +40,26 @@ public async Task FullTest() mapper.Should().NotBeNull(); // Create Entity - var createModel = Generator.Default.Single(); - createModel.Id = ObjectId.GenerateNewId().ToString(); - createModel.Username = "TEST"; - createModel.Content = "Test " + DateTime.Now.Ticks; + var generator = new Faker() + .RuleFor(p => p.Id, (faker, model) => ObjectId.GenerateNewId().ToString()) + .RuleFor(p => p.Username, (faker, model) => faker.Internet.UserName()) + .RuleFor(p => p.Content, (faker, model) => faker.Lorem.Paragraph()) + .RuleFor(p => p.Created, (faker, model) => faker.Date.PastOffset()) + .RuleFor(p => p.CreatedBy, (faker, model) => faker.Internet.Email()) + .RuleFor(p => p.Updated, (faker, model) => faker.Date.SoonOffset()) + .RuleFor(p => p.UpdatedBy, (faker, model) => faker.Internet.Email()) + .RuleFor(p => p.Date, (faker, model) => faker.Date.Soon()); + + var createModel = generator.Generate(); var createCommand = new EntityCreateCommand(MockPrincipal.Default, createModel); - var createResult = await mediator.Send(createCommand).ConfigureAwait(false); + var createResult = await mediator.Send(createCommand); createResult.Should().NotBeNull(); // Get Entity by Key var key = createResult.Id; var identifierQuery = new EntityIdentifierQuery(MockPrincipal.Default, key); - var identifierResult = await mediator.Send(identifierQuery).ConfigureAwait(false); + var identifierResult = await mediator.Send(identifierQuery); identifierResult.Should().NotBeNull(); identifierResult.Username.Should().Be(createModel.Username); @@ -67,7 +71,7 @@ public async Task FullTest() }; var listQuery = new EntityPagedQuery(MockPrincipal.Default, entityQuery); - var listResult = await mediator.Send(listQuery).ConfigureAwait(false); + var listResult = await mediator.Send(listQuery); listResult.Should().NotBeNull(); // Patch Entity @@ -81,7 +85,7 @@ public async Task FullTest() var patchCommand = new EntityPatchCommand(MockPrincipal.Default, key, patchModel); - var patchResult = await mediator.Send(patchCommand).ConfigureAwait(false); + var patchResult = await mediator.Send(patchCommand); patchResult.Should().NotBeNull(); patchResult.Content.Should().Be("Patch Update"); @@ -90,13 +94,13 @@ public async Task FullTest() updateModel.Content = "Update Command"; var updateCommand = new EntityUpdateCommand(MockPrincipal.Default, key, updateModel); - var updateResult = await mediator.Send(updateCommand).ConfigureAwait(false); + var updateResult = await mediator.Send(updateCommand); updateResult.Should().NotBeNull(); updateResult.Content.Should().Be("Update Command"); // Delete Entity var deleteCommand = new EntityDeleteCommand(MockPrincipal.Default, key); - var deleteResult = await mediator.Send(deleteCommand).ConfigureAwait(false); + var deleteResult = await mediator.Send(deleteCommand); deleteResult.Should().NotBeNull(); deleteResult.Id.Should().Be(createResult.Id); } @@ -115,18 +119,23 @@ public async Task Upsert() mapper.Should().NotBeNull(); // Update Entity - var updateModel = Generator.Default.Single(); - updateModel.Username = "TEST"; - updateModel.Content = "Insert " + DateTime.Now.Ticks; + var generator = new Faker() + .RuleFor(p => p.Username, (faker, model) => faker.Internet.UserName()) + .RuleFor(p => p.Content, (faker, model) => faker.Lorem.Paragraph()) + .RuleFor(p => p.Updated, (faker, model) => faker.Date.SoonOffset()) + .RuleFor(p => p.UpdatedBy, (faker, model) => faker.Internet.Email()) + .RuleFor(p => p.Date, (faker, model) => faker.Date.Soon()); + + var updateModel = generator.Generate(); var upsertCommandNew = new EntityUpsertCommand(MockPrincipal.Default, key, updateModel); - var upsertResultNew = await mediator.Send(upsertCommandNew).ConfigureAwait(false); + var upsertResultNew = await mediator.Send(upsertCommandNew); upsertResultNew.Should().NotBeNull(); upsertResultNew.Id.Should().Be(key); // Get Entity by Key var identifierQuery = new EntityIdentifierQuery(MockPrincipal.Default, key); - var identifierResult = await mediator.Send(identifierQuery).ConfigureAwait(false); + var identifierResult = await mediator.Send(identifierQuery); identifierResult.Should().NotBeNull(); identifierResult.Username.Should().Be(updateModel.Username); @@ -135,7 +144,7 @@ public async Task Upsert() // Upsert again, should be update var upsertCommandUpdate = new EntityUpsertCommand(MockPrincipal.Default, key, updateModel); - var upsertResultUpdate = await mediator.Send(upsertCommandUpdate).ConfigureAwait(false); + var upsertResultUpdate = await mediator.Send(upsertCommandUpdate); upsertResultUpdate.Should().NotBeNull(); upsertResultUpdate.Content.Should().NotBe(upsertResultNew.Content); } diff --git a/test/MediatR.CommandQuery.MongoDB.Tests/Acceptance/PriorityTests.cs b/test/MediatR.CommandQuery.MongoDB.Tests/Acceptance/PriorityTests.cs index 7dcd1b5b..be130cf9 100644 --- a/test/MediatR.CommandQuery.MongoDB.Tests/Acceptance/PriorityTests.cs +++ b/test/MediatR.CommandQuery.MongoDB.Tests/Acceptance/PriorityTests.cs @@ -1,22 +1,19 @@ -using System; using System.Collections.Generic; using System.Threading.Tasks; using AutoMapper; -using FluentAssertions; - using MediatR.CommandQuery.MongoDB.Tests.Constants; using MediatR.CommandQuery.MongoDB.Tests.Domain.Models; using MediatR.CommandQuery.Queries; using Microsoft.Extensions.DependencyInjection; -using Xunit; using Xunit.Abstractions; namespace MediatR.CommandQuery.MongoDB.Tests.Acceptance; +[Collection(DatabaseCollection.CollectionName)] public class PriorityTests : DatabaseTestBase { public PriorityTests(ITestOutputHelper output, DatabaseFixture databaseFixture) @@ -35,7 +32,7 @@ public async Task EntityIdentifierQuery() mapper.Should().NotBeNull(); var identifierQuery = new EntityIdentifierQuery(MockPrincipal.Default, PriorityConstants.Normal.Id); - var identifierResult = await mediator.Send(identifierQuery).ConfigureAwait(false); + var identifierResult = await mediator.Send(identifierQuery); identifierResult.Should().NotBeNull(); identifierResult.Id.Should().Be(PriorityConstants.Normal.Id); } @@ -57,7 +54,7 @@ public async Task EntityIdentifiersQuery() }; var identifierQuery = new EntityIdentifiersQuery(MockPrincipal.Default, identifiers); - var identifierResults = await mediator.Send(identifierQuery).ConfigureAwait(false); + var identifierResults = await mediator.Send(identifierQuery); identifierResults.Should().NotBeNull(); identifierResults.Count.Should().Be(2); @@ -87,7 +84,7 @@ public async Task EntityQueryIn() }; var listQuery = new EntityPagedQuery(MockPrincipal.Default, entityQuery); - var listResult = await mediator.Send(listQuery).ConfigureAwait(false); + var listResult = await mediator.Send(listQuery); listResult.Should().NotBeNull(); listResult.Total.Should().Be(2); } diff --git a/test/MediatR.CommandQuery.MongoDB.Tests/Acceptance/TaskTests.cs b/test/MediatR.CommandQuery.MongoDB.Tests/Acceptance/TaskTests.cs index d66c06e5..3720fc0d 100644 --- a/test/MediatR.CommandQuery.MongoDB.Tests/Acceptance/TaskTests.cs +++ b/test/MediatR.CommandQuery.MongoDB.Tests/Acceptance/TaskTests.cs @@ -3,9 +3,7 @@ using AutoMapper; -using DataGenerator; - -using FluentAssertions; +using Bogus; using MediatR.CommandQuery.Commands; using MediatR.CommandQuery.MongoDB.Tests.Constants; @@ -16,16 +14,15 @@ using Microsoft.AspNetCore.JsonPatch.Operations; using Microsoft.Extensions.DependencyInjection; -using MongoDB.Abstracts; using MongoDB.Bson; -using Xunit; using Xunit.Abstractions; using Task = System.Threading.Tasks.Task; namespace MediatR.CommandQuery.MongoDB.Tests.Acceptance; +[Collection(DatabaseCollection.CollectionName)] public class TaskTests : DatabaseTestBase { public TaskTests(ITestOutputHelper output, DatabaseFixture databaseFixture) @@ -44,21 +41,23 @@ public async Task FullTest() mapper.Should().NotBeNull(); // Create Entity - var createModel = Generator.Default.Single(); - createModel.Id = ObjectId.GenerateNewId().ToString(); - createModel.Title = "Testing"; - createModel.Description = "Test " + DateTime.Now.Ticks; - createModel.StatusId = StatusConstants.NotStarted.Id; - createModel.TenantId = TenantConstants.Test.Id; + var generator = new Faker() + .RuleFor(t => t.TenantId, f => TenantConstants.Test.Id) + .RuleFor(t => t.StatusId, f => StatusConstants.NotStarted.Id) + .RuleFor(t => t.PriorityId, f => PriorityConstants.Normal.Id) + .RuleFor(t => t.Title, f => f.Lorem.Word()) + .RuleFor(t => t.Description, f => f.Lorem.Sentence()); + + var createModel = generator.Generate(); var createCommand = new EntityCreateCommand(MockPrincipal.Default, createModel); - var createResult = await mediator.Send(createCommand).ConfigureAwait(false); + var createResult = await mediator.Send(createCommand); createResult.Should().NotBeNull(); // Get Entity by Key var key = createResult.Id; var identifierQuery = new EntityIdentifierQuery(MockPrincipal.Default, key); - var identifierResult = await mediator.Send(identifierQuery).ConfigureAwait(false); + var identifierResult = await mediator.Send(identifierQuery); identifierResult.Should().NotBeNull(); identifierResult.Title.Should().Be(createModel.Title); @@ -70,7 +69,7 @@ public async Task FullTest() }; var listQuery = new EntityPagedQuery(MockPrincipal.Default, entityQuery); - var listResult = await mediator.Send(listQuery).ConfigureAwait(false); + var listResult = await mediator.Send(listQuery); listResult.Should().NotBeNull(); // Patch Entity @@ -83,7 +82,7 @@ public async Task FullTest() }); var patchCommand = new EntityPatchCommand(MockPrincipal.Default, key, patchModel); - var patchResult = await mediator.Send(patchCommand).ConfigureAwait(false); + var patchResult = await mediator.Send(patchCommand); patchResult.Should().NotBeNull(); patchResult.Title.Should().Be("Patch Update"); @@ -92,13 +91,13 @@ public async Task FullTest() updateModel.Title = "Update Command"; var updateCommand = new EntityUpdateCommand(MockPrincipal.Default, key, updateModel); - var updateResult = await mediator.Send(updateCommand).ConfigureAwait(false); + var updateResult = await mediator.Send(updateCommand); updateResult.Should().NotBeNull(); updateResult.Title.Should().Be("Update Command"); // Delete Entity var deleteCommand = new EntityDeleteCommand(MockPrincipal.Default, key); - var deleteResult = await mediator.Send(deleteCommand).ConfigureAwait(false); + var deleteResult = await mediator.Send(deleteCommand); deleteResult.Should().NotBeNull(); deleteResult.Id.Should().Be(createResult.Id); } @@ -116,20 +115,23 @@ public async Task Upsert() mapper.Should().NotBeNull(); // Update Entity - var updateModel = Generator.Default.Single(); - updateModel.Title = "Upsert Test"; - updateModel.Description = "Insert " + DateTime.Now.Ticks; - updateModel.StatusId = StatusConstants.NotStarted.Id; - updateModel.TenantId = TenantConstants.Test.Id; + var generator = new Faker() + .RuleFor(t => t.TenantId, f => TenantConstants.Test.Id) + .RuleFor(t => t.StatusId, f => StatusConstants.NotStarted.Id) + .RuleFor(t => t.PriorityId, f => PriorityConstants.Normal.Id) + .RuleFor(t => t.Title, f => f.Lorem.Word()) + .RuleFor(t => t.Description, f => f.Lorem.Sentence()); + + var updateModel = generator.Generate(); var upsertCommandNew = new EntityUpsertCommand(MockPrincipal.Default, key, updateModel); - var upsertResultNew = await mediator.Send(upsertCommandNew).ConfigureAwait(false); + var upsertResultNew = await mediator.Send(upsertCommandNew); upsertResultNew.Should().NotBeNull(); upsertResultNew.Id.Should().Be(key); // Get Entity by Key var identifierQuery = new EntityIdentifierQuery(MockPrincipal.Default, key); - var identifierResult = await mediator.Send(identifierQuery).ConfigureAwait(false); + var identifierResult = await mediator.Send(identifierQuery); identifierResult.Should().NotBeNull(); identifierResult.Title.Should().Be(updateModel.Title); @@ -138,7 +140,7 @@ public async Task Upsert() // Upsert again, should be update var upsertCommandUpdate = new EntityUpsertCommand(MockPrincipal.Default, key, updateModel); - var upsertResultUpdate = await mediator.Send(upsertCommandUpdate).ConfigureAwait(false); + var upsertResultUpdate = await mediator.Send(upsertCommandUpdate); upsertResultUpdate.Should().NotBeNull(); upsertResultUpdate.Description.Should().NotBe(upsertResultNew.Description); } @@ -154,11 +156,14 @@ public async Task TenantDoesNotMatch() mapper.Should().NotBeNull(); // Create Entity - var createModel = Generator.Default.Single(); - createModel.Title = "Testing"; - createModel.Description = "Test " + DateTime.Now.Ticks; - createModel.StatusId = StatusConstants.NotStarted.Id; - createModel.TenantId = Guid.NewGuid().ToString(); + var generator = new Faker() + .RuleFor(t => t.TenantId, f => Guid.NewGuid().ToString()) + .RuleFor(t => t.StatusId, f => StatusConstants.NotStarted.Id) + .RuleFor(t => t.PriorityId, f => PriorityConstants.Normal.Id) + .RuleFor(t => t.Title, f => f.Lorem.Word()) + .RuleFor(t => t.Description, f => f.Lorem.Sentence()); + + var createModel = generator.Generate(); var createCommand = new EntityCreateCommand(MockPrincipal.Default, createModel); await Assert.ThrowsAsync(() => mediator.Send(createCommand)); @@ -175,15 +180,16 @@ public async Task TenantSetDefault() mapper.Should().NotBeNull(); // Create Entity - var createModel = Generator.Default.Single(); - createModel.Id = ObjectId.GenerateNewId().ToString(); - createModel.Title = "Testing"; - createModel.Description = "Test " + DateTime.Now.Ticks; - createModel.StatusId = StatusConstants.NotStarted.Id; - createModel.TenantId = null; + var generator = new Faker() + .RuleFor(t => t.StatusId, f => StatusConstants.NotStarted.Id) + .RuleFor(t => t.PriorityId, f => PriorityConstants.Normal.Id) + .RuleFor(t => t.Title, f => f.Lorem.Word()) + .RuleFor(t => t.Description, f => f.Lorem.Sentence()); + + var createModel = generator.Generate(); var createCommand = new EntityCreateCommand(MockPrincipal.Default, createModel); - var createResult = await mediator.Send(createCommand).ConfigureAwait(false); + var createResult = await mediator.Send(createCommand); createResult.Should().NotBeNull(); createResult.TenantId.Should().Be(TenantConstants.Test.Id); @@ -203,7 +209,7 @@ public async Task EntityPageQuery() var entityQuery = new EntityQuery { Filter = filter }; var pagedQuery = new EntityPagedQuery(MockPrincipal.Default, entityQuery); - var selectResult = await mediator.Send(pagedQuery).ConfigureAwait(false); + var selectResult = await mediator.Send(pagedQuery); selectResult.Should().NotBeNull(); } @@ -221,7 +227,7 @@ public async Task EntitySelectQuery() var select = new EntitySelect(filter); var selectQuery = new EntitySelectQuery(MockPrincipal.Default, select); - var selectResult = await mediator.Send(selectQuery).ConfigureAwait(false); + var selectResult = await mediator.Send(selectQuery); selectResult.Should().NotBeNull(); } @@ -239,7 +245,7 @@ public async Task EntitySelectQueryDelete() var select = new EntitySelect(filter); var selectQuery = new EntitySelectQuery(MockPrincipal.Default, select); - var selectResult = await mediator.Send(selectQuery).ConfigureAwait(false); + var selectResult = await mediator.Send(selectQuery); selectResult.Should().NotBeNull(); } @@ -266,7 +272,7 @@ public async Task EntitySelectQueryDeleteNested() var select = new EntitySelect(filter); var selectQuery = new EntitySelectQuery(MockPrincipal.Default, select); - var selectResult = await mediator.Send(selectQuery).ConfigureAwait(false); + var selectResult = await mediator.Send(selectQuery); selectResult.Should().NotBeNull(); } } diff --git a/test/MediatR.CommandQuery.MongoDB.Tests/DatabaseCollection.cs b/test/MediatR.CommandQuery.MongoDB.Tests/DatabaseCollection.cs index 71d315cd..b7c4c4b3 100644 --- a/test/MediatR.CommandQuery.MongoDB.Tests/DatabaseCollection.cs +++ b/test/MediatR.CommandQuery.MongoDB.Tests/DatabaseCollection.cs @@ -1,5 +1,3 @@ -using Xunit; - namespace MediatR.CommandQuery.MongoDB.Tests; [CollectionDefinition(DatabaseCollection.CollectionName)] diff --git a/test/MediatR.CommandQuery.MongoDB.Tests/DatabaseFixture.cs b/test/MediatR.CommandQuery.MongoDB.Tests/DatabaseFixture.cs index d1dbb7b0..281eaec1 100644 --- a/test/MediatR.CommandQuery.MongoDB.Tests/DatabaseFixture.cs +++ b/test/MediatR.CommandQuery.MongoDB.Tests/DatabaseFixture.cs @@ -1,126 +1,36 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Reflection; - -using KickStart; - using MediatR.CommandQuery.Definitions; -using MediatR.CommandQuery.MongoDB.Tests.Data.Entities; -using MediatR.CommandQuery.MongoDB.Tests.Logging; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection.Extensions; -using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Hosting; using MongoDB.Abstracts; -using MongoDB.Driver; -using Xunit.Abstractions; +using XUnit.Hosting; namespace MediatR.CommandQuery.MongoDB.Tests; -public class DatabaseFixture : IDisposable +public class DatabaseFixture : TestHostFixture { - private readonly ILogger _logger; - - public DatabaseFixture() + protected override void ConfigureServices(HostBuilderContext context, IServiceCollection services) { - var enviromentName = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT") ?? "Test"; - var builder = new Microsoft.Extensions.Configuration.ConfigurationBuilder() - .AddJsonFile("appsettings.json") - .AddJsonFile($"appsettings.{enviromentName}.json", true); + services.AddHostedService(); - Configuration = builder.Build(); - ConnectionString = Configuration.GetConnectionString(ConnectionName); + services.TryAddTransient, MockTenantResolver>(); - var services = new ServiceCollection(); - services.AddSingleton(p => Configuration); - services.AddLogging(f => + services.AddSingleton(sp => { - f.SetMinimumLevel(LogLevel.Trace); - f.AddMemory(); - f.AddFilter("Microsoft", LogLevel.Information); - f.AddFilter("System", LogLevel.Warning); + var configuration = sp.GetRequiredService(); + var connectionString = configuration.GetConnectionString("Tracker"); + return MongoFactory.GetDatabaseFromConnectionString(connectionString); }); - services.AddOptions(); - - services.TryAddTransient, MockTenantResolver>(); - - services.AddSingleton(s => MongoFactory.GetDatabaseFromConnectionString(ConnectionString)); services.AddSingleton(typeof(IMongoEntityRepository<>), typeof(MongoEntityRepository<>)); services.AddAutoMapper(typeof(DatabaseFixture).Assembly); services.AddMediator(); services.AddValidatorsFromAssembly(); - services.KickStart(config => config - .IncludeAssemblyFor() - .IncludeAssemblyFor() - .Data("configuration", Configuration) - .Data("hostProcess", "test") - .UseStartupTask() - ); - - ServiceProvider = services.BuildServiceProvider(); - - var factory = ServiceProvider.GetService(); - _logger = factory.CreateLogger(); - - CreateDatabase(); - } - - - public string ConnectionString { get; set; } - - public string ConnectionName { get; set; } = "Tracker"; - - public IConfigurationRoot Configuration { get; } - - public IServiceProvider ServiceProvider { get; } - - - private void CreateDatabase() - { - var priorityRepository = ServiceProvider.GetRequiredService>(); - priorityRepository.Upsert(Constants.PriorityConstants.High); - priorityRepository.Upsert(Constants.PriorityConstants.Normal); - priorityRepository.Upsert(Constants.PriorityConstants.Low); - - var statusRepository = ServiceProvider.GetRequiredService>(); - statusRepository.Upsert(Constants.StatusConstants.NotStarted); - statusRepository.Upsert(Constants.StatusConstants.InProgress); - statusRepository.Upsert(Constants.StatusConstants.Completed); - statusRepository.Upsert(Constants.StatusConstants.Blocked); - statusRepository.Upsert(Constants.StatusConstants.Deferred); - statusRepository.Upsert(Constants.StatusConstants.Done); - - var tenantRepository = ServiceProvider.GetRequiredService>(); - tenantRepository.Upsert(Constants.TenantConstants.Test); - - var userRepository = ServiceProvider.GetRequiredService>(); - userRepository.Upsert(Constants.UserConstants.WilliamAdama); - userRepository.Upsert(Constants.UserConstants.LauraRoslin); - userRepository.Upsert(Constants.UserConstants.KaraThrace); - userRepository.Upsert(Constants.UserConstants.LeeAdama); - userRepository.Upsert(Constants.UserConstants.GaiusBaltar); - userRepository.Upsert(Constants.UserConstants.SaulTigh); - } - - - public void Report(ITestOutputHelper output) - { - var logs = MemoryLoggerProvider.Current.LogEntries.ToList(); - - foreach (var log in logs) - output.WriteLine(log.ToString()); - - // reset logger - MemoryLoggerProvider.Current.Clear(); - } - - public void Dispose() - { + services.AddMediatRCommandQueryMongoDBTests(); } } diff --git a/test/MediatR.CommandQuery.MongoDB.Tests/DatabaseInitializer.cs b/test/MediatR.CommandQuery.MongoDB.Tests/DatabaseInitializer.cs new file mode 100644 index 00000000..3945d0e8 --- /dev/null +++ b/test/MediatR.CommandQuery.MongoDB.Tests/DatabaseInitializer.cs @@ -0,0 +1,58 @@ +using System; +using System.Threading; + +using MediatR.CommandQuery.MongoDB.Tests.Data.Entities; + +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; +using Microsoft.Extensions.Logging; + +using MongoDB.Abstracts; + +using Task = System.Threading.Tasks.Task; + +namespace MediatR.CommandQuery.MongoDB.Tests; + +public class DatabaseInitializer : IHostedService +{ + private readonly ILogger _logger; + private readonly IServiceProvider _serviceProvider; + + public DatabaseInitializer(ILogger logger, IServiceProvider serviceProvider) + { + _logger = logger; + _serviceProvider = serviceProvider; + } + + public async Task StartAsync(CancellationToken cancellationToken) + { + var priorityRepository = _serviceProvider.GetRequiredService>(); + await priorityRepository.UpsertAsync(Constants.PriorityConstants.High, cancellationToken); + await priorityRepository.UpsertAsync(Constants.PriorityConstants.Normal, cancellationToken); + await priorityRepository.UpsertAsync(Constants.PriorityConstants.Low, cancellationToken); + + var statusRepository = _serviceProvider.GetRequiredService>(); + await statusRepository.UpsertAsync(Constants.StatusConstants.NotStarted, cancellationToken); + await statusRepository.UpsertAsync(Constants.StatusConstants.InProgress, cancellationToken); + await statusRepository.UpsertAsync(Constants.StatusConstants.Completed, cancellationToken); + await statusRepository.UpsertAsync(Constants.StatusConstants.Blocked, cancellationToken); + await statusRepository.UpsertAsync(Constants.StatusConstants.Deferred, cancellationToken); + await statusRepository.UpsertAsync(Constants.StatusConstants.Done, cancellationToken); + + var tenantRepository = _serviceProvider.GetRequiredService>(); + await tenantRepository.UpsertAsync(Constants.TenantConstants.Test, cancellationToken); + + var userRepository = _serviceProvider.GetRequiredService>(); + await userRepository.UpsertAsync(Constants.UserConstants.WilliamAdama, cancellationToken); + await userRepository.UpsertAsync(Constants.UserConstants.LauraRoslin, cancellationToken); + await userRepository.UpsertAsync(Constants.UserConstants.KaraThrace, cancellationToken); + await userRepository.UpsertAsync(Constants.UserConstants.LeeAdama, cancellationToken); + await userRepository.UpsertAsync(Constants.UserConstants.GaiusBaltar, cancellationToken); + await userRepository.UpsertAsync(Constants.UserConstants.SaulTigh, cancellationToken); + } + + public Task StopAsync(CancellationToken cancellationToken) + { + return Task.CompletedTask; + } +} diff --git a/test/MediatR.CommandQuery.MongoDB.Tests/DatabaseTestBase.cs b/test/MediatR.CommandQuery.MongoDB.Tests/DatabaseTestBase.cs index 547b9f03..1325eccc 100644 --- a/test/MediatR.CommandQuery.MongoDB.Tests/DatabaseTestBase.cs +++ b/test/MediatR.CommandQuery.MongoDB.Tests/DatabaseTestBase.cs @@ -1,30 +1,19 @@ using System; -using Xunit; using Xunit.Abstractions; +using XUnit.Hosting; + namespace MediatR.CommandQuery.MongoDB.Tests; [Collection(DatabaseCollection.CollectionName)] -public abstract class DatabaseTestBase : IDisposable +public abstract class DatabaseTestBase : TestHostBase { protected DatabaseTestBase(ITestOutputHelper output, DatabaseFixture databaseFixture) + : base(output, databaseFixture) { - Output = output; - Fixture = databaseFixture; - Fixture?.Report(Output); } + public IServiceProvider ServiceProvider => Fixture.Services; - public ITestOutputHelper Output { get; } - - public DatabaseFixture Fixture { get; } - - public IServiceProvider ServiceProvider => Fixture?.ServiceProvider; - - - public void Dispose() - { - Fixture?.Report(Output); - } } diff --git a/test/MediatR.CommandQuery.MongoDB.Tests/Domain/Audit/AuditServiceRegistration.cs b/test/MediatR.CommandQuery.MongoDB.Tests/Domain/Audit/AuditServiceRegistration.cs index b4823fb1..63d08abc 100644 --- a/test/MediatR.CommandQuery.MongoDB.Tests/Domain/Audit/AuditServiceRegistration.cs +++ b/test/MediatR.CommandQuery.MongoDB.Tests/Domain/Audit/AuditServiceRegistration.cs @@ -1,7 +1,3 @@ -using System.Collections.Generic; - -using KickStart.DependencyInjection; - using MediatR.CommandQuery.MongoDB.Tests.Data.Entities; using MediatR.CommandQuery.MongoDB.Tests.Domain.Models; @@ -12,9 +8,10 @@ // ReSharper disable once CheckNamespace namespace MediatR.CommandQuery.MongoDB.Tests.Domain; -public class AuditServiceRegistration : IDependencyInjectionRegistration +public class AuditServiceRegistration { - public void Register(IServiceCollection services, IDictionary data) + [RegisterServices] + public void Register(IServiceCollection services) { services.AddEntityQueries, Audit, string, AuditReadModel>(); services.AddEntityCommands, Audit, string, AuditReadModel, AuditCreateModel, AuditUpdateModel>(); diff --git a/test/MediatR.CommandQuery.MongoDB.Tests/Domain/Priority/PriorityServiceRegistration.cs b/test/MediatR.CommandQuery.MongoDB.Tests/Domain/Priority/PriorityServiceRegistration.cs index 86b64016..936cd5c7 100644 --- a/test/MediatR.CommandQuery.MongoDB.Tests/Domain/Priority/PriorityServiceRegistration.cs +++ b/test/MediatR.CommandQuery.MongoDB.Tests/Domain/Priority/PriorityServiceRegistration.cs @@ -1,7 +1,3 @@ -using System.Collections.Generic; - -using KickStart.DependencyInjection; - using MediatR.CommandQuery.MongoDB.Tests.Domain.Models; using Microsoft.Extensions.DependencyInjection; @@ -11,9 +7,10 @@ // ReSharper disable once CheckNamespace namespace MediatR.CommandQuery.MongoDB.Tests.Domain; -public class PriorityServiceRegistration : IDependencyInjectionRegistration +public class PriorityServiceRegistration { - public void Register(IServiceCollection services, IDictionary data) + [RegisterServices] + public void Register(IServiceCollection services) { services.AddEntityQueries, Data.Entities.Priority, string, PriorityReadModel>(); services.AddEntityCommands, Data.Entities.Priority, string, PriorityReadModel, PriorityCreateModel, PriorityUpdateModel>(); diff --git a/test/MediatR.CommandQuery.MongoDB.Tests/Domain/Role/RoleServiceRegistration.cs b/test/MediatR.CommandQuery.MongoDB.Tests/Domain/Role/RoleServiceRegistration.cs index 0bb7bd75..3bf35cc5 100644 --- a/test/MediatR.CommandQuery.MongoDB.Tests/Domain/Role/RoleServiceRegistration.cs +++ b/test/MediatR.CommandQuery.MongoDB.Tests/Domain/Role/RoleServiceRegistration.cs @@ -1,7 +1,3 @@ -using System.Collections.Generic; - -using KickStart.DependencyInjection; - using MediatR.CommandQuery.MongoDB.Tests.Domain.Models; using Microsoft.Extensions.DependencyInjection; @@ -11,9 +7,10 @@ // ReSharper disable once CheckNamespace namespace MediatR.CommandQuery.MongoDB.Tests.Domain; -public class RoleServiceRegistration : IDependencyInjectionRegistration +public class RoleServiceRegistration { - public void Register(IServiceCollection services, IDictionary data) + [RegisterServices] + public void Register(IServiceCollection services) { services.AddEntityQueries, Data.Entities.Role, string, RoleReadModel>(); services.AddEntityCommands, Data.Entities.Role, string, RoleReadModel, RoleCreateModel, RoleUpdateModel>(); diff --git a/test/MediatR.CommandQuery.MongoDB.Tests/Domain/Status/StatusServiceRegistration.cs b/test/MediatR.CommandQuery.MongoDB.Tests/Domain/Status/StatusServiceRegistration.cs index 4a35b1c4..456b9bc8 100644 --- a/test/MediatR.CommandQuery.MongoDB.Tests/Domain/Status/StatusServiceRegistration.cs +++ b/test/MediatR.CommandQuery.MongoDB.Tests/Domain/Status/StatusServiceRegistration.cs @@ -1,8 +1,3 @@ -using System; -using System.Collections.Generic; - -using KickStart.DependencyInjection; - using MediatR.CommandQuery.MongoDB.Tests.Domain.Models; using Microsoft.Extensions.DependencyInjection; @@ -12,9 +7,10 @@ // ReSharper disable once CheckNamespace namespace MediatR.CommandQuery.MongoDB.Tests.Domain; -public class StatusServiceRegistration : IDependencyInjectionRegistration +public class StatusServiceRegistration { - public void Register(IServiceCollection services, IDictionary data) + [RegisterServices] + public void Register(IServiceCollection services) { services.AddEntityQueries, Data.Entities.Status, string, StatusReadModel>(); services.AddEntityCommands, Data.Entities.Status, string, StatusReadModel, StatusCreateModel, StatusUpdateModel>(); diff --git a/test/MediatR.CommandQuery.MongoDB.Tests/Domain/Task/TaskServiceRegistration.cs b/test/MediatR.CommandQuery.MongoDB.Tests/Domain/Task/TaskServiceRegistration.cs index 6524bb75..49ba2e8b 100644 --- a/test/MediatR.CommandQuery.MongoDB.Tests/Domain/Task/TaskServiceRegistration.cs +++ b/test/MediatR.CommandQuery.MongoDB.Tests/Domain/Task/TaskServiceRegistration.cs @@ -1,7 +1,3 @@ -using System.Collections.Generic; - -using KickStart.DependencyInjection; - using MediatR.CommandQuery.MongoDB.Tests.Domain.Handlers; using MediatR.CommandQuery.MongoDB.Tests.Domain.Models; using MediatR.CommandQuery.Notifications; @@ -13,9 +9,10 @@ // ReSharper disable once CheckNamespace namespace MediatR.CommandQuery.MongoDB.Tests.Domain; -public class TaskServiceRegistration : IDependencyInjectionRegistration +public class TaskServiceRegistration { - public void Register(IServiceCollection services, IDictionary data) + [RegisterServices] + public void Register(IServiceCollection services) { services.AddEntityQueries, Data.Entities.Task, string, TaskReadModel>(); services.AddEntityCommands, Data.Entities.Task, string, TaskReadModel, TaskCreateModel, TaskUpdateModel>(); diff --git a/test/MediatR.CommandQuery.MongoDB.Tests/Domain/Tenant/TenantServiceRegistration.cs b/test/MediatR.CommandQuery.MongoDB.Tests/Domain/Tenant/TenantServiceRegistration.cs index cfa36733..041a0a0c 100644 --- a/test/MediatR.CommandQuery.MongoDB.Tests/Domain/Tenant/TenantServiceRegistration.cs +++ b/test/MediatR.CommandQuery.MongoDB.Tests/Domain/Tenant/TenantServiceRegistration.cs @@ -1,8 +1,3 @@ -using System; -using System.Collections.Generic; - -using KickStart.DependencyInjection; - using MediatR.CommandQuery.MongoDB.Tests.Domain.Models; using Microsoft.Extensions.DependencyInjection; @@ -12,9 +7,10 @@ // ReSharper disable once CheckNamespace namespace MediatR.CommandQuery.MongoDB.Tests.Domain; -public class TenantServiceRegistration : IDependencyInjectionRegistration +public class TenantServiceRegistration { - public void Register(IServiceCollection services, IDictionary data) + [RegisterServices] + public void Register(IServiceCollection services) { services.AddEntityQueries, Data.Entities.Tenant, string, TenantReadModel>(); services.AddEntityCommands, Data.Entities.Tenant, string, TenantReadModel, TenantCreateModel, TenantUpdateModel>(); diff --git a/test/MediatR.CommandQuery.MongoDB.Tests/Domain/User/UserServiceRegistration.cs b/test/MediatR.CommandQuery.MongoDB.Tests/Domain/User/UserServiceRegistration.cs index 9cc2064d..3018c830 100644 --- a/test/MediatR.CommandQuery.MongoDB.Tests/Domain/User/UserServiceRegistration.cs +++ b/test/MediatR.CommandQuery.MongoDB.Tests/Domain/User/UserServiceRegistration.cs @@ -1,7 +1,3 @@ -using System.Collections.Generic; - -using KickStart.DependencyInjection; - using MediatR.CommandQuery.MongoDB.Tests.Domain.Models; using Microsoft.Extensions.DependencyInjection; @@ -11,9 +7,10 @@ // ReSharper disable once CheckNamespace namespace MediatR.CommandQuery.MongoDB.Tests.Domain; -public class UserServiceRegistration : IDependencyInjectionRegistration +public class UserServiceRegistration { - public void Register(IServiceCollection services, IDictionary data) + [RegisterServices] + public void Register(IServiceCollection services) { services.AddEntityQueries, Data.Entities.User, string, UserReadModel>(); services.AddEntityCommands, Data.Entities.User, string, UserReadModel, UserCreateModel, UserUpdateModel>(); diff --git a/test/MediatR.CommandQuery.MongoDB.Tests/Domain/UserLogin/UserLoginServiceRegistration.cs b/test/MediatR.CommandQuery.MongoDB.Tests/Domain/UserLogin/UserLoginServiceRegistration.cs index 317716c8..8d075374 100644 --- a/test/MediatR.CommandQuery.MongoDB.Tests/Domain/UserLogin/UserLoginServiceRegistration.cs +++ b/test/MediatR.CommandQuery.MongoDB.Tests/Domain/UserLogin/UserLoginServiceRegistration.cs @@ -1,7 +1,3 @@ -using System.Collections.Generic; - -using KickStart.DependencyInjection; - using MediatR.CommandQuery.MongoDB.Tests.Domain.Models; using Microsoft.Extensions.DependencyInjection; @@ -11,9 +7,10 @@ // ReSharper disable once CheckNamespace namespace MediatR.CommandQuery.MongoDB.Tests.Domain; -public class UserLoginServiceRegistration : IDependencyInjectionRegistration +public class UserLoginServiceRegistration { - public void Register(IServiceCollection services, IDictionary data) + [RegisterServices] + public void Register(IServiceCollection services) { services.AddEntityQueries, Data.Entities.UserLogin, string, UserLoginReadModel>(); } diff --git a/test/MediatR.CommandQuery.MongoDB.Tests/GlobalUsings.cs b/test/MediatR.CommandQuery.MongoDB.Tests/GlobalUsings.cs new file mode 100644 index 00000000..ea463bf8 --- /dev/null +++ b/test/MediatR.CommandQuery.MongoDB.Tests/GlobalUsings.cs @@ -0,0 +1,3 @@ +global using FluentAssertions; +global using Injectio.Attributes; +global using Xunit; diff --git a/test/MediatR.CommandQuery.MongoDB.Tests/Logging/LogEntry.cs b/test/MediatR.CommandQuery.MongoDB.Tests/Logging/LogEntry.cs deleted file mode 100644 index 0ec1b72b..00000000 --- a/test/MediatR.CommandQuery.MongoDB.Tests/Logging/LogEntry.cs +++ /dev/null @@ -1,58 +0,0 @@ -using System; -using System.Text; - -using Microsoft.Extensions.Logging; - -namespace MediatR.CommandQuery.MongoDB.Tests.Logging; - -public class LogEntry -{ - public LogEntry( - string category, - LogLevel logLevel, - EventId eventId, - object state, - Exception exception, - string message) - { - Timestamp = DateTimeOffset.Now; - LogLevel = logLevel; - EventId = eventId; - State = state; - Exception = exception; - Message = message; - Category = category; - } - - public DateTimeOffset Timestamp { get; } - - public string Category { get; } - - public EventId EventId { get; } - - public Exception Exception { get; } - - public LogLevel LogLevel { get; } - - public string Message { get; } - - public object State { get; } - - public override string ToString() - { - var builder = new StringBuilder(); - builder - .Append(Timestamp.ToString("HH:mm:ss.fff")) - .Append(" [") - .Append(LogLevel.ToString()) - .Append("] ") - .Append(Category) - .Append(": ") - .Append(Message); - - if (Exception != null) - builder.AppendLine().AppendLine(Exception.ToString()); - - return builder.ToString(); - } -} diff --git a/test/MediatR.CommandQuery.MongoDB.Tests/Logging/MemoryLogger.cs b/test/MediatR.CommandQuery.MongoDB.Tests/Logging/MemoryLogger.cs deleted file mode 100644 index 8d73f6af..00000000 --- a/test/MediatR.CommandQuery.MongoDB.Tests/Logging/MemoryLogger.cs +++ /dev/null @@ -1,35 +0,0 @@ -using System; - -using Microsoft.Extensions.Logging; - -namespace MediatR.CommandQuery.MongoDB.Tests.Logging; - -public class MemoryLogger : ILogger -{ - private readonly MemoryLoggerProvider _provider; - private readonly string _categoryName; - - public MemoryLogger(MemoryLoggerProvider provider, string categoryName) - { - _provider = provider; - _categoryName = categoryName; - } - - public IDisposable BeginScope(TState state) - { - return _provider.ScopeProvider?.Push(state); - } - - public bool IsEnabled(LogLevel logLevel) - { - return true; - } - - public void Log(LogLevel logLevel, EventId eventId, TState state, Exception exception, Func formatter) - { - var message = formatter(state, exception); - var logEvent = new LogEntry(_categoryName, logLevel, eventId, state, exception, message); - - _provider.WriteLog(logEvent); - } -} diff --git a/test/MediatR.CommandQuery.MongoDB.Tests/Logging/MemoryLoggerFactoryExtensions.cs b/test/MediatR.CommandQuery.MongoDB.Tests/Logging/MemoryLoggerFactoryExtensions.cs deleted file mode 100644 index 3c7d4c3a..00000000 --- a/test/MediatR.CommandQuery.MongoDB.Tests/Logging/MemoryLoggerFactoryExtensions.cs +++ /dev/null @@ -1,15 +0,0 @@ -using System; - -using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.Logging; - -namespace MediatR.CommandQuery.MongoDB.Tests.Logging; - -public static class MemoryLoggerFactoryExtensions -{ - public static ILoggingBuilder AddMemory(this ILoggingBuilder builder) - { - builder.Services.AddSingleton(s => MemoryLoggerProvider.Current); - return builder; - } -} diff --git a/test/MediatR.CommandQuery.MongoDB.Tests/Logging/MemoryLoggerProvider.cs b/test/MediatR.CommandQuery.MongoDB.Tests/Logging/MemoryLoggerProvider.cs deleted file mode 100644 index 35ae6390..00000000 --- a/test/MediatR.CommandQuery.MongoDB.Tests/Logging/MemoryLoggerProvider.cs +++ /dev/null @@ -1,50 +0,0 @@ -using System; -using System.Collections.Concurrent; -using System.Collections.Generic; -using System.Linq; - -using Microsoft.Extensions.Logging; - -namespace MediatR.CommandQuery.MongoDB.Tests.Logging; - -[ProviderAlias("Memory")] -public class MemoryLoggerProvider : ILoggerProvider, ISupportExternalScope -{ - private readonly ConcurrentQueue _logEntries = new ConcurrentQueue(); - - - public IExternalScopeProvider ScopeProvider { get; private set; } - - public IReadOnlyList LogEntries => _logEntries.ToList(); - - - public ILogger CreateLogger(string categoryName) - { - return new MemoryLogger(this, categoryName); - } - - public void WriteLog(LogEntry logEntry) - { - _logEntries.Enqueue(logEntry); - } - - public void Clear() - { - _logEntries.Clear(); - } - - public void Dispose() - { - _logEntries.Clear(); - } - - void ISupportExternalScope.SetScopeProvider(IExternalScopeProvider scopeProvider) - { - ScopeProvider = scopeProvider; - } - - - private static readonly Lazy _current = new Lazy(); - - public static MemoryLoggerProvider Current => _current.Value; -} diff --git a/test/MediatR.CommandQuery.MongoDB.Tests/MediatR.CommandQuery.MongoDB.Tests.csproj b/test/MediatR.CommandQuery.MongoDB.Tests/MediatR.CommandQuery.MongoDB.Tests.csproj index 40925661..ad7efca9 100644 --- a/test/MediatR.CommandQuery.MongoDB.Tests/MediatR.CommandQuery.MongoDB.Tests.csproj +++ b/test/MediatR.CommandQuery.MongoDB.Tests/MediatR.CommandQuery.MongoDB.Tests.csproj @@ -1,26 +1,27 @@ - net7.0 + net6.0;net7.0;net8.0 false + all runtime; build; native; contentfiles; analyzers; buildtransitive - - - - - - - - - - + + + + + + + + + + runtime; build; native; contentfiles; analyzers; buildtransitive all diff --git a/test/MediatR.CommandQuery.Tests/Commands/EntityCreateCommandTests.cs b/test/MediatR.CommandQuery.Tests/Commands/EntityCreateCommandTests.cs index 8f491a07..17de9069 100644 --- a/test/MediatR.CommandQuery.Tests/Commands/EntityCreateCommandTests.cs +++ b/test/MediatR.CommandQuery.Tests/Commands/EntityCreateCommandTests.cs @@ -1,6 +1,6 @@ using System; -using DataGenerator; +using Bogus; using FluentAssertions; @@ -23,7 +23,18 @@ public void ConstructorNullModel() [Fact] public void ConstructorWithModel() { - var createModel = Generator.Default.Single(); + var generator = new Faker() + .RuleFor(p => p.Name, (faker, model) => faker.Company.CompanyName()) + .RuleFor(p => p.Description, (faker, model) => faker.Lorem.Sentence()) + .RuleFor(p => p.AddressLine1, (faker, model) => faker.Address.StreetAddress()) + .RuleFor(p => p.AddressLine2, (faker, model) => faker.Address.SecondaryAddress()) + .RuleFor(p => p.City, (faker, model) => faker.Address.City()) + .RuleFor(p => p.StateProvince, (faker, model) => faker.Address.StateAbbr()) + .RuleFor(p => p.PostalCode, (faker, model) => faker.Address.ZipCode()) + .RuleFor(p => p.Latitude, (faker, model) => (decimal)faker.Address.Latitude()) + .RuleFor(p => p.Longitude, (faker, model) => (decimal)faker.Address.Longitude()); + + var createModel = generator.Generate(); createModel.Should().NotBeNull(); var createCommand = new EntityCreateCommand(MockPrincipal.Default, createModel); diff --git a/test/MediatR.CommandQuery.Tests/Commands/EntityUpdateCommandTests.cs b/test/MediatR.CommandQuery.Tests/Commands/EntityUpdateCommandTests.cs index 3c957f94..83bf16c4 100644 --- a/test/MediatR.CommandQuery.Tests/Commands/EntityUpdateCommandTests.cs +++ b/test/MediatR.CommandQuery.Tests/Commands/EntityUpdateCommandTests.cs @@ -1,6 +1,6 @@ using System; -using DataGenerator; +using Bogus; using FluentAssertions; @@ -24,7 +24,18 @@ public void ConstructorNullModel() public void ConstructorWithModel() { var id = Guid.NewGuid(); - var updateModel = Generator.Default.Single(); + var generator = new Faker() + .RuleFor(p => p.Name, (faker, model) => faker.Company.CompanyName()) + .RuleFor(p => p.Description, (faker, model) => faker.Lorem.Sentence()) + .RuleFor(p => p.AddressLine1, (faker, model) => faker.Address.StreetAddress()) + .RuleFor(p => p.AddressLine2, (faker, model) => faker.Address.SecondaryAddress()) + .RuleFor(p => p.City, (faker, model) => faker.Address.City()) + .RuleFor(p => p.StateProvince, (faker, model) => faker.Address.StateAbbr()) + .RuleFor(p => p.PostalCode, (faker, model) => faker.Address.ZipCode()) + .RuleFor(p => p.Latitude, (faker, model) => (decimal)faker.Address.Latitude()) + .RuleFor(p => p.Longitude, (faker, model) => (decimal)faker.Address.Longitude()); + + var updateModel = generator.Generate(); updateModel.Should().NotBeNull(); var updateCommand = new EntityUpdateCommand(MockPrincipal.Default, id, updateModel); diff --git a/test/MediatR.CommandQuery.Tests/Extensions/QueryExtensionsTests.cs b/test/MediatR.CommandQuery.Tests/Extensions/QueryExtensionsTests.cs index 4089ffaf..fd235ca3 100644 --- a/test/MediatR.CommandQuery.Tests/Extensions/QueryExtensionsTests.cs +++ b/test/MediatR.CommandQuery.Tests/Extensions/QueryExtensionsTests.cs @@ -4,6 +4,8 @@ using System.Linq.Dynamic.Core; using System.Linq.Dynamic.Core.Exceptions; +using Bogus; + using FluentAssertions; using MediatR.CommandQuery.Extensions; @@ -19,7 +21,12 @@ public class QueryExtensionsTests [Fact] public void PageNormal() { - var fruits = DataGenerator.Generator.Default.List(20); + var generator = new Faker() + .RuleFor(p => p.Id, (faker, model) => Guid.NewGuid()) + .RuleFor(p => p.Name, (faker, model) => faker.Name.FirstName()) + .RuleFor(p => p.Rank, (faker, model) => faker.Random.Int(1, 10)); + + var fruits = generator.Generate(20); fruits.Should().NotBeEmpty(); var list = fruits @@ -34,7 +41,12 @@ public void PageNormal() [Fact] public void PageNextPage() { - var fruits = DataGenerator.Generator.Default.List(20); + var generator = new Faker() + .RuleFor(p => p.Id, (faker, model) => Guid.NewGuid()) + .RuleFor(p => p.Name, (faker, model) => faker.Name.FirstName()) + .RuleFor(p => p.Rank, (faker, model) => faker.Random.Int(1, 10)); + + var fruits = generator.Generate(20); fruits.Should().NotBeEmpty(); var list = fruits @@ -51,7 +63,12 @@ public void PageNextPage() [Fact] public void PageNextPageOutOfRange() { - var fruits = DataGenerator.Generator.Default.List(20); + var generator = new Faker() + .RuleFor(p => p.Id, (faker, model) => Guid.NewGuid()) + .RuleFor(p => p.Name, (faker, model) => faker.Name.FirstName()) + .RuleFor(p => p.Rank, (faker, model) => faker.Random.Int(1, 10)); + + var fruits = generator.Generate(20); fruits.Should().NotBeEmpty(); var list = fruits @@ -65,7 +82,12 @@ public void PageNextPageOutOfRange() [Fact] public void PageIndexOutOfRange() { - var fruits = DataGenerator.Generator.Default.List(20); + var generator = new Faker() + .RuleFor(p => p.Id, (faker, model) => Guid.NewGuid()) + .RuleFor(p => p.Name, (faker, model) => faker.Name.FirstName()) + .RuleFor(p => p.Rank, (faker, model) => faker.Random.Int(1, 10)); + + var fruits = generator.Generate(20); fruits.Should().NotBeEmpty(); Action act = () => fruits diff --git a/test/MediatR.CommandQuery.Tests/GlobalUsings.cs b/test/MediatR.CommandQuery.Tests/GlobalUsings.cs new file mode 100644 index 00000000..7b25dddc --- /dev/null +++ b/test/MediatR.CommandQuery.Tests/GlobalUsings.cs @@ -0,0 +1,2 @@ +global using FluentAssertions; +global using Xunit; diff --git a/test/MediatR.CommandQuery.Tests/MediatR.CommandQuery.Tests.csproj b/test/MediatR.CommandQuery.Tests/MediatR.CommandQuery.Tests.csproj index 5be7e0d4..e083f320 100644 --- a/test/MediatR.CommandQuery.Tests/MediatR.CommandQuery.Tests.csproj +++ b/test/MediatR.CommandQuery.Tests/MediatR.CommandQuery.Tests.csproj @@ -1,20 +1,20 @@ - net7.0 + net6.0;net7.0;net8.0 false + all runtime; build; native; contentfiles; analyzers; buildtransitive - - - - - + + + + all runtime; build; native; contentfiles; analyzers