Merge pull request #69 from meysamhadeli/develop

refactor test base
This commit is contained in:
Meysam Hadeli 2022-12-11 21:41:37 +03:30 committed by GitHub
commit f3cad79640
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
21 changed files with 77 additions and 55 deletions

View File

@ -32,7 +32,7 @@ using ILogger = Serilog.ILogger;
namespace BuildingBlocks.TestBase;
public class TestFactory<TEntryPoint> : IAsyncLifetime
public class TestFixture<TEntryPoint> : IAsyncLifetime
where TEntryPoint : class
{
private readonly WebApplicationFactory<TEntryPoint> _factory;
@ -51,7 +51,7 @@ public class TestFactory<TEntryPoint> : IAsyncLifetime
public IConfiguration Configuration => _factory?.Services.GetRequiredService<IConfiguration>();
public ILogger Logger { get; set; }
public TestFactory()
public TestFixture()
{
_factory = new WebApplicationFactory<TEntryPoint>()
.WithWebHostBuilder(builder =>
@ -258,7 +258,7 @@ public class TestFactory<TEntryPoint> : IAsyncLifetime
}
}
public class TestFactory<TEntryPoint, TWContext> : TestFactory<TEntryPoint>
public class TestWriteFixture<TEntryPoint, TWContext> : TestFixture<TEntryPoint>
where TEntryPoint : class
where TWContext : DbContext
{
@ -365,7 +365,23 @@ public class TestFactory<TEntryPoint, TWContext> : TestFactory<TEntryPoint>
}
}
public class TestFactory<TEntryPoint, TWContext, TRContext> : TestFactory<TEntryPoint, TWContext>
public class TestReadFixture<TEntryPoint, TRContext> : TestFixture<TEntryPoint>
where TEntryPoint : class
where TRContext : MongoDbContext
{
public Task ExecuteReadContextAsync(Func<TRContext, Task> action)
{
return ExecuteScopeAsync(sp => action(sp.GetRequiredService<TRContext>()));
}
public Task<T> ExecuteReadContextAsync<T>(Func<TRContext, Task<T>> action)
{
return ExecuteScopeAsync(sp => action(sp.GetRequiredService<TRContext>()));
}
}
public class TestFixture<TEntryPoint, TWContext, TRContext> : TestWriteFixture<TEntryPoint, TWContext>
where TEntryPoint : class
where TWContext : DbContext
where TRContext : MongoDbContext
@ -389,14 +405,14 @@ public class TestFixtureCore<TEntryPoint> : IAsyncLifetime
private SqlConnection DefaultDbConnection { get; set; }
private SqlConnection PersistDbConnection { get; set; }
public TestFixtureCore(TestFactory<TEntryPoint> integrationTestFixture, ITestOutputHelper outputHelper)
public TestFixtureCore(TestFixture<TEntryPoint> integrationTestFixture, ITestOutputHelper outputHelper)
{
Fixture = integrationTestFixture;
integrationTestFixture.RegisterServices(services => RegisterTestsServices(services));
integrationTestFixture.Logger = integrationTestFixture.CreateLogger(outputHelper);
}
public TestFactory<TEntryPoint> Fixture { get; }
public TestFixture<TEntryPoint> Fixture { get; }
public async Task InitializeAsync()
@ -487,18 +503,33 @@ public class TestFixtureCore<TEntryPoint> : IAsyncLifetime
}
}
public abstract class TestBase<TEntryPoint, TWContext> : TestFixtureCore<TEntryPoint>
public abstract class TestReadBase<TEntryPoint, TRContext> : TestFixtureCore<TEntryPoint>
//,IClassFixture<IntegrationTestFactory<TEntryPoint, TWContext>>
where TEntryPoint : class
where TWContext : DbContext
where TRContext : MongoDbContext
{
protected TestBase(
TestFactory<TEntryPoint, TWContext> integrationTestFixture, ITestOutputHelper outputHelper = null) : base(integrationTestFixture, outputHelper)
protected TestReadBase(
TestReadFixture<TEntryPoint, TRContext> integrationTestFixture, ITestOutputHelper outputHelper = null) : base(integrationTestFixture, outputHelper)
{
Fixture = integrationTestFixture;
}
public TestFactory<TEntryPoint, TWContext> Fixture { get; }
public TestReadFixture<TEntryPoint, TRContext> Fixture { get; }
}
public abstract class TestWriteBase<TEntryPoint, TWContext> : TestFixtureCore<TEntryPoint>
//,IClassFixture<IntegrationTestFactory<TEntryPoint, TWContext>>
where TEntryPoint : class
where TWContext : DbContext
{
protected TestWriteBase(
TestWriteFixture<TEntryPoint, TWContext> integrationTestFixture, ITestOutputHelper outputHelper = null) : base(integrationTestFixture, outputHelper)
{
Fixture = integrationTestFixture;
}
public TestWriteFixture<TEntryPoint, TWContext> Fixture { get; }
}
public abstract class TestBase<TEntryPoint, TWContext, TRContext> : TestFixtureCore<TEntryPoint>
@ -508,10 +539,10 @@ public abstract class TestBase<TEntryPoint, TWContext, TRContext> : TestFixtureC
where TRContext : MongoDbContext
{
protected TestBase(
TestFactory<TEntryPoint, TWContext, TRContext> integrationTestFixture, ITestOutputHelper outputHelper = null) : base(integrationTestFixture, outputHelper)
TestFixture<TEntryPoint, TWContext, TRContext> integrationTestFixture, ITestOutputHelper outputHelper = null) : base(integrationTestFixture, outputHelper)
{
Fixture = integrationTestFixture;
}
public TestFactory<TEntryPoint, TWContext, TRContext> Fixture { get; }
public TestFixture<TEntryPoint, TWContext, TRContext> Fixture { get; }
}

