From c97229e5ce53834e5eb2f3796eb6bb5b6f427e72 Mon Sep 17 00:00:00 2001 From: meysamhadeli Date: Sat, 19 Nov 2022 23:02:40 +0330 Subject: [PATCH] refactor test base --- .../TestBase/CustomWebApplicationFactory.cs | 53 +++++++++ .../TestBase/IntegrationTestBase.cs | 103 +++++------------- .../Booking/Features/CreateBookingTests.cs | 2 +- .../Aircraft/Features/CreateAircraftTests.cs | 3 +- .../Airport/Features/CreateAirportTests.cs | 2 +- .../Flight/Features/CreateFlightTests.cs | 2 +- .../Flight/Features/DeleteFlightTests.cs | 2 +- .../Features/GetAvailableFlightsTests.cs | 3 +- .../Flight/Features/GetFlightByIdTests.cs | 4 +- .../Flight/Features/UpdateFlightTests.cs | 2 +- .../Seat/Features/GetAvailableSeatsTests.cs | 2 +- .../Seat/Features/ReserveSeatTests.cs | 2 +- .../Identity/Features/RegisterNewUserTests.cs | 3 +- .../CompleteRegisterPassengerTests.cs | 2 +- .../Features/GetPassengerByIdTests.cs | 3 +- 15 files changed, 92 insertions(+), 96 deletions(-) create mode 100644 src/BuildingBlocks/TestBase/CustomWebApplicationFactory.cs diff --git a/src/BuildingBlocks/TestBase/CustomWebApplicationFactory.cs b/src/BuildingBlocks/TestBase/CustomWebApplicationFactory.cs new file mode 100644 index 0000000..53256d4 --- /dev/null +++ b/src/BuildingBlocks/TestBase/CustomWebApplicationFactory.cs @@ -0,0 +1,53 @@ +using BuildingBlocks.MassTransit; +using BuildingBlocks.Web; +using MassTransit; +using Microsoft.AspNetCore.Hosting; +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Mvc.Testing; +using Microsoft.Extensions.DependencyInjection; +using NSubstitute; + +namespace BuildingBlocks.TestBase; + +public class CustomWebApplicationFactory : WebApplicationFactory + where TEntryPoint : class +{ + public Action TestRegistrationServices { set; get; } + + protected override void ConfigureWebHost(IWebHostBuilder builder) + { + builder.UseEnvironment("test"); + builder.ConfigureServices(services => + { + TestRegistrationServices?.Invoke(services); + services.ReplaceSingleton(AddHttpContextAccessorMock); + services.AddMassTransitTestHarness(x => + { + x.UsingRabbitMq((context, cfg) => + { + var rabbitMqOptions = services.GetOptions("RabbitMq"); + var host = rabbitMqOptions.HostName; + + cfg.Host(host, h => + { + h.Username(rabbitMqOptions.UserName); + h.Password(rabbitMqOptions.Password); + }); + cfg.ConfigureEndpoints(context); + }); + }); + }); + } + + private IHttpContextAccessor AddHttpContextAccessorMock(IServiceProvider serviceProvider) + { + var httpContextAccessorMock = Substitute.For(); + using var scope = serviceProvider.CreateScope(); + httpContextAccessorMock.HttpContext = new DefaultHttpContext {RequestServices = scope.ServiceProvider}; + + httpContextAccessorMock.HttpContext.Request.Host = new HostString("localhost", 6012); + httpContextAccessorMock.HttpContext.Request.Scheme = "http"; + + return httpContextAccessorMock; + } +} diff --git a/src/BuildingBlocks/TestBase/IntegrationTestBase.cs b/src/BuildingBlocks/TestBase/IntegrationTestBase.cs index 62701e6..3dfc332 100644 --- a/src/BuildingBlocks/TestBase/IntegrationTestBase.cs +++ b/src/BuildingBlocks/TestBase/IntegrationTestBase.cs @@ -2,24 +2,17 @@ using BuildingBlocks.Core.Event; using BuildingBlocks.Core.Model; using BuildingBlocks.EFCore; -using BuildingBlocks.MassTransit; using BuildingBlocks.Mongo; using BuildingBlocks.PersistMessageProcessor; -using BuildingBlocks.Web; using DotNet.Testcontainers.Containers; using Grpc.Net.Client; -using MassTransit; using MassTransit.Testing; using MediatR; -using Microsoft.AspNetCore.Hosting; -using Microsoft.AspNetCore.Http; -using Microsoft.AspNetCore.Mvc.Testing; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Options; using Mongo2Go; -using NSubstitute; using Respawn; using Serilog; using Xunit; @@ -27,15 +20,17 @@ using Xunit.Abstractions; namespace BuildingBlocks.TestBase; -public class IntegrationTestFactory : IAsyncDisposable +public class IntegrationTestFixture : IDisposable where TEntryPoint : class { - private readonly WebApplicationFactory _factory; + private readonly CustomWebApplicationFactory _factory; + private int Timeout => 180; - public Action TestRegistrationServices { set; get; } public HttpClient HttpClient => _factory.CreateClient(); - public ITestHarness TestHarness => CreateHarness(); - public GrpcChannel Channel => CreateChannel(); + public ITestHarness TestHarness => ServiceProvider.GetTestHarness(); + + public GrpcChannel Channel => + GrpcChannel.ForAddress(HttpClient.BaseAddress!, new GrpcChannelOptions {HttpClient = HttpClient}); public IServiceProvider ServiceProvider => _factory.Services; public IConfiguration Configuration => _factory.Services.GetRequiredService(); @@ -44,43 +39,20 @@ public class IntegrationTestFactory : IAsyncDisposable public MsSqlTestcontainer SqlPersistTestContainer; public MongoDbTestcontainer MongoTestContainer; - public IntegrationTestFactory() + public IntegrationTestFixture() { - _factory = new WebApplicationFactory() - .WithWebHostBuilder(builder => - { - builder.UseEnvironment("test"); - builder.ConfigureServices(services => - { - TestRegistrationServices?.Invoke(services); - services.ReplaceSingleton(AddHttpContextAccessorMock); - services.AddMassTransitTestHarness(x => - { - x.UsingRabbitMq((context, cfg) => - { - var rabbitMqOptions = services.GetOptions("RabbitMq"); - var host = rabbitMqOptions.HostName; - - cfg.Host(host, h => - { - h.Username(rabbitMqOptions.UserName); - h.Password(rabbitMqOptions.Password); - }); - cfg.ConfigureEndpoints(context); - }); - }); - }); - }); + // Ref: https://docs.microsoft.com/en-us/aspnet/core/test/integration-tests?view=aspnetcore-6.0#basic-tests-with-the-default-webapplicationfactory + _factory = new CustomWebApplicationFactory(); } - public async ValueTask DisposeAsync() + public void Dispose() { - await _factory.DisposeAsync(); + _factory.Dispose(); } public virtual void RegisterServices(Action services) { - TestRegistrationServices = services; + _factory.TestRegistrationServices = services; } // ref: https://github.com/trbenning/serilog-sinks-xunit @@ -169,32 +141,9 @@ public class IntegrationTestFactory : IAsyncDisposable }); }); } - - private ITestHarness CreateHarness() - { - var harness = ServiceProvider.GetTestHarness(); - return harness; - } - - private GrpcChannel CreateChannel() - { - return GrpcChannel.ForAddress(HttpClient.BaseAddress!, new GrpcChannelOptions {HttpClient = HttpClient}); - } - - private IHttpContextAccessor AddHttpContextAccessorMock(IServiceProvider serviceProvider) - { - var httpContextAccessorMock = Substitute.For(); - using var scope = serviceProvider.CreateScope(); - httpContextAccessorMock.HttpContext = new DefaultHttpContext {RequestServices = scope.ServiceProvider}; - - httpContextAccessorMock.HttpContext.Request.Host = new HostString("localhost", 6012); - httpContextAccessorMock.HttpContext.Request.Scheme = "http"; - - return httpContextAccessorMock; - } } -public class IntegrationTestFactory : IntegrationTestFactory +public class IntegrationTestFixture : IntegrationTestFixture where TEntryPoint : class where TWContext : DbContext { @@ -301,7 +250,7 @@ public class IntegrationTestFactory : IntegrationTestFac } } -public class IntegrationTestFactory : IntegrationTestFactory +public class IntegrationTestFixture : IntegrationTestFixture where TEntryPoint : class where TWContext : DbContext where TRContext : MongoDbContext @@ -344,13 +293,13 @@ public class IntegrationTestFixtureCore : IAsyncLifetime set => Fixture.ServiceProvider.GetRequiredService>().Value.ConnectionString = value; } - public IntegrationTestFixtureCore(IntegrationTestFactory integrationTestFixture) + public IntegrationTestFixtureCore(IntegrationTestFixture integrationTestFixture) { Fixture = integrationTestFixture; integrationTestFixture.RegisterServices(services => RegisterTestsServices(services)); } - public IntegrationTestFactory Fixture { get; } + public IntegrationTestFixture Fixture { get; } public async Task InitializeAsync() { @@ -409,43 +358,43 @@ public class IntegrationTestFixtureCore : IAsyncLifetime } public abstract class IntegrationTestBase : IntegrationTestFixtureCore, - IClassFixture> + IClassFixture> where TEntryPoint : class { protected IntegrationTestBase( - IntegrationTestFactory integrationTestFixture) : base(integrationTestFixture) + IntegrationTestFixture integrationTestFixture) : base(integrationTestFixture) { Fixture = integrationTestFixture; } - public new IntegrationTestFactory Fixture { get; } + public IntegrationTestFixture Fixture { get; } } public abstract class IntegrationTestBase : IntegrationTestFixtureCore, - IClassFixture> + IClassFixture> where TEntryPoint : class where TWContext : DbContext { protected IntegrationTestBase( - IntegrationTestFactory integrationTestFixture) : base(integrationTestFixture) + IntegrationTestFixture integrationTestFixture) : base(integrationTestFixture) { Fixture = integrationTestFixture; } - public new IntegrationTestFactory Fixture { get; } + public IntegrationTestFixture Fixture { get; } } public abstract class IntegrationTestBase : IntegrationTestFixtureCore, - IClassFixture> + IClassFixture> where TEntryPoint : class where TWContext : DbContext where TRContext : MongoDbContext { protected IntegrationTestBase( - IntegrationTestFactory integrationTestFixture) : base(integrationTestFixture) + IntegrationTestFixture integrationTestFixture) : base(integrationTestFixture) { Fixture = integrationTestFixture; } - public new IntegrationTestFactory Fixture { get; } + public IntegrationTestFixture Fixture { get; } } diff --git a/src/Services/Booking/tests/IntegrationTest/Booking/Features/CreateBookingTests.cs b/src/Services/Booking/tests/IntegrationTest/Booking/Features/CreateBookingTests.cs index fc86a28..3e4af47 100644 --- a/src/Services/Booking/tests/IntegrationTest/Booking/Features/CreateBookingTests.cs +++ b/src/Services/Booking/tests/IntegrationTest/Booking/Features/CreateBookingTests.cs @@ -27,7 +27,7 @@ public class CreateBookingTests : IntegrationTestBase integrationTestFixture) : base( + IntegrationTestFixture integrationTestFixture) : base( integrationTestFixture) { _testHarness = Fixture.TestHarness; diff --git a/src/Services/Flight/tests/IntegrationTest/Aircraft/Features/CreateAircraftTests.cs b/src/Services/Flight/tests/IntegrationTest/Aircraft/Features/CreateAircraftTests.cs index 75e2777..932743c 100644 --- a/src/Services/Flight/tests/IntegrationTest/Aircraft/Features/CreateAircraftTests.cs +++ b/src/Services/Flight/tests/IntegrationTest/Aircraft/Features/CreateAircraftTests.cs @@ -5,7 +5,6 @@ using Flight.Aircrafts.Features.CreateAircraft.Commands.V1.Reads; using Flight.Api; using Flight.Data; using FluentAssertions; -using Grpc.Net.Client; using Integration.Test.Fakes; using MassTransit; using MassTransit.Testing; @@ -17,7 +16,7 @@ public class CreateAircraftTests : IntegrationTestBase integrationTestFixture) : base(integrationTestFixture) + public CreateAircraftTests(IntegrationTestFixture integrationTestFixture) : base(integrationTestFixture) { _testHarness = Fixture.TestHarness; } diff --git a/src/Services/Flight/tests/IntegrationTest/Airport/Features/CreateAirportTests.cs b/src/Services/Flight/tests/IntegrationTest/Airport/Features/CreateAirportTests.cs index a45134f..260644d 100644 --- a/src/Services/Flight/tests/IntegrationTest/Airport/Features/CreateAirportTests.cs +++ b/src/Services/Flight/tests/IntegrationTest/Airport/Features/CreateAirportTests.cs @@ -17,7 +17,7 @@ public class CreateAirportTests : IntegrationTestBase integrationTestFixture) : base( + IntegrationTestFixture integrationTestFixture) : base( integrationTestFixture) { _testHarness = Fixture.TestHarness; diff --git a/src/Services/Flight/tests/IntegrationTest/Flight/Features/CreateFlightTests.cs b/src/Services/Flight/tests/IntegrationTest/Flight/Features/CreateFlightTests.cs index f01cfa5..36d0d2d 100644 --- a/src/Services/Flight/tests/IntegrationTest/Flight/Features/CreateFlightTests.cs +++ b/src/Services/Flight/tests/IntegrationTest/Flight/Features/CreateFlightTests.cs @@ -17,7 +17,7 @@ public class CreateFlightTests : IntegrationTestBase integrationTestFixture) : base( + IntegrationTestFixture integrationTestFixture) : base( integrationTestFixture) { _testHarness = Fixture.TestHarness; diff --git a/src/Services/Flight/tests/IntegrationTest/Flight/Features/DeleteFlightTests.cs b/src/Services/Flight/tests/IntegrationTest/Flight/Features/DeleteFlightTests.cs index 722c22b..1e3da0b 100644 --- a/src/Services/Flight/tests/IntegrationTest/Flight/Features/DeleteFlightTests.cs +++ b/src/Services/Flight/tests/IntegrationTest/Flight/Features/DeleteFlightTests.cs @@ -20,7 +20,7 @@ public class DeleteFlightTests : IntegrationTestBase integrationTestFixture) : base( + IntegrationTestFixture integrationTestFixture) : base( integrationTestFixture) { _testHarness = Fixture.TestHarness; diff --git a/src/Services/Flight/tests/IntegrationTest/Flight/Features/GetAvailableFlightsTests.cs b/src/Services/Flight/tests/IntegrationTest/Flight/Features/GetAvailableFlightsTests.cs index fd8fe8c..293a16b 100644 --- a/src/Services/Flight/tests/IntegrationTest/Flight/Features/GetAvailableFlightsTests.cs +++ b/src/Services/Flight/tests/IntegrationTest/Flight/Features/GetAvailableFlightsTests.cs @@ -4,7 +4,6 @@ using BuildingBlocks.TestBase; using Flight.Api; using Flight.Data; using Flight.Flights.Features.CreateFlight.Commands.V1.Reads; -using Flight.Flights.Features.GetAvailableFlights; using Flight.Flights.Features.GetAvailableFlights.Queries.V1; using FluentAssertions; using Integration.Test.Fakes; @@ -15,7 +14,7 @@ namespace Integration.Test.Flight.Features; public class GetAvailableFlightsTests : IntegrationTestBase { public GetAvailableFlightsTests( - IntegrationTestFactory integrationTestFixture) + IntegrationTestFixture integrationTestFixture) : base(integrationTestFixture) { } diff --git a/src/Services/Flight/tests/IntegrationTest/Flight/Features/GetFlightByIdTests.cs b/src/Services/Flight/tests/IntegrationTest/Flight/Features/GetFlightByIdTests.cs index 2df3345..819ded5 100644 --- a/src/Services/Flight/tests/IntegrationTest/Flight/Features/GetFlightByIdTests.cs +++ b/src/Services/Flight/tests/IntegrationTest/Flight/Features/GetFlightByIdTests.cs @@ -4,9 +4,7 @@ using Flight; using Flight.Api; using Flight.Data; using Flight.Flights.Features.CreateFlight.Commands.V1.Reads; -using Flight.Flights.Features.GetFlightById; using Flight.Flights.Features.GetFlightById.Queries.V1; -using Flight.GrpcServer.Services; using FluentAssertions; using Grpc.Net.Client; using Integration.Test.Fakes; @@ -19,7 +17,7 @@ public class GetFlightByIdTests : IntegrationTestBase integrationTestFixture) : base( + IntegrationTestFixture integrationTestFixture) : base( integrationTestFixture) { _channel = Fixture.Channel; diff --git a/src/Services/Flight/tests/IntegrationTest/Flight/Features/UpdateFlightTests.cs b/src/Services/Flight/tests/IntegrationTest/Flight/Features/UpdateFlightTests.cs index 616256f..5586a1f 100644 --- a/src/Services/Flight/tests/IntegrationTest/Flight/Features/UpdateFlightTests.cs +++ b/src/Services/Flight/tests/IntegrationTest/Flight/Features/UpdateFlightTests.cs @@ -15,7 +15,7 @@ public class UpdateFlightTests : IntegrationTestBase integrationTestFixture) : base(integrationTestFixture) + public UpdateFlightTests(IntegrationTestFixture integrationTestFixture) : base(integrationTestFixture) { _testHarness = Fixture.TestHarness; } diff --git a/src/Services/Flight/tests/IntegrationTest/Seat/Features/GetAvailableSeatsTests.cs b/src/Services/Flight/tests/IntegrationTest/Seat/Features/GetAvailableSeatsTests.cs index 01c4805..7276158 100644 --- a/src/Services/Flight/tests/IntegrationTest/Seat/Features/GetAvailableSeatsTests.cs +++ b/src/Services/Flight/tests/IntegrationTest/Seat/Features/GetAvailableSeatsTests.cs @@ -16,7 +16,7 @@ public class GetAvailableSeatsTests : IntegrationTestBase integrationTestFixture) : base(integrationTestFixture) + public GetAvailableSeatsTests(IntegrationTestFixture integrationTestFixture) : base(integrationTestFixture) { _channel = Fixture.Channel; } diff --git a/src/Services/Flight/tests/IntegrationTest/Seat/Features/ReserveSeatTests.cs b/src/Services/Flight/tests/IntegrationTest/Seat/Features/ReserveSeatTests.cs index 0a79ccf..be2da07 100644 --- a/src/Services/Flight/tests/IntegrationTest/Seat/Features/ReserveSeatTests.cs +++ b/src/Services/Flight/tests/IntegrationTest/Seat/Features/ReserveSeatTests.cs @@ -17,7 +17,7 @@ public class ReserveSeatTests : IntegrationTestBase integrationTestFixture) : base( + IntegrationTestFixture integrationTestFixture) : base( integrationTestFixture) { _channel = Fixture.Channel; diff --git a/src/Services/Identity/tests/IntegrationTest/Identity/Features/RegisterNewUserTests.cs b/src/Services/Identity/tests/IntegrationTest/Identity/Features/RegisterNewUserTests.cs index 387ac9e..36cabbf 100644 --- a/src/Services/Identity/tests/IntegrationTest/Identity/Features/RegisterNewUserTests.cs +++ b/src/Services/Identity/tests/IntegrationTest/Identity/Features/RegisterNewUserTests.cs @@ -2,7 +2,6 @@ using BuildingBlocks.Contracts.EventBus.Messages; using BuildingBlocks.TestBase; using FluentAssertions; -using Grpc.Net.Client; using Identity.Api; using Identity.Data; using Integration.Test.Fakes; @@ -16,7 +15,7 @@ public class RegisterNewUserTests : IntegrationTestBase integrationTestFixture) : base(integrationTestFixture) + public RegisterNewUserTests(IntegrationTestFixture integrationTestFixture) : base(integrationTestFixture) { _testHarness = Fixture.TestHarness; } diff --git a/src/Services/Passenger/tests/IntegrationTest/Passenger/Features/CompleteRegisterPassengerTests.cs b/src/Services/Passenger/tests/IntegrationTest/Passenger/Features/CompleteRegisterPassengerTests.cs index a90ea4f..a1f2205 100644 --- a/src/Services/Passenger/tests/IntegrationTest/Passenger/Features/CompleteRegisterPassengerTests.cs +++ b/src/Services/Passenger/tests/IntegrationTest/Passenger/Features/CompleteRegisterPassengerTests.cs @@ -14,7 +14,7 @@ public class CompleteRegisterPassengerTests : IntegrationTestBase integrationTestFixture) : + public CompleteRegisterPassengerTests(IntegrationTestFixture integrationTestFixture) : base(integrationTestFixture) { _testHarness = Fixture.TestHarness; diff --git a/src/Services/Passenger/tests/IntegrationTest/Passenger/Features/GetPassengerByIdTests.cs b/src/Services/Passenger/tests/IntegrationTest/Passenger/Features/GetPassengerByIdTests.cs index bff32f5..49209bb 100644 --- a/src/Services/Passenger/tests/IntegrationTest/Passenger/Features/GetPassengerByIdTests.cs +++ b/src/Services/Passenger/tests/IntegrationTest/Passenger/Features/GetPassengerByIdTests.cs @@ -9,7 +9,6 @@ using Microsoft.Extensions.DependencyInjection; using Passenger; using Passenger.Api; using Passenger.Data; -using Passenger.Passengers.Features.GetPassengerById; using Passenger.Passengers.Features.GetPassengerById.Queries.V1; using Xunit; @@ -20,7 +19,7 @@ public class GetPassengerByIdTests : IntegrationTestBase integrationTestFixture) : base( + public GetPassengerByIdTests(IntegrationTestFixture integrationTestFixture) : base( integrationTestFixture) { _channel = Fixture.Channel;