diff --git a/booking-microservices-sample.sln b/booking-microservices-sample.sln index 5754a2b..c11e7aa 100644 --- a/booking-microservices-sample.sln +++ b/booking-microservices-sample.sln @@ -65,6 +65,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Integration.Test", "src\Ser EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Unit.Test", "src\Services\Flight\tests\UnitTest\Unit.Test.csproj", "{8F78BCE2-C705-4357-A6B9-1B83B55ABBE8}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "EndToEnd.Test", "src\Services\Flight\tests\EndToEndTest\EndToEnd.Test.csproj", "{8561089E-9FB9-4ACD-A1F5-EAAF213E1DDB}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -102,6 +104,7 @@ Global {539364C8-88B1-48A3-8406-D0B19FF30509} = {C1EBE17D-BFAD-47DA-88EB-BB073B84593E} {50C66B53-ACA0-4AFF-8C5C-834D4EDA8FAC} = {5185D5C5-0EAD-49D5-B405-93B939F3639B} {8F78BCE2-C705-4357-A6B9-1B83B55ABBE8} = {C6EE337B-91EA-472A-87C7-E9528408CE59} + {8561089E-9FB9-4ACD-A1F5-EAAF213E1DDB} = {C6EE337B-91EA-472A-87C7-E9528408CE59} EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {A2D7C5C4-5148-4C3E-BB12-B7A197A290F5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU @@ -164,5 +167,9 @@ Global {8F78BCE2-C705-4357-A6B9-1B83B55ABBE8}.Debug|Any CPU.Build.0 = Debug|Any CPU {8F78BCE2-C705-4357-A6B9-1B83B55ABBE8}.Release|Any CPU.ActiveCfg = Release|Any CPU {8F78BCE2-C705-4357-A6B9-1B83B55ABBE8}.Release|Any CPU.Build.0 = Release|Any CPU + {8561089E-9FB9-4ACD-A1F5-EAAF213E1DDB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {8561089E-9FB9-4ACD-A1F5-EAAF213E1DDB}.Debug|Any CPU.Build.0 = Debug|Any CPU + {8561089E-9FB9-4ACD-A1F5-EAAF213E1DDB}.Release|Any CPU.ActiveCfg = Release|Any CPU + {8561089E-9FB9-4ACD-A1F5-EAAF213E1DDB}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection EndGlobal diff --git a/src/BuildingBlocks/TestBase/EndToEndTest/Auth/AuthServiceCollectionExtensions.cs b/src/BuildingBlocks/TestBase/Auth/AuthServiceCollectionExtensions.cs similarity index 60% rename from src/BuildingBlocks/TestBase/EndToEndTest/Auth/AuthServiceCollectionExtensions.cs rename to src/BuildingBlocks/TestBase/Auth/AuthServiceCollectionExtensions.cs index 21b02a5..21e7d68 100644 --- a/src/BuildingBlocks/TestBase/EndToEndTest/Auth/AuthServiceCollectionExtensions.cs +++ b/src/BuildingBlocks/TestBase/Auth/AuthServiceCollectionExtensions.cs @@ -1,14 +1,18 @@ -using Microsoft.AspNetCore.Authentication; +using System.Security.Claims; +using Microsoft.AspNetCore.Authentication; using Microsoft.AspNetCore.Authorization; using Microsoft.Extensions.DependencyInjection; -namespace BuildingBlocks.TestBase.EndToEndTest.Auth; +namespace BuildingBlocks.TestBase.Auth; //ref: https://blog.joaograssi.com/posts/2021/asp-net-core-testing-permission-protected-api-endpoints/ public static class AuthServiceCollectionExtensions { - public static AuthenticationBuilder AddTestAuthentication( - this IServiceCollection services) + private static MockAuthUser GetMockUser() => + new MockAuthUser(new Claim("sub", Guid.NewGuid().ToString()), + new Claim("email", "sam@test.com")); + + public static AuthenticationBuilder AddTestAuthentication(this IServiceCollection services) { services.AddAuthorization(options => { @@ -18,6 +22,9 @@ public static class AuthServiceCollectionExtensions .Build(); }); + // Register a default user, so all requests have it by default + services.AddScoped(_ => GetMockUser()); + // Register our custom authentication handler return services.AddAuthentication("Test") .AddScheme("Test", options => { }); diff --git a/src/BuildingBlocks/TestBase/EndToEndTest/Auth/MockAuthUser.cs b/src/BuildingBlocks/TestBase/Auth/MockAuthUser.cs similarity index 77% rename from src/BuildingBlocks/TestBase/EndToEndTest/Auth/MockAuthUser.cs rename to src/BuildingBlocks/TestBase/Auth/MockAuthUser.cs index 6359297..e261174 100644 --- a/src/BuildingBlocks/TestBase/EndToEndTest/Auth/MockAuthUser.cs +++ b/src/BuildingBlocks/TestBase/Auth/MockAuthUser.cs @@ -1,6 +1,6 @@ using System.Security.Claims; -namespace BuildingBlocks.TestBase.EndToEndTest.Auth; +namespace BuildingBlocks.TestBase.Auth; public class MockAuthUser { diff --git a/src/BuildingBlocks/TestBase/EndToEndTest/Auth/TestAuthHandler.cs b/src/BuildingBlocks/TestBase/Auth/TestAuthHandler.cs similarity index 96% rename from src/BuildingBlocks/TestBase/EndToEndTest/Auth/TestAuthHandler.cs rename to src/BuildingBlocks/TestBase/Auth/TestAuthHandler.cs index 1dfbe69..e5a168f 100644 --- a/src/BuildingBlocks/TestBase/EndToEndTest/Auth/TestAuthHandler.cs +++ b/src/BuildingBlocks/TestBase/Auth/TestAuthHandler.cs @@ -4,11 +4,13 @@ using Microsoft.AspNetCore.Authentication; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; -namespace BuildingBlocks.TestBase.EndToEndTest.Auth; +namespace BuildingBlocks.TestBase.Auth; //ref: https://blog.joaograssi.com/posts/2021/asp-net-core-testing-permission-protected-api-endpoints/ public class TestAuthHandler : AuthenticationHandler { + + private readonly MockAuthUser _mockAuthUser; public TestAuthHandler( diff --git a/src/BuildingBlocks/TestBase/EndToEndTest/EndToEndTestBase.cs b/src/BuildingBlocks/TestBase/EndToEndTest/EndToEndTestBase.cs deleted file mode 100644 index a4bf04a..0000000 --- a/src/BuildingBlocks/TestBase/EndToEndTest/EndToEndTestBase.cs +++ /dev/null @@ -1,46 +0,0 @@ -using System.Net.Http.Json; -using BuildingBlocks.Mongo; -using BuildingBlocks.TestBase.IntegrationTest; -using BuildingBlocks.Web; -using Microsoft.EntityFrameworkCore; -using Xunit.Abstractions; - -namespace BuildingBlocks.TestBase.EndToEndTest; - -public class EndToEndTestBase : - IntegrationTestBase - where TWContext : DbContext - where TRContext : MongoDbContext - where TEntryPoint : class -{ - public EndToEndTestBase( - IntegrationTestFactory sharedFixture, - ITestOutputHelper outputHelper = null) - : base(sharedFixture, outputHelper) - { - } - - public async Task GetAsync(string requestUrl, CancellationToken cancellationToken = default) - { - return await Fixture.HttpClient.GetFromJsonAsync(requestUrl, cancellationToken: cancellationToken); - } - - public async Task PostAsync(string requestUrl, TRequest request, - CancellationToken cancellationToken = default) - { - return await Fixture.HttpClient.PostAsJsonAsync(requestUrl, request, cancellationToken); - } - - public async Task PutAsync( - string requestUrl, - TRequest request, - CancellationToken cancellationToken = default) - { - return await Fixture.HttpClient.PutAsJsonAsync(requestUrl, request, cancellationToken); - } - - public async Task Delete(string requestUrl, CancellationToken cancellationToken = default) - { - await Fixture.HttpClient.DeleteAsync(requestUrl, cancellationToken); - } -} diff --git a/src/BuildingBlocks/TestBase/IntegrationTest/IntegrationTestBase.cs b/src/BuildingBlocks/TestBase/TestBase.cs similarity index 90% rename from src/BuildingBlocks/TestBase/IntegrationTest/IntegrationTestBase.cs rename to src/BuildingBlocks/TestBase/TestBase.cs index b07ee8b..a80766f 100644 --- a/src/BuildingBlocks/TestBase/IntegrationTest/IntegrationTestBase.cs +++ b/src/BuildingBlocks/TestBase/TestBase.cs @@ -1,12 +1,11 @@ -using System.Security.Claims; -using Ardalis.GuardClauses; +using Ardalis.GuardClauses; using BuildingBlocks.Core.Event; using BuildingBlocks.Core.Model; using BuildingBlocks.EFCore; using BuildingBlocks.MassTransit; using BuildingBlocks.Mongo; using BuildingBlocks.PersistMessageProcessor; -using BuildingBlocks.TestBase.EndToEndTest.Auth; +using BuildingBlocks.TestBase.Auth; using BuildingBlocks.Web; using DotNet.Testcontainers.Containers; using EasyNetQ.Management.Client; @@ -31,9 +30,9 @@ using Xunit; using Xunit.Abstractions; using ILogger = Serilog.ILogger; -namespace BuildingBlocks.TestBase.IntegrationTest; +namespace BuildingBlocks.TestBase; -public class IntegrationTestFactory : IAsyncLifetime +public class TestFactory : IAsyncLifetime where TEntryPoint : class { private readonly WebApplicationFactory _factory; @@ -52,7 +51,7 @@ public class IntegrationTestFactory : IAsyncLifetime public IConfiguration Configuration => _factory?.Services.GetRequiredService(); public ILogger Logger { get; set; } - public IntegrationTestFactory() + public TestFactory() { _factory = new WebApplicationFactory() .WithWebHostBuilder(builder => @@ -64,11 +63,7 @@ public class IntegrationTestFactory : IAsyncLifetime { TestRegistrationServices?.Invoke(services); services.ReplaceSingleton(AddHttpContextAccessorMock); - // Add our custom handler services.AddTestAuthentication(); - - // Register a default user, so all requests have it by default - services.AddScoped(_ => GetMockUser()); }); }); } @@ -261,13 +256,9 @@ public class IntegrationTestFactory : IAsyncLifetime return httpContextAccessorMock; } - - private MockAuthUser GetMockUser() => - new MockAuthUser(new Claim("sub", Guid.NewGuid().ToString()), - new Claim("email", "sam@test.com")); } -public class IntegrationTestFactory : IntegrationTestFactory +public class TestFactory : TestFactory where TEntryPoint : class where TWContext : DbContext { @@ -374,7 +365,7 @@ public class IntegrationTestFactory : IntegrationTestFac } } -public class IntegrationTestFactory : IntegrationTestFactory +public class TestFactory : TestFactory where TEntryPoint : class where TWContext : DbContext where TRContext : MongoDbContext @@ -390,7 +381,7 @@ public class IntegrationTestFactory : Integra } } -public class IntegrationTestFixtureCore : IAsyncLifetime +public class TestFixtureCore : IAsyncLifetime where TEntryPoint : class { private Respawner _reSpawnerDefaultDb; @@ -398,14 +389,14 @@ public class IntegrationTestFixtureCore : IAsyncLifetime private SqlConnection DefaultDbConnection { get; set; } private SqlConnection PersistDbConnection { get; set; } - public IntegrationTestFixtureCore(IntegrationTestFactory integrationTestFixture, ITestOutputHelper outputHelper) + public TestFixtureCore(TestFactory integrationTestFixture, ITestOutputHelper outputHelper) { Fixture = integrationTestFixture; integrationTestFixture.RegisterServices(services => RegisterTestsServices(services)); integrationTestFixture.Logger = integrationTestFixture.CreateLogger(outputHelper); } - public IntegrationTestFactory Fixture { get; } + public TestFactory Fixture { get; } public async Task InitializeAsync() @@ -496,31 +487,31 @@ public class IntegrationTestFixtureCore : IAsyncLifetime } } -public abstract class IntegrationTestBase : IntegrationTestFixtureCore +public abstract class TestBase : TestFixtureCore //,IClassFixture> where TEntryPoint : class where TWContext : DbContext { - protected IntegrationTestBase( - IntegrationTestFactory integrationTestFixture, ITestOutputHelper outputHelper = null) : base(integrationTestFixture, outputHelper) + protected TestBase( + TestFactory integrationTestFixture, ITestOutputHelper outputHelper = null) : base(integrationTestFixture, outputHelper) { Fixture = integrationTestFixture; } - public IntegrationTestFactory Fixture { get; } + public TestFactory Fixture { get; } } -public abstract class IntegrationTestBase : IntegrationTestFixtureCore +public abstract class TestBase : TestFixtureCore //,IClassFixture> where TEntryPoint : class where TWContext : DbContext where TRContext : MongoDbContext { - protected IntegrationTestBase( - IntegrationTestFactory integrationTestFixture, ITestOutputHelper outputHelper = null) : base(integrationTestFixture, outputHelper) + protected TestBase( + TestFactory integrationTestFixture, ITestOutputHelper outputHelper = null) : base(integrationTestFixture, outputHelper) { Fixture = integrationTestFixture; } - public IntegrationTestFactory Fixture { get; } + public TestFactory Fixture { get; } } diff --git a/src/BuildingBlocks/Web/HttpClientExtensions.cs b/src/BuildingBlocks/Web/HttpClientExtensions.cs deleted file mode 100644 index d29243f..0000000 --- a/src/BuildingBlocks/Web/HttpClientExtensions.cs +++ /dev/null @@ -1,36 +0,0 @@ -using System.Net.Http.Json; - -namespace BuildingBlocks.Web; - -public static class HttpClientExtensions -{ - public static async Task - PostAsJsonAsync( - this HttpClient httpClient, - string requestUri, - TRequest request, - CancellationToken cancellationToken = default) - { - var responseMessage = - await httpClient.PostAsJsonAsync(requestUri, request, cancellationToken: cancellationToken); - - var result = await responseMessage.Content.ReadFromJsonAsync(cancellationToken: cancellationToken); - - return result; - } - - public static async Task - PutAsJsonAsync( - this HttpClient httpClient, - string requestUri, - TRequest request, - CancellationToken cancellationToken = default) - { - var responseMessage = - await httpClient.PutAsJsonAsync(requestUri, request, cancellationToken: cancellationToken); - - var result = await responseMessage.Content.ReadFromJsonAsync(cancellationToken: cancellationToken); - - return result; - } -} diff --git a/src/Services/Booking/src/Booking/Booking/Features/CreateBooking/Endpoints/V1/CreateBookingEndpoint.cs b/src/Services/Booking/src/Booking/Booking/Features/CreateBooking/Endpoints/V1/CreateBookingEndpoint.cs index 80f5d11..a139b29 100644 --- a/src/Services/Booking/src/Booking/Booking/Features/CreateBooking/Endpoints/V1/CreateBookingEndpoint.cs +++ b/src/Services/Booking/src/Booking/Booking/Features/CreateBooking/Endpoints/V1/CreateBookingEndpoint.cs @@ -19,11 +19,11 @@ public class CreateBookingEndpoint : IMinimalEndpoint endpoints.MapPost($"{EndpointConfig.BaseApiPath}/booking", CreateBooking) .RequireAuthorization() .WithTags("Booking") - .WithName("Create Booking") + .WithName("CreateBooking") .WithMetadata(new SwaggerOperationAttribute("Create Booking", "Create Booking")) .WithApiVersionSet(endpoints.NewApiVersionSet("Booking").Build()) .Produces() - .Produces(StatusCodes.Status201Created) + .Produces(StatusCodes.Status200OK) .Produces(StatusCodes.Status400BadRequest) .HasApiVersion(1.0); diff --git a/src/Services/Booking/src/Booking/Extensions/Infrastructure/ProblemDetailsExtensions.cs b/src/Services/Booking/src/Booking/Extensions/Infrastructure/ProblemDetailsExtensions.cs index ce6a01e..6b59b3c 100644 --- a/src/Services/Booking/src/Booking/Extensions/Infrastructure/ProblemDetailsExtensions.cs +++ b/src/Services/Booking/src/Booking/Extensions/Infrastructure/ProblemDetailsExtensions.cs @@ -23,7 +23,7 @@ public static class ProblemDetailsExtensions }; x.Map(ex => new ProblemDetailsWithCode { - Title = "Application rule broken", + Title = ex.GetType().Name, Status = StatusCodes.Status409Conflict, Detail = ex.Message, Type = "https://somedomain/application-rule-validation-error", @@ -32,35 +32,35 @@ public static class ProblemDetailsExtensions // Exception will produce and returns from our FluentValidation RequestValidationBehavior x.Map(ex => new ProblemDetailsWithCode { - Title = "input validation rules broken", + Title = ex.GetType().Name, Status = (int)ex.StatusCode, Detail = ex.Message, Type = "https://somedomain/input-validation-rules-error", }); x.Map(ex => new ProblemDetailsWithCode { - Title = "bad request exception", + Title = ex.GetType().Name, Status = StatusCodes.Status400BadRequest, Detail = ex.Message, Type = "https://somedomain/bad-request-error", }); x.Map(ex => new ProblemDetailsWithCode { - Title = "not found exception", + Title = ex.GetType().Name, Status = StatusCodes.Status404NotFound, Detail = ex.Message, Type = "https://somedomain/not-found-error", }); x.Map(ex => new ProblemDetailsWithCode { - Title = "api server exception", + Title = ex.GetType().Name, Status = StatusCodes.Status500InternalServerError, Detail = ex.Message, Type = "https://somedomain/api-server-error", }); x.Map(ex => new ProblemDetailsWithCode { - Title = "application exception", + Title = ex.GetType().Name, Status = StatusCodes.Status400BadRequest, Detail = ex.Message, Type = "https://somedomain/application-error", @@ -69,7 +69,7 @@ public static class ProblemDetailsExtensions x.Map(ex => new ProblemDetails { Status = StatusCodes.Status400BadRequest, - Title = "grpc exception", + Title = ex.GetType().Name, Detail = ex.Status.Detail, Type = "https://somedomain/grpc-error" }); diff --git a/src/Services/Booking/tests/IntegrationTest/Booking/Features/CreateBookingTests.cs b/src/Services/Booking/tests/IntegrationTest/Booking/Features/CreateBookingTests.cs index 4dff3c2..6bd0df0 100644 --- a/src/Services/Booking/tests/IntegrationTest/Booking/Features/CreateBookingTests.cs +++ b/src/Services/Booking/tests/IntegrationTest/Booking/Features/CreateBookingTests.cs @@ -1,10 +1,12 @@ -using System.Linq; +using System; +using System.Linq; using System.Threading.Tasks; using Booking.Api; using Booking.Data; using BuildingBlocks.Contracts.EventBus.Messages; +using BuildingBlocks.EFCore; using BuildingBlocks.PersistMessageProcessor.Data; -using BuildingBlocks.TestBase.IntegrationTest; +using BuildingBlocks.TestBase; using Flight; using FluentAssertions; using Grpc.Core; @@ -21,7 +23,7 @@ namespace Integration.Test.Booking.Features; public class CreateBookingTests : BookingIntegrationTestBase { - public CreateBookingTests(IntegrationTestFactory integrationTestFixture) : base(integrationTestFixture) + public CreateBookingTests(TestFactory integrationTestFixture) : base(integrationTestFixture) { } @@ -39,12 +41,21 @@ public class CreateBookingTests : BookingIntegrationTestBase var command = new FakeCreateBookingCommand().Generate(); // Act - var response = await Fixture.SendAsync(command); + try + { + var response = await Fixture.SendAsync(command); - // Assert - response.Should().BeGreaterOrEqualTo(0); + // Assert + response.Should().BeGreaterOrEqualTo(0); + + (await Fixture.WaitForPublishing()).Should().Be(true); + } + catch (Exception e) + { + Console.WriteLine(e); + throw; + } - (await Fixture.WaitForPublishing()).Should().Be(true); } diff --git a/src/Services/Booking/tests/IntegrationTest/BookingIntegrationTestBase.cs b/src/Services/Booking/tests/IntegrationTest/BookingIntegrationTestBase.cs index 3ac53e2..eca6176 100644 --- a/src/Services/Booking/tests/IntegrationTest/BookingIntegrationTestBase.cs +++ b/src/Services/Booking/tests/IntegrationTest/BookingIntegrationTestBase.cs @@ -1,21 +1,22 @@ using Booking.Api; using Booking.Data; +using BuildingBlocks.EFCore; using BuildingBlocks.PersistMessageProcessor.Data; -using BuildingBlocks.TestBase.IntegrationTest; +using BuildingBlocks.TestBase; using Xunit; namespace Integration.Test; [Collection(IntegrationTestCollection.Name)] -public class BookingIntegrationTestBase: IntegrationTestBase +public class BookingIntegrationTestBase: TestBase { - public BookingIntegrationTestBase(IntegrationTestFactory integrationTestFixture) : base(integrationTestFixture) + public BookingIntegrationTestBase(TestFactory integrationTestFixture) : base(integrationTestFixture) { } } [CollectionDefinition(Name)] -public class IntegrationTestCollection : ICollectionFixture> +public class IntegrationTestCollection : ICollectionFixture> { public const string Name = "Booking Integration Test"; } diff --git a/src/Services/Flight/src/Flight/Aircrafts/Features/CreateAircraft/Endpoints/V1/CreateAircraftEndpoint.cs b/src/Services/Flight/src/Flight/Aircrafts/Features/CreateAircraft/Endpoints/V1/CreateAircraftEndpoint.cs index a58fb69..e394a85 100644 --- a/src/Services/Flight/src/Flight/Aircrafts/Features/CreateAircraft/Endpoints/V1/CreateAircraftEndpoint.cs +++ b/src/Services/Flight/src/Flight/Aircrafts/Features/CreateAircraft/Endpoints/V1/CreateAircraftEndpoint.cs @@ -20,11 +20,11 @@ public class CreateAircraftEndpoint : IMinimalEndpoint endpoints.MapPost($"{EndpointConfig.BaseApiPath}/flight/aircraft", CreateAircraft) .RequireAuthorization() .WithTags("Flight") - .WithName("Create Aircraft") + .WithName("CreateAircraft") .WithMetadata(new SwaggerOperationAttribute("Create Aircraft", "Create Aircraft")) .WithApiVersionSet(endpoints.NewApiVersionSet("Flight").Build()) .Produces() - .Produces(StatusCodes.Status201Created) + .Produces(StatusCodes.Status200OK) .Produces(StatusCodes.Status400BadRequest) .HasApiVersion(1.0); diff --git a/src/Services/Flight/src/Flight/Airports/Features/CreateAirport/Endpoints/V1/CreateAirportEndpoint.cs b/src/Services/Flight/src/Flight/Airports/Features/CreateAirport/Endpoints/V1/CreateAirportEndpoint.cs index b353783..d017195 100644 --- a/src/Services/Flight/src/Flight/Airports/Features/CreateAirport/Endpoints/V1/CreateAirportEndpoint.cs +++ b/src/Services/Flight/src/Flight/Airports/Features/CreateAirport/Endpoints/V1/CreateAirportEndpoint.cs @@ -20,11 +20,11 @@ public class CreateAirportEndpoint : IMinimalEndpoint endpoints.MapPost($"{EndpointConfig.BaseApiPath}/flight/airport", CreateAirport) .RequireAuthorization() .WithTags("Flight") - .WithName("Create Airport") + .WithName("CreateAirport") .WithMetadata(new SwaggerOperationAttribute("Create Airport", "Create Airport")) .WithApiVersionSet(endpoints.NewApiVersionSet("Flight").Build()) .Produces() - .Produces(StatusCodes.Status201Created) + .Produces(StatusCodes.Status200OK) .Produces(StatusCodes.Status400BadRequest) .HasApiVersion(1.0); diff --git a/src/Services/Flight/src/Flight/Extensions/Infrastructure/ProblemDetailsExtensions.cs b/src/Services/Flight/src/Flight/Extensions/Infrastructure/ProblemDetailsExtensions.cs index fa5ad9b..a74654e 100644 --- a/src/Services/Flight/src/Flight/Extensions/Infrastructure/ProblemDetailsExtensions.cs +++ b/src/Services/Flight/src/Flight/Extensions/Infrastructure/ProblemDetailsExtensions.cs @@ -22,7 +22,7 @@ public static class ProblemDetailsExtensions }; x.Map(ex => new ProblemDetailsWithCode { - Title = "Application rule broken", + Title = ex.GetType().Name, Status = StatusCodes.Status409Conflict, Detail = ex.Message, Type = "https://somedomain/application-rule-validation-error" @@ -31,35 +31,35 @@ public static class ProblemDetailsExtensions // Exception will produce and returns from our FluentValidation RequestValidationBehavior x.Map(ex => new ProblemDetailsWithCode { - Title = "input validation rules broken", + Title = ex.GetType().Name, Status = (int)ex.StatusCode, Detail = ex.Message, Type = "https://somedomain/input-validation-rules-error" }); x.Map(ex => new ProblemDetailsWithCode { - Title = "bad request exception", + Title = ex.GetType().Name, Status = StatusCodes.Status400BadRequest, Detail = ex.Message, Type = "https://somedomain/bad-request-error" }); x.Map(ex => new ProblemDetailsWithCode { - Title = "not found exception", + Title = ex.GetType().Name, Status = StatusCodes.Status404NotFound, Detail = ex.Message, Type = "https://somedomain/not-found-error" }); x.Map(ex => new ProblemDetailsWithCode { - Title = "api server exception", + Title = ex.GetType().Name, Status = StatusCodes.Status500InternalServerError, Detail = ex.Message, Type = "https://somedomain/api-server-error" }); x.Map(ex => new ProblemDetailsWithCode { - Title = "application exception", + Title = ex.GetType().Name, Status = StatusCodes.Status400BadRequest, Detail = ex.Message, Type = "https://somedomain/application-error" diff --git a/src/Services/Flight/src/Flight/Flights/Features/CreateFlight/Endpoints/V1/CreateFlightEndpoint.cs b/src/Services/Flight/src/Flight/Flights/Features/CreateFlight/Endpoints/V1/CreateFlightEndpoint.cs index 7ce5419..49a5d54 100644 --- a/src/Services/Flight/src/Flight/Flights/Features/CreateFlight/Endpoints/V1/CreateFlightEndpoint.cs +++ b/src/Services/Flight/src/Flight/Flights/Features/CreateFlight/Endpoints/V1/CreateFlightEndpoint.cs @@ -21,7 +21,7 @@ public class CreateFlightEndpoint : IMinimalEndpoint endpoints.MapPost($"{EndpointConfig.BaseApiPath}/flight", CreateFlight) .RequireAuthorization() .WithTags("Flight") - .WithName("Create Flight") + .WithName("CreateFlight") .WithMetadata(new SwaggerOperationAttribute("Create Flight", "Create Flight")) .WithApiVersionSet(endpoints.NewApiVersionSet("Flight").Build()) .Produces() @@ -39,6 +39,6 @@ public class CreateFlightEndpoint : IMinimalEndpoint var result = await mediator.Send(command, cancellationToken); - return Results.Ok(result); + return Results.CreatedAtRoute("GetFlightById", new {id = result.Id}, result); } } diff --git a/src/Services/Flight/src/Flight/Flights/Features/DeleteFlight/Endpoints/V1/DeleteFlightEndpoint.cs b/src/Services/Flight/src/Flight/Flights/Features/DeleteFlight/Endpoints/V1/DeleteFlightEndpoint.cs index e92bdd4..0d3eec5 100644 --- a/src/Services/Flight/src/Flight/Flights/Features/DeleteFlight/Endpoints/V1/DeleteFlightEndpoint.cs +++ b/src/Services/Flight/src/Flight/Flights/Features/DeleteFlight/Endpoints/V1/DeleteFlightEndpoint.cs @@ -18,11 +18,11 @@ public class DeleteFlightEndpoint : IMinimalEndpoint endpoints.MapDelete($"{EndpointConfig.BaseApiPath}/flight/{{id}}", DeleteFlight) .RequireAuthorization() .WithTags("Flight") - .WithName("Delete Flight") + .WithName("DeleteFlight") .WithMetadata(new SwaggerOperationAttribute("Delete Flight", "Delete Flight")) .WithApiVersionSet(endpoints.NewApiVersionSet("Flight").Build()) .Produces() - .Produces(StatusCodes.Status201Created) + .Produces(StatusCodes.Status204NoContent) .Produces(StatusCodes.Status400BadRequest) .HasApiVersion(1.0); @@ -33,6 +33,6 @@ public class DeleteFlightEndpoint : IMinimalEndpoint { var result = await mediator.Send(new DeleteFlightCommand(id), cancellationToken); - return Results.Ok(result); + return Results.NoContent(); } } diff --git a/src/Services/Flight/src/Flight/Flights/Features/GetAvailableFlights/Endpoints/V1/GetAvailableFlightsEndpoint.cs b/src/Services/Flight/src/Flight/Flights/Features/GetAvailableFlights/Endpoints/V1/GetAvailableFlightsEndpoint.cs index 5646d1f..9460bed 100644 --- a/src/Services/Flight/src/Flight/Flights/Features/GetAvailableFlights/Endpoints/V1/GetAvailableFlightsEndpoint.cs +++ b/src/Services/Flight/src/Flight/Flights/Features/GetAvailableFlights/Endpoints/V1/GetAvailableFlightsEndpoint.cs @@ -19,7 +19,7 @@ public class GetAvailableFlightsEndpoint : IMinimalEndpoint endpoints.MapGet($"{EndpointConfig.BaseApiPath}/flight/get-available-flights", GetAvailableFlights) .RequireAuthorization() .WithTags("Flight") - .WithName("Get Available Flights") + .WithName("GetAvailableFlights") .WithMetadata(new SwaggerOperationAttribute("Get Available Flights", "Get Available Flights")) .WithApiVersionSet(endpoints.NewApiVersionSet("Flight").Build()) .Produces>() diff --git a/src/Services/Flight/src/Flight/Flights/Features/GetFlightById/Endpoints/V1/GetFlightByIdEndpoint.cs b/src/Services/Flight/src/Flight/Flights/Features/GetFlightById/Endpoints/V1/GetFlightByIdEndpoint.cs index 1e31385..97ad9c8 100644 --- a/src/Services/Flight/src/Flight/Flights/Features/GetFlightById/Endpoints/V1/GetFlightByIdEndpoint.cs +++ b/src/Services/Flight/src/Flight/Flights/Features/GetFlightById/Endpoints/V1/GetFlightByIdEndpoint.cs @@ -18,7 +18,7 @@ public class GetFlightByIdEndpoint : IMinimalEndpoint endpoints.MapGet($"{EndpointConfig.BaseApiPath}/flight/{{id}}", GetById) .RequireAuthorization() .WithTags("Flight") - .WithName("Get Flight By Id") + .WithName("GetFlightById") .WithMetadata(new SwaggerOperationAttribute("Get Flight By Id", "Get Flight By Id")) .WithApiVersionSet(endpoints.NewApiVersionSet("Flight").Build()) .Produces() diff --git a/src/Services/Flight/src/Flight/Flights/Features/UpdateFlight/Endpoints/V1/UpdateFlightEndpoint.cs b/src/Services/Flight/src/Flight/Flights/Features/UpdateFlight/Endpoints/V1/UpdateFlightEndpoint.cs index a16dad8..5fcd142 100644 --- a/src/Services/Flight/src/Flight/Flights/Features/UpdateFlight/Endpoints/V1/UpdateFlightEndpoint.cs +++ b/src/Services/Flight/src/Flight/Flights/Features/UpdateFlight/Endpoints/V1/UpdateFlightEndpoint.cs @@ -20,11 +20,11 @@ public class UpdateFlightEndpoint : IMinimalEndpoint endpoints.MapPut($"{EndpointConfig.BaseApiPath}/flight", UpdateFlight) .RequireAuthorization() .WithTags("Flight") - .WithName("Update Flight") + .WithName("UpdateFlight") .WithMetadata(new SwaggerOperationAttribute("Update Flight", "Update Flight")) .WithApiVersionSet(endpoints.NewApiVersionSet("Flight").Build()) .Produces() - .Produces(StatusCodes.Status201Created) + .Produces(StatusCodes.Status204NoContent) .Produces(StatusCodes.Status400BadRequest) .HasApiVersion(1.0); @@ -37,6 +37,6 @@ public class UpdateFlightEndpoint : IMinimalEndpoint var result = await mediator.Send(command, cancellationToken); - return Results.Ok(result); + return Results.NoContent(); } } diff --git a/src/Services/Flight/src/Flight/Seats/Features/CreateSeat/Endpoints/V1/CreateSeatEndpoint.cs b/src/Services/Flight/src/Flight/Seats/Features/CreateSeat/Endpoints/V1/CreateSeatEndpoint.cs index eed51ad..1f89c8f 100644 --- a/src/Services/Flight/src/Flight/Seats/Features/CreateSeat/Endpoints/V1/CreateSeatEndpoint.cs +++ b/src/Services/Flight/src/Flight/Seats/Features/CreateSeat/Endpoints/V1/CreateSeatEndpoint.cs @@ -20,11 +20,11 @@ public class CreateSeatEndpoint : IMinimalEndpoint endpoints.MapPost($"{EndpointConfig.BaseApiPath}/flight/seat", CreateSeat) .RequireAuthorization() .WithTags("Flight") - .WithName("Create Seat") + .WithName("CreateSeat") .WithMetadata(new SwaggerOperationAttribute("Create Seat", "Create Seat")) .WithApiVersionSet(endpoints.NewApiVersionSet("Flight").Build()) .Produces() - .Produces(StatusCodes.Status201Created) + .Produces(StatusCodes.Status200OK) .Produces(StatusCodes.Status400BadRequest) .HasApiVersion(1.0); diff --git a/src/Services/Flight/src/Flight/Seats/Features/GetAvailableSeats/Endpoints/V1/GetAvailableSeatsEndpoint.cs b/src/Services/Flight/src/Flight/Seats/Features/GetAvailableSeats/Endpoints/V1/GetAvailableSeatsEndpoint.cs index a97b5df..a0ed013 100644 --- a/src/Services/Flight/src/Flight/Seats/Features/GetAvailableSeats/Endpoints/V1/GetAvailableSeatsEndpoint.cs +++ b/src/Services/Flight/src/Flight/Seats/Features/GetAvailableSeats/Endpoints/V1/GetAvailableSeatsEndpoint.cs @@ -19,7 +19,7 @@ public class GetAvailableSeatsEndpoint : IMinimalEndpoint endpoints.MapGet($"{EndpointConfig.BaseApiPath}/flight/get-available-seats/{{id}}", GetAvailableSeats) .RequireAuthorization() .WithTags("Flight") - .WithName("Get Available Seats") + .WithName("GetAvailableSeats") .WithMetadata(new SwaggerOperationAttribute("Get Available Seats", "Get Available Seats")) .WithApiVersionSet(endpoints.NewApiVersionSet("Flight").Build()) .Produces>() @@ -36,4 +36,4 @@ public class GetAvailableSeatsEndpoint : IMinimalEndpoint return Results.Ok(result); } -} \ No newline at end of file +} diff --git a/src/Services/Flight/src/Flight/Seats/Features/ReserveSeat/Endpoints/V1/ReserveSeatEndpoint.cs b/src/Services/Flight/src/Flight/Seats/Features/ReserveSeat/Endpoints/V1/ReserveSeatEndpoint.cs index 1c8be67..ee92753 100644 --- a/src/Services/Flight/src/Flight/Seats/Features/ReserveSeat/Endpoints/V1/ReserveSeatEndpoint.cs +++ b/src/Services/Flight/src/Flight/Seats/Features/ReserveSeat/Endpoints/V1/ReserveSeatEndpoint.cs @@ -20,11 +20,11 @@ public class ReserveSeatEndpoint : IMinimalEndpoint endpoints.MapPost($"{EndpointConfig.BaseApiPath}/flight/reserve-seat", ReserveSeat) .RequireAuthorization() .WithTags("Flight") - .WithName("Reserve Seat") + .WithName("ReserveSeat") .WithMetadata(new SwaggerOperationAttribute("Reserve Seat", "Reserve Seat")) .WithApiVersionSet(endpoints.NewApiVersionSet("Flight").Build()) .Produces() - .Produces(StatusCodes.Status201Created) + .Produces(StatusCodes.Status200OK) .Produces(StatusCodes.Status400BadRequest) .HasApiVersion(1.0); diff --git a/src/Services/Flight/tests/EndToEndTest/EndToEnd.Test.csproj b/src/Services/Flight/tests/EndToEndTest/EndToEnd.Test.csproj new file mode 100644 index 0000000..64d526d --- /dev/null +++ b/src/Services/Flight/tests/EndToEndTest/EndToEnd.Test.csproj @@ -0,0 +1,40 @@ + + + + net7.0 + enable + enable + + false + + + + + PreserveNewest + + + + + + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + runtime; build; native; contentfiles; analyzers; buildtransitive + all + + + + + + + + + + + + diff --git a/src/Services/Flight/tests/EndToEndTest/Fakes/FakeCreateFlightCommand.cs b/src/Services/Flight/tests/EndToEndTest/Fakes/FakeCreateFlightCommand.cs new file mode 100644 index 0000000..0fe881e --- /dev/null +++ b/src/Services/Flight/tests/EndToEndTest/Fakes/FakeCreateFlightCommand.cs @@ -0,0 +1,19 @@ +using AutoBogus; +using BuildingBlocks.IdsGenerator; +using Flight.Flights.Enums; +using Flight.Flights.Features.CreateFlight.Commands.V1; + +namespace EndToEnd.Test.Fakes; + +public sealed class FakeCreateFlightCommand : AutoFaker +{ + public FakeCreateFlightCommand() + { + RuleFor(r => r.Id, _ => SnowFlakIdGenerator.NewId()); + RuleFor(r => r.FlightNumber, r => r.Random.String()); + RuleFor(r => r.DepartureAirportId, _ => 1); + RuleFor(r => r.ArriveAirportId, _ => 2); + RuleFor(r => r.Status, _ => FlightStatus.Flying); + RuleFor(r => r.AircraftId, _ => 1); + } +} diff --git a/src/Services/Flight/tests/EndToEndTest/Flight/Features/CreateFlightTests.cs b/src/Services/Flight/tests/EndToEndTest/Flight/Features/CreateFlightTests.cs new file mode 100644 index 0000000..6173c59 --- /dev/null +++ b/src/Services/Flight/tests/EndToEndTest/Flight/Features/CreateFlightTests.cs @@ -0,0 +1,33 @@ +using System.Net; +using System.Net.Http.Json; +using BuildingBlocks.TestBase; +using EndToEnd.Test.Fakes; +using EndToEnd.Test.Routes; +using Flight.Api; +using Flight.Data; +using FluentAssertions; +using Xunit; + +namespace EndToEnd.Test.Flight.Features; + +public class CreateFlightTests : FlightEndToEndTestBase +{ + public CreateFlightTests(TestFactory integrationTestFixture) : base(integrationTestFixture) + { + } + + + [Fact] + public async Task should_create_new_flight_to_db_and_publish_message_to_broker() + { + //Arrange + var command = new FakeCreateFlightCommand().Generate(); + + // Act + var route = ApiRoutes.Flight.CreateFlight; + var result = await Fixture.HttpClient.PostAsJsonAsync(route, command); + + // Assert + result.StatusCode.Should().Be(HttpStatusCode.Created); + } +} diff --git a/src/Services/Flight/tests/EndToEndTest/Flight/Features/GetFlightByIdTests.cs b/src/Services/Flight/tests/EndToEndTest/Flight/Features/GetFlightByIdTests.cs new file mode 100644 index 0000000..d913c91 --- /dev/null +++ b/src/Services/Flight/tests/EndToEndTest/Flight/Features/GetFlightByIdTests.cs @@ -0,0 +1,35 @@ +using System.Net; +using BuildingBlocks.TestBase; +using EndToEnd.Test.Fakes; +using EndToEnd.Test.Routes; +using Flight.Api; +using Flight.Data; +using Flight.Flights.Features.CreateFlight.Commands.V1.Reads; +using FluentAssertions; +using Xunit; + +namespace EndToEnd.Test.Flight.Features; + +public class GetFlightByIdTests: FlightEndToEndTestBase +{ + public GetFlightByIdTests(TestFactory integrationTestFixture) : base(integrationTestFixture) + { + } + + + [Fact] + public async Task should_retrive_a_flight_by_id_currectly() + { + //Arrange + var command = new FakeCreateFlightCommand().Generate(); + await Fixture.SendAsync(command); + (await Fixture.ShouldProcessedPersistInternalCommand()).Should().Be(true); + + // Act + var route = ApiRoutes.Flight.GetFlightById.Replace(ApiRoutes.Flight.Id, command.Id.ToString()); + var result = await Fixture.HttpClient.GetAsync(route); + + // Assert + result.StatusCode.Should().Be(HttpStatusCode.OK); + } +} diff --git a/src/Services/Flight/tests/EndToEndTest/FlightTestBase.cs b/src/Services/Flight/tests/EndToEndTest/FlightTestBase.cs new file mode 100644 index 0000000..8f4323b --- /dev/null +++ b/src/Services/Flight/tests/EndToEndTest/FlightTestBase.cs @@ -0,0 +1,20 @@ +using BuildingBlocks.TestBase; +using Flight.Api; +using Flight.Data; +using Xunit; + +namespace EndToEnd.Test; + +[Collection(EndToEndTestCollection.Name)] +public class FlightEndToEndTestBase: TestBase +{ + public FlightEndToEndTestBase(TestFactory integrationTestFixture) : base(integrationTestFixture) + { + } +} + +[CollectionDefinition(Name)] +public class EndToEndTestCollection : ICollectionFixture> +{ + public const string Name = "Flight EndToEnd Test"; +} diff --git a/src/Services/Flight/tests/EndToEndTest/Routes/ApiRoutes.cs b/src/Services/Flight/tests/EndToEndTest/Routes/ApiRoutes.cs new file mode 100644 index 0000000..523e47e --- /dev/null +++ b/src/Services/Flight/tests/EndToEndTest/Routes/ApiRoutes.cs @@ -0,0 +1,13 @@ +namespace EndToEnd.Test.Routes; + +public class ApiRoutes +{ + public const string BaseApiPath = "api/v1.0"; + + public static class Flight + { + public const string Id = "{id}"; + public const string GetFlightById = $"{BaseApiPath}/flight/{Id}"; + public const string CreateFlight = $"{BaseApiPath}/flight"; + } +} diff --git a/src/Services/Flight/tests/IntegrationTest/Aircraft/Features/CreateAircraftTests.cs b/src/Services/Flight/tests/IntegrationTest/Aircraft/Features/CreateAircraftTests.cs index caff7f1..2b765b5 100644 --- a/src/Services/Flight/tests/IntegrationTest/Aircraft/Features/CreateAircraftTests.cs +++ b/src/Services/Flight/tests/IntegrationTest/Aircraft/Features/CreateAircraftTests.cs @@ -1,6 +1,6 @@ using System.Threading.Tasks; using BuildingBlocks.Contracts.EventBus.Messages; -using BuildingBlocks.TestBase.IntegrationTest; +using BuildingBlocks.TestBase; using Flight.Aircrafts.Features.CreateAircraft.Commands.V1.Reads; using Flight.Api; using Flight.Data; @@ -13,7 +13,7 @@ namespace Integration.Test.Aircraft.Features; public class CreateAircraftTests : FlightIntegrationTestBase { public CreateAircraftTests( - IntegrationTestFactory integrationTestFactory) : base(integrationTestFactory) + TestFactory integrationTestFactory) : base(integrationTestFactory) { } diff --git a/src/Services/Flight/tests/IntegrationTest/Airport/Features/CreateAirportTests.cs b/src/Services/Flight/tests/IntegrationTest/Airport/Features/CreateAirportTests.cs index 9c0b1ac..f07b448 100644 --- a/src/Services/Flight/tests/IntegrationTest/Airport/Features/CreateAirportTests.cs +++ b/src/Services/Flight/tests/IntegrationTest/Airport/Features/CreateAirportTests.cs @@ -1,6 +1,6 @@ using System.Threading.Tasks; using BuildingBlocks.Contracts.EventBus.Messages; -using BuildingBlocks.TestBase.IntegrationTest; +using BuildingBlocks.TestBase; using Flight.Airports.Features.CreateAirport.Commands.V1.Reads; using Flight.Api; using Flight.Data; @@ -13,7 +13,7 @@ namespace Integration.Test.Airport.Features; public class CreateAirportTests : FlightIntegrationTestBase { public CreateAirportTests( - IntegrationTestFactory integrationTestFactory) : base(integrationTestFactory) + TestFactory integrationTestFactory) : base(integrationTestFactory) { } diff --git a/src/Services/Flight/tests/IntegrationTest/Flight/Features/CreateFlightTests.cs b/src/Services/Flight/tests/IntegrationTest/Flight/Features/CreateFlightTests.cs index 00981fb..8a18372 100644 --- a/src/Services/Flight/tests/IntegrationTest/Flight/Features/CreateFlightTests.cs +++ b/src/Services/Flight/tests/IntegrationTest/Flight/Features/CreateFlightTests.cs @@ -1,6 +1,6 @@ using System.Threading.Tasks; using BuildingBlocks.Contracts.EventBus.Messages; -using BuildingBlocks.TestBase.IntegrationTest; +using BuildingBlocks.TestBase; using Flight.Api; using Flight.Data; using Flight.Flights.Features.CreateFlight.Commands.V1.Reads; @@ -13,7 +13,7 @@ namespace Integration.Test.Flight.Features; public class CreateFlightTests : FlightIntegrationTestBase { public CreateFlightTests( - IntegrationTestFactory integrationTestFactory) : base(integrationTestFactory) + TestFactory integrationTestFactory) : base(integrationTestFactory) { } diff --git a/src/Services/Flight/tests/IntegrationTest/Flight/Features/DeleteFlightTests.cs b/src/Services/Flight/tests/IntegrationTest/Flight/Features/DeleteFlightTests.cs index 5b0c42d..b6c6202 100644 --- a/src/Services/Flight/tests/IntegrationTest/Flight/Features/DeleteFlightTests.cs +++ b/src/Services/Flight/tests/IntegrationTest/Flight/Features/DeleteFlightTests.cs @@ -1,7 +1,7 @@ using System.Linq; using System.Threading.Tasks; using BuildingBlocks.Contracts.EventBus.Messages; -using BuildingBlocks.TestBase.IntegrationTest; +using BuildingBlocks.TestBase; using Flight.Api; using Flight.Data; using Flight.Flights.Features.DeleteFlight.Commands.V1; @@ -15,7 +15,7 @@ namespace Integration.Test.Flight.Features; public class DeleteFlightTests : FlightIntegrationTestBase { public DeleteFlightTests( - IntegrationTestFactory integrationTestFactory) : base(integrationTestFactory) + TestFactory integrationTestFactory) : base(integrationTestFactory) { } diff --git a/src/Services/Flight/tests/IntegrationTest/Flight/Features/GetAvailableFlightsTests.cs b/src/Services/Flight/tests/IntegrationTest/Flight/Features/GetAvailableFlightsTests.cs index 785d0dc..853ae12 100644 --- a/src/Services/Flight/tests/IntegrationTest/Flight/Features/GetAvailableFlightsTests.cs +++ b/src/Services/Flight/tests/IntegrationTest/Flight/Features/GetAvailableFlightsTests.cs @@ -1,6 +1,6 @@ using System.Linq; using System.Threading.Tasks; -using BuildingBlocks.TestBase.IntegrationTest; +using BuildingBlocks.TestBase; using Flight.Api; using Flight.Data; using Flight.Flights.Features.CreateFlight.Commands.V1.Reads; @@ -14,7 +14,7 @@ namespace Integration.Test.Flight.Features; public class GetAvailableFlightsTests : FlightIntegrationTestBase { public GetAvailableFlightsTests( - IntegrationTestFactory integrationTestFactory) : base(integrationTestFactory) + TestFactory integrationTestFactory) : base(integrationTestFactory) { } diff --git a/src/Services/Flight/tests/IntegrationTest/Flight/Features/GetFlightByIdTests.cs b/src/Services/Flight/tests/IntegrationTest/Flight/Features/GetFlightByIdTests.cs index 9886680..bf2bd27 100644 --- a/src/Services/Flight/tests/IntegrationTest/Flight/Features/GetFlightByIdTests.cs +++ b/src/Services/Flight/tests/IntegrationTest/Flight/Features/GetFlightByIdTests.cs @@ -1,5 +1,5 @@ using System.Threading.Tasks; -using BuildingBlocks.TestBase.IntegrationTest; +using BuildingBlocks.TestBase; using Flight; using Flight.Api; using Flight.Data; @@ -14,7 +14,7 @@ namespace Integration.Test.Flight.Features; public class GetFlightByIdTests : FlightIntegrationTestBase { public GetFlightByIdTests( - IntegrationTestFactory integrationTestFactory) : base(integrationTestFactory) + TestFactory integrationTestFactory) : base(integrationTestFactory) { } diff --git a/src/Services/Flight/tests/IntegrationTest/Flight/Features/UpdateFlightTests.cs b/src/Services/Flight/tests/IntegrationTest/Flight/Features/UpdateFlightTests.cs index 7b49d4d..e791194 100644 --- a/src/Services/Flight/tests/IntegrationTest/Flight/Features/UpdateFlightTests.cs +++ b/src/Services/Flight/tests/IntegrationTest/Flight/Features/UpdateFlightTests.cs @@ -1,6 +1,6 @@ using System.Threading.Tasks; using BuildingBlocks.Contracts.EventBus.Messages; -using BuildingBlocks.TestBase.IntegrationTest; +using BuildingBlocks.TestBase; using Flight.Api; using Flight.Data; using Flight.Flights.Features.UpdateFlight.Commands.V1.Reads; @@ -13,7 +13,7 @@ namespace Integration.Test.Flight.Features; public class UpdateFlightTests : FlightIntegrationTestBase { public UpdateFlightTests( - IntegrationTestFactory integrationTestFactory) : base(integrationTestFactory) + TestFactory integrationTestFactory) : base(integrationTestFactory) { } diff --git a/src/Services/Flight/tests/IntegrationTest/FlightIntegrationTestBase.cs b/src/Services/Flight/tests/IntegrationTest/FlightIntegrationTestBase.cs index 73a93b0..3d805e5 100644 --- a/src/Services/Flight/tests/IntegrationTest/FlightIntegrationTestBase.cs +++ b/src/Services/Flight/tests/IntegrationTest/FlightIntegrationTestBase.cs @@ -1,4 +1,4 @@ -using BuildingBlocks.TestBase.IntegrationTest; +using BuildingBlocks.TestBase; using Flight.Api; using Flight.Data; using Xunit; @@ -6,15 +6,15 @@ using Xunit; namespace Integration.Test; [Collection(IntegrationTestCollection.Name)] -public class FlightIntegrationTestBase: IntegrationTestBase +public class FlightIntegrationTestBase: TestBase { - public FlightIntegrationTestBase(IntegrationTestFactory integrationTestFixture) : base(integrationTestFixture) + public FlightIntegrationTestBase(TestFactory integrationTestFixture) : base(integrationTestFixture) { } } [CollectionDefinition(Name)] -public class IntegrationTestCollection : ICollectionFixture> +public class IntegrationTestCollection : ICollectionFixture> { public const string Name = "Flight Integration Test"; } diff --git a/src/Services/Flight/tests/IntegrationTest/Seat/Features/GetAvailableSeatsTests.cs b/src/Services/Flight/tests/IntegrationTest/Seat/Features/GetAvailableSeatsTests.cs index 34f2e50..7836376 100644 --- a/src/Services/Flight/tests/IntegrationTest/Seat/Features/GetAvailableSeatsTests.cs +++ b/src/Services/Flight/tests/IntegrationTest/Seat/Features/GetAvailableSeatsTests.cs @@ -1,5 +1,5 @@ using System.Threading.Tasks; -using BuildingBlocks.TestBase.IntegrationTest; +using BuildingBlocks.TestBase; using Flight; using Flight.Api; using Flight.Data; @@ -14,7 +14,7 @@ namespace Integration.Test.Seat.Features; public class GetAvailableSeatsTests : FlightIntegrationTestBase { public GetAvailableSeatsTests( - IntegrationTestFactory integrationTestFactory) : base(integrationTestFactory) + TestFactory integrationTestFactory) : base(integrationTestFactory) { } diff --git a/src/Services/Flight/tests/IntegrationTest/Seat/Features/ReserveSeatTests.cs b/src/Services/Flight/tests/IntegrationTest/Seat/Features/ReserveSeatTests.cs index 8d6aa84..9b806e5 100644 --- a/src/Services/Flight/tests/IntegrationTest/Seat/Features/ReserveSeatTests.cs +++ b/src/Services/Flight/tests/IntegrationTest/Seat/Features/ReserveSeatTests.cs @@ -1,5 +1,5 @@ using System.Threading.Tasks; -using BuildingBlocks.TestBase.IntegrationTest; +using BuildingBlocks.TestBase; using Flight; using Flight.Api; using Flight.Data; @@ -14,7 +14,7 @@ namespace Integration.Test.Seat.Features; public class ReserveSeatTests : FlightIntegrationTestBase { public ReserveSeatTests( - IntegrationTestFactory integrationTestFactory) : base(integrationTestFactory) + TestFactory integrationTestFactory) : base(integrationTestFactory) { } diff --git a/src/Services/Identity/src/Identity/Extensions/Infrastructure/ProblemDetailsExtensions.cs b/src/Services/Identity/src/Identity/Extensions/Infrastructure/ProblemDetailsExtensions.cs index 4fda59a..c2a4c2c 100644 --- a/src/Services/Identity/src/Identity/Extensions/Infrastructure/ProblemDetailsExtensions.cs +++ b/src/Services/Identity/src/Identity/Extensions/Infrastructure/ProblemDetailsExtensions.cs @@ -22,7 +22,7 @@ public static class ProblemDetailsExtensions }; x.Map(ex => new ProblemDetailsWithCode { - Title = "Application rule broken", + Title = ex.GetType().Name, Status = StatusCodes.Status409Conflict, Detail = ex.Message, Type = "https://somedomain/application-rule-validation-error" @@ -31,35 +31,35 @@ public static class ProblemDetailsExtensions // Exception will produce and returns from our FluentValidation RequestValidationBehavior x.Map(ex => new ProblemDetailsWithCode { - Title = "input validation rules broken", + Title = ex.GetType().Name, Status = (int)ex.StatusCode, Detail = ex.Message, Type = "https://somedomain/input-validation-rules-error" }); x.Map(ex => new ProblemDetailsWithCode { - Title = "bad request exception", + Title = ex.GetType().Name, Status = StatusCodes.Status400BadRequest, Detail = ex.Message, Type = "https://somedomain/bad-request-error" }); x.Map(ex => new ProblemDetailsWithCode { - Title = "not found exception", + Title = ex.GetType().Name, Status = StatusCodes.Status404NotFound, Detail = ex.Message, Type = "https://somedomain/not-found-error" }); x.Map(ex => new ProblemDetailsWithCode { - Title = "api server exception", + Title = ex.GetType().Name, Status = StatusCodes.Status500InternalServerError, Detail = ex.Message, Type = "https://somedomain/api-server-error" }); x.Map(ex => new ProblemDetailsWithCode { - Title = "application exception", + Title = ex.GetType().Name, Status = StatusCodes.Status400BadRequest, Detail = ex.Message, Type = "https://somedomain/application-error" diff --git a/src/Services/Identity/src/Identity/Identity/Features/RegisterNewUser/Endpoints/V1/RegisterNewUserEndpoint.cs b/src/Services/Identity/src/Identity/Identity/Features/RegisterNewUser/Endpoints/V1/RegisterNewUserEndpoint.cs index ccbe6c0..37b6b34 100644 --- a/src/Services/Identity/src/Identity/Identity/Features/RegisterNewUser/Endpoints/V1/RegisterNewUserEndpoint.cs +++ b/src/Services/Identity/src/Identity/Identity/Features/RegisterNewUser/Endpoints/V1/RegisterNewUserEndpoint.cs @@ -19,11 +19,11 @@ public class RegisterNewUserEndpoint : IMinimalEndpoint { endpoints.MapPost($"{EndpointConfig.BaseApiPath}/identity/register-user", RegisterNewUser) .WithTags("Identity") - .WithName("Register User") + .WithName("RegisterUser") .WithMetadata(new SwaggerOperationAttribute("Register User", "Register User")) .WithApiVersionSet(endpoints.NewApiVersionSet("Identity").Build()) .Produces() - .Produces(StatusCodes.Status201Created) + .Produces(StatusCodes.Status200OK) .Produces(StatusCodes.Status400BadRequest) .HasApiVersion(1.0); diff --git a/src/Services/Identity/tests/IntegrationTest/Identity/Features/RegisterNewUserTests.cs b/src/Services/Identity/tests/IntegrationTest/Identity/Features/RegisterNewUserTests.cs index 159e282..e0aa17e 100644 --- a/src/Services/Identity/tests/IntegrationTest/Identity/Features/RegisterNewUserTests.cs +++ b/src/Services/Identity/tests/IntegrationTest/Identity/Features/RegisterNewUserTests.cs @@ -1,6 +1,6 @@ using System.Threading.Tasks; using BuildingBlocks.Contracts.EventBus.Messages; -using BuildingBlocks.TestBase.IntegrationTest; +using BuildingBlocks.TestBase; using FluentAssertions; using Identity.Api; using Identity.Data; @@ -12,7 +12,7 @@ namespace Integration.Test.Identity.Features; public class RegisterNewUserTests : IdentityIntegrationTestBase { public RegisterNewUserTests( - IntegrationTestFactory integrationTestFactory) : base(integrationTestFactory) + TestFactory integrationTestFactory) : base(integrationTestFactory) { } diff --git a/src/Services/Identity/tests/IntegrationTest/IdentityIntegrationTestBase.cs b/src/Services/Identity/tests/IntegrationTest/IdentityIntegrationTestBase.cs index 4e73c48..8aaca45 100644 --- a/src/Services/Identity/tests/IntegrationTest/IdentityIntegrationTestBase.cs +++ b/src/Services/Identity/tests/IntegrationTest/IdentityIntegrationTestBase.cs @@ -1,4 +1,4 @@ -using BuildingBlocks.TestBase.IntegrationTest; +using BuildingBlocks.TestBase; using Identity.Api; using Identity.Data; using Xunit; @@ -6,16 +6,16 @@ using Xunit; namespace Integration.Test; [Collection(IntegrationTestCollection.Name)] -public class IdentityIntegrationTestBase: IntegrationTestBase +public class IdentityIntegrationTestBase: TestBase { - public IdentityIntegrationTestBase(IntegrationTestFactory integrationTestFactory) + public IdentityIntegrationTestBase(TestFactory integrationTestFactory) : base(integrationTestFactory) { } } [CollectionDefinition(Name)] -public class IntegrationTestCollection : ICollectionFixture> +public class IntegrationTestCollection : ICollectionFixture> { public const string Name = "Identity Integration Test"; } diff --git a/src/Services/Passenger/src/Passenger/Extensions/Infrastructure/ProblemDetailsExtensions.cs b/src/Services/Passenger/src/Passenger/Extensions/Infrastructure/ProblemDetailsExtensions.cs index b972bf0..3eb728b 100644 --- a/src/Services/Passenger/src/Passenger/Extensions/Infrastructure/ProblemDetailsExtensions.cs +++ b/src/Services/Passenger/src/Passenger/Extensions/Infrastructure/ProblemDetailsExtensions.cs @@ -21,7 +21,7 @@ public static class ProblemDetailsExtensions }; x.Map(ex => new ProblemDetailsWithCode { - Title = "Application rule broken", + Title = ex.GetType().Name, Status = StatusCodes.Status409Conflict, Detail = ex.Message, Type = "https://somedomain/application-rule-validation-error" @@ -30,35 +30,35 @@ public static class ProblemDetailsExtensions // Exception will produce and returns from our FluentValidation RequestValidationBehavior x.Map(ex => new ProblemDetailsWithCode { - Title = "input validation rules broken", + Title = ex.GetType().Name, Status = (int)ex.StatusCode, Detail = ex.Message, Type = "https://somedomain/input-validation-rules-error" }); x.Map(ex => new ProblemDetailsWithCode { - Title = "bad request exception", + Title = ex.GetType().Name, Status = StatusCodes.Status400BadRequest, Detail = ex.Message, Type = "https://somedomain/bad-request-error" }); x.Map(ex => new ProblemDetailsWithCode { - Title = "not found exception", + Title = ex.GetType().Name, Status = StatusCodes.Status404NotFound, Detail = ex.Message, Type = "https://somedomain/not-found-error" }); x.Map(ex => new ProblemDetailsWithCode { - Title = "api server exception", + Title = ex.GetType().Name, Status = StatusCodes.Status500InternalServerError, Detail = ex.Message, Type = "https://somedomain/api-server-error" }); x.Map(ex => new ProblemDetailsWithCode { - Title = "application exception", + Title = ex.GetType().Name, Status = StatusCodes.Status400BadRequest, Detail = ex.Message, Type = "https://somedomain/application-error" diff --git a/src/Services/Passenger/src/Passenger/Passengers/Features/CompleteRegisterPassenger/Endpoints/V1/CompleteRegisterPassengerEndpoint.cs b/src/Services/Passenger/src/Passenger/Passengers/Features/CompleteRegisterPassenger/Endpoints/V1/CompleteRegisterPassengerEndpoint.cs index 869e4fe..01c04d3 100644 --- a/src/Services/Passenger/src/Passenger/Passengers/Features/CompleteRegisterPassenger/Endpoints/V1/CompleteRegisterPassengerEndpoint.cs +++ b/src/Services/Passenger/src/Passenger/Passengers/Features/CompleteRegisterPassenger/Endpoints/V1/CompleteRegisterPassengerEndpoint.cs @@ -18,11 +18,11 @@ public class CompleteRegisterPassengerEndpoint : IMinimalEndpoint endpoints.MapPost($"{EndpointConfig.BaseApiPath}/passenger/complete-registration", CompleteRegisterPassenger) .RequireAuthorization() .WithTags("Passenger") - .WithName("Complete Register Passenger") + .WithName("CompleteRegisterPassenger") .WithMetadata(new SwaggerOperationAttribute("Complete Register Passenger", "Complete Register Passenger")) .WithApiVersionSet(endpoints.NewApiVersionSet("Passenger").Build()) .Produces() - .Produces(StatusCodes.Status201Created) + .Produces(StatusCodes.Status200OK) .Produces(StatusCodes.Status400BadRequest) .HasApiVersion(1.0); diff --git a/src/Services/Passenger/src/Passenger/Passengers/Features/GetPassengerById/Endpoints/V1/GetPassengerByIdEndpoint.cs b/src/Services/Passenger/src/Passenger/Passengers/Features/GetPassengerById/Endpoints/V1/GetPassengerByIdEndpoint.cs index 208269f..b0fddcc 100644 --- a/src/Services/Passenger/src/Passenger/Passengers/Features/GetPassengerById/Endpoints/V1/GetPassengerByIdEndpoint.cs +++ b/src/Services/Passenger/src/Passenger/Passengers/Features/GetPassengerById/Endpoints/V1/GetPassengerByIdEndpoint.cs @@ -17,7 +17,7 @@ public class GetPassengerByIdEndpoint : IMinimalEndpoint endpoints.MapGet($"{EndpointConfig.BaseApiPath}/passenger/{{id}}", GetById) .RequireAuthorization() .WithTags("Passenger") - .WithName("Get Passenger By Id") + .WithName("GetPassengerById") .WithMetadata(new SwaggerOperationAttribute("Get Passenger By Id", "Get Passenger By Id")) .WithApiVersionSet(endpoints.NewApiVersionSet("Passenger").Build()) .Produces() diff --git a/src/Services/Passenger/tests/IntegrationTest/Passenger/Features/CompleteRegisterPassengerTests.cs b/src/Services/Passenger/tests/IntegrationTest/Passenger/Features/CompleteRegisterPassengerTests.cs index eee63c8..59aad6a 100644 --- a/src/Services/Passenger/tests/IntegrationTest/Passenger/Features/CompleteRegisterPassengerTests.cs +++ b/src/Services/Passenger/tests/IntegrationTest/Passenger/Features/CompleteRegisterPassengerTests.cs @@ -1,6 +1,6 @@ using System.Threading.Tasks; using BuildingBlocks.Contracts.EventBus.Messages; -using BuildingBlocks.TestBase.IntegrationTest; +using BuildingBlocks.TestBase; using FluentAssertions; using Integration.Test.Fakes; using Passenger.Api; @@ -12,7 +12,7 @@ namespace Integration.Test.Passenger.Features; public class CompleteRegisterPassengerTests : PassengerIntegrationTestBase { public CompleteRegisterPassengerTests( - IntegrationTestFactory integrationTestFactory) : base(integrationTestFactory) + TestFactory integrationTestFactory) : base(integrationTestFactory) { } diff --git a/src/Services/Passenger/tests/IntegrationTest/Passenger/Features/GetPassengerByIdTests.cs b/src/Services/Passenger/tests/IntegrationTest/Passenger/Features/GetPassengerByIdTests.cs index dde9ae7..95d194d 100644 --- a/src/Services/Passenger/tests/IntegrationTest/Passenger/Features/GetPassengerByIdTests.cs +++ b/src/Services/Passenger/tests/IntegrationTest/Passenger/Features/GetPassengerByIdTests.cs @@ -1,5 +1,5 @@ using System.Threading.Tasks; -using BuildingBlocks.TestBase.IntegrationTest; +using BuildingBlocks.TestBase; using FluentAssertions; using Integration.Test.Fakes; using Passenger; @@ -13,7 +13,7 @@ namespace Integration.Test.Passenger.Features; public class GetPassengerByIdTests : PassengerIntegrationTestBase { public GetPassengerByIdTests( - IntegrationTestFactory integrationTestFactory) : base(integrationTestFactory) + TestFactory integrationTestFactory) : base(integrationTestFactory) { } diff --git a/src/Services/Passenger/tests/IntegrationTest/PassengerIntegrationTestBase.cs b/src/Services/Passenger/tests/IntegrationTest/PassengerIntegrationTestBase.cs index 9effed9..23609a1 100644 --- a/src/Services/Passenger/tests/IntegrationTest/PassengerIntegrationTestBase.cs +++ b/src/Services/Passenger/tests/IntegrationTest/PassengerIntegrationTestBase.cs @@ -1,4 +1,4 @@ -using BuildingBlocks.TestBase.IntegrationTest; +using BuildingBlocks.TestBase; using Passenger.Api; using Passenger.Data; using Xunit; @@ -6,16 +6,16 @@ using Xunit; namespace Integration.Test; [Collection(IntegrationTestCollection.Name)] -public class PassengerIntegrationTestBase: IntegrationTestBase +public class PassengerIntegrationTestBase: TestBase { - public PassengerIntegrationTestBase(IntegrationTestFactory integrationTestFactory) + public PassengerIntegrationTestBase(TestFactory integrationTestFactory) : base(integrationTestFactory) { } } [CollectionDefinition(Name)] -public class IntegrationTestCollection : ICollectionFixture> +public class IntegrationTestCollection : ICollectionFixture> { public const string Name = "Passenger Integration Test"; }