View File

@ -23,7 +23,8 @@ namespace Integration.Test.Booking.Features;
public class CreateBookingTests : BookingIntegrationTestBase
{
public CreateBookingTests(TestFactory<Program, AppDbContextBase, BookingReadDbContext> integrationTestFixture) : base(integrationTestFixture)
public CreateBookingTests(TestReadFixture<Program, BookingReadDbContext> integrationTestFixture) : base(
integrationTestFixture)
{
}
@ -41,21 +42,13 @@ public class CreateBookingTests : BookingIntegrationTestBase
var command = new FakeCreateBookingCommand().Generate();
// Act
try
{
var response = await Fixture.SendAsync(command);
// Assert
response.Should().BeGreaterOrEqualTo(0);
var response = await Fixture.SendAsync(command);
(await Fixture.WaitForPublishing<BookingCreated>()).Should().Be(true);
}
catch (Exception e)
{
Console.WriteLine(e);
throw;
}
// Assert
response.Should().BeGreaterOrEqualTo(0);
(await Fixture.WaitForPublishing<BookingCreated>()).Should().Be(true);
}

View File

@ -1,22 +1,20 @@
using Booking.Api;
using Booking.Data;
using BuildingBlocks.EFCore;
using BuildingBlocks.PersistMessageProcessor.Data;
using BuildingBlocks.TestBase;
using Xunit;
namespace Integration.Test;
[Collection(IntegrationTestCollection.Name)]
public class BookingIntegrationTestBase: TestBase<Program, AppDbContextBase, BookingReadDbContext>
public class BookingIntegrationTestBase: TestReadBase<Program, BookingReadDbContext>
{
public BookingIntegrationTestBase(TestFactory<Program, AppDbContextBase, BookingReadDbContext> integrationTestFixture) : base(integrationTestFixture)
public BookingIntegrationTestBase(TestReadFixture<Program, BookingReadDbContext> integrationTestFixture) : base(integrationTestFixture)
{
}
}
[CollectionDefinition(Name)]
public class IntegrationTestCollection : ICollectionFixture<TestFactory<Program, AppDbContextBase, BookingReadDbContext>>
public class IntegrationTestCollection : ICollectionFixture<TestReadFixture<Program, BookingReadDbContext>>
{
public const string Name = "Booking Integration Test";
}

View File

@ -12,7 +12,7 @@ namespace EndToEnd.Test.Flight.Features;
public class CreateFlightTests : FlightEndToEndTestBase
{
public CreateFlightTests(TestFactory<Program, FlightDbContext, FlightReadDbContext> integrationTestFixture) : base(integrationTestFixture)
public CreateFlightTests(TestFixture<Program, FlightDbContext, FlightReadDbContext> integrationTestFixture) : base(integrationTestFixture)
{
}

View File

@ -12,7 +12,7 @@ namespace EndToEnd.Test.Flight.Features;
public class GetFlightByIdTests: FlightEndToEndTestBase
{
public GetFlightByIdTests(TestFactory<Program, FlightDbContext, FlightReadDbContext> integrationTestFixture) : base(integrationTestFixture)
public GetFlightByIdTests(TestFixture<Program, FlightDbContext, FlightReadDbContext> integrationTestFixture) : base(integrationTestFixture)
{
}

View File

@ -8,13 +8,13 @@ namespace EndToEnd.Test;
[Collection(EndToEndTestCollection.Name)]
public class FlightEndToEndTestBase: TestBase<Program, FlightDbContext, FlightReadDbContext>
{
public FlightEndToEndTestBase(TestFactory<Program, FlightDbContext, FlightReadDbContext> integrationTestFixture) : base(integrationTestFixture)
public FlightEndToEndTestBase(TestFixture<Program, FlightDbContext, FlightReadDbContext> integrationTestFixture) : base(integrationTestFixture)
{
}
}
[CollectionDefinition(Name)]
public class EndToEndTestCollection : ICollectionFixture<TestFactory<Program, FlightDbContext, FlightReadDbContext>>
public class EndToEndTestCollection : ICollectionFixture<TestFixture<Program, FlightDbContext, FlightReadDbContext>>
{
public const string Name = "Flight EndToEnd Test";
}

View File

@ -13,7 +13,7 @@ namespace Integration.Test.Aircraft.Features;
public class CreateAircraftTests : FlightIntegrationTestBase
{
public CreateAircraftTests(
TestFactory<Program, FlightDbContext, FlightReadDbContext> integrationTestFactory) : base(integrationTestFactory)
TestFixture<Program, FlightDbContext, FlightReadDbContext> integrationTestFactory) : base(integrationTestFactory)
{
}

View File

@ -13,7 +13,7 @@ namespace Integration.Test.Airport.Features;
public class CreateAirportTests : FlightIntegrationTestBase
{
public CreateAirportTests(
TestFactory<Program, FlightDbContext, FlightReadDbContext> integrationTestFactory) : base(integrationTestFactory)
TestFixture<Program, FlightDbContext, FlightReadDbContext> integrationTestFactory) : base(integrationTestFactory)
{
}

View File

@ -13,7 +13,7 @@ namespace Integration.Test.Flight.Features;
public class CreateFlightTests : FlightIntegrationTestBase
{
public CreateFlightTests(
TestFactory<Program, FlightDbContext, FlightReadDbContext> integrationTestFactory) : base(integrationTestFactory)
TestFixture<Program, FlightDbContext, FlightReadDbContext> integrationTestFactory) : base(integrationTestFactory)
{
}

View File

@ -15,7 +15,7 @@ namespace Integration.Test.Flight.Features;
public class DeleteFlightTests : FlightIntegrationTestBase
{
public DeleteFlightTests(
TestFactory<Program, FlightDbContext, FlightReadDbContext> integrationTestFactory) : base(integrationTestFactory)
TestFixture<Program, FlightDbContext, FlightReadDbContext> integrationTestFactory) : base(integrationTestFactory)
{
}

View File

@ -14,7 +14,7 @@ namespace Integration.Test.Flight.Features;
public class GetAvailableFlightsTests : FlightIntegrationTestBase
{
public GetAvailableFlightsTests(
TestFactory<Program, FlightDbContext, FlightReadDbContext> integrationTestFactory) : base(integrationTestFactory)
TestFixture<Program, FlightDbContext, FlightReadDbContext> integrationTestFactory) : base(integrationTestFactory)
{
}

View File

@ -14,7 +14,7 @@ namespace Integration.Test.Flight.Features;
public class GetFlightByIdTests : FlightIntegrationTestBase
{
public GetFlightByIdTests(
TestFactory<Program, FlightDbContext, FlightReadDbContext> integrationTestFactory) : base(integrationTestFactory)
TestFixture<Program, FlightDbContext, FlightReadDbContext> integrationTestFactory) : base(integrationTestFactory)
{
}

View File

@ -13,7 +13,7 @@ namespace Integration.Test.Flight.Features;
public class UpdateFlightTests : FlightIntegrationTestBase
{
public UpdateFlightTests(
TestFactory<Program, FlightDbContext, FlightReadDbContext> integrationTestFactory) : base(integrationTestFactory)
TestFixture<Program, FlightDbContext, FlightReadDbContext> integrationTestFactory) : base(integrationTestFactory)
{
}

View File

@ -8,13 +8,13 @@ namespace Integration.Test;
[Collection(IntegrationTestCollection.Name)]
public class FlightIntegrationTestBase: TestBase<Program, FlightDbContext, FlightReadDbContext>
{
public FlightIntegrationTestBase(TestFactory<Program, FlightDbContext, FlightReadDbContext> integrationTestFixture) : base(integrationTestFixture)
public FlightIntegrationTestBase(TestFixture<Program, FlightDbContext, FlightReadDbContext> integrationTestFixture) : base(integrationTestFixture)
{
}
}
[CollectionDefinition(Name)]
public class IntegrationTestCollection : ICollectionFixture<TestFactory<Program, FlightDbContext, FlightReadDbContext>>
public class IntegrationTestCollection : ICollectionFixture<TestFixture<Program, FlightDbContext, FlightReadDbContext>>
{
public const string Name = "Flight Integration Test";
}

View File

@ -14,7 +14,7 @@ namespace Integration.Test.Seat.Features;
public class GetAvailableSeatsTests : FlightIntegrationTestBase
{
public GetAvailableSeatsTests(
TestFactory<Program, FlightDbContext, FlightReadDbContext> integrationTestFactory) : base(integrationTestFactory)
TestFixture<Program, FlightDbContext, FlightReadDbContext> integrationTestFactory) : base(integrationTestFactory)
{
}

View File

@ -14,7 +14,7 @@ namespace Integration.Test.Seat.Features;
public class ReserveSeatTests : FlightIntegrationTestBase
{
public ReserveSeatTests(
TestFactory<Program, FlightDbContext, FlightReadDbContext> integrationTestFactory) : base(integrationTestFactory)
TestFixture<Program, FlightDbContext, FlightReadDbContext> integrationTestFactory) : base(integrationTestFactory)
{
}

View File

@ -12,7 +12,7 @@ namespace Integration.Test.Identity.Features;
public class RegisterNewUserTests : IdentityIntegrationTestBase
{
public RegisterNewUserTests(
TestFactory<Program, IdentityContext> integrationTestFactory) : base(integrationTestFactory)
TestWriteFixture<Program, IdentityContext> integrationTestFactory) : base(integrationTestFactory)
{
}

View File

@ -6,16 +6,16 @@ using Xunit;
namespace Integration.Test;
[Collection(IntegrationTestCollection.Name)]
public class IdentityIntegrationTestBase: TestBase<Program, IdentityContext>
public class IdentityIntegrationTestBase: TestWriteBase<Program, IdentityContext>
{
public IdentityIntegrationTestBase(TestFactory<Program, IdentityContext> integrationTestFactory)
public IdentityIntegrationTestBase(TestWriteFixture<Program, IdentityContext> integrationTestFactory)
: base(integrationTestFactory)
{
}
}
[CollectionDefinition(Name)]
public class IntegrationTestCollection : ICollectionFixture<TestFactory<Program, IdentityContext>>
public class IntegrationTestCollection : ICollectionFixture<TestWriteFixture<Program, IdentityContext>>
{
public const string Name = "Identity Integration Test";
}

View File

@ -12,7 +12,7 @@ namespace Integration.Test.Passenger.Features;
public class CompleteRegisterPassengerTests : PassengerIntegrationTestBase
{
public CompleteRegisterPassengerTests(
TestFactory<Program, PassengerDbContext> integrationTestFactory) : base(integrationTestFactory)
TestWriteFixture<Program, PassengerDbContext> integrationTestFactory) : base(integrationTestFactory)
{
}

View File

@ -13,7 +13,7 @@ namespace Integration.Test.Passenger.Features;
public class GetPassengerByIdTests : PassengerIntegrationTestBase
{
public GetPassengerByIdTests(
TestFactory<Program, PassengerDbContext> integrationTestFactory) : base(integrationTestFactory)
TestWriteFixture<Program, PassengerDbContext> integrationTestFactory) : base(integrationTestFactory)
{
}

View File

@ -6,16 +6,16 @@ using Xunit;
namespace Integration.Test;
[Collection(IntegrationTestCollection.Name)]
public class PassengerIntegrationTestBase: TestBase<Program, PassengerDbContext>
public class PassengerIntegrationTestBase: TestWriteBase<Program, PassengerDbContext>
{
public PassengerIntegrationTestBase(TestFactory<Program, PassengerDbContext> integrationTestFactory)
public PassengerIntegrationTestBase(TestWriteFixture<Program, PassengerDbContext> integrationTestFactory)
: base(integrationTestFactory)
{
}
}
[CollectionDefinition(Name)]
public class IntegrationTestCollection : ICollectionFixture<TestFactory<Program, PassengerDbContext>>
public class IntegrationTestCollection : ICollectionFixture<TestWriteFixture<Program, PassengerDbContext>>
{
public const string Name = "Passenger Integration Test";
